root/usr/src/cmd/bnu/uucheck.c
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

/*      Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
/*        All Rights Reserved   */

#define UUCHECK
int Uerrors = 0;        /* error count */

/* This unusual include (#include "permission.c") is done because
 * uucheck wants to use the global static variable in permission.c
 */

#include "uucp.h"
#include "permission.c"
#include "sysfiles.h"

/* These are here because uucpdefs.c is not used, and
 * some routines are referenced (never called within uucheck execution)
 * and not included.
 */

#define USAGE   "[-v] [-xNUM]"

int Debug=0;
int mkdirs(){ return (0); }
int canPath(){ return (0); }
char RemSpool[] = SPOOL; /* this is a dummy for chkpth() -- never used here */
char *Spool = SPOOL;
char *Pubdir = PUBDIR;
char *Bnptr;
char    Progname[NAMESIZE];
/* used for READANY and READSOME macros */
struct stat __s_;

/* This is stuff for uucheck */

struct tab
   {
    char *name;
    char *value;
   } tab[] =
   {
#ifdef  CORRUPTDIR
    "CORRUPT",  CORRUPTDIR,
#endif
    "LOGUUCP",  LOGUUCP,
    "LOGUUX",   LOGUUX,
    "LOGUUXQT", LOGUUXQT,
    "LOGCICO",  LOGCICO,
    "SEQDIR",   SEQDIR,
    "STATDIR",  STATDIR,
    "PERMISSIONS",      PERMISSIONS,
    "SYSTEMS",  SYSTEMS,
    "DEVICES",  DEVICES ,
    "DIALCODES",        DIALCODES,
    "DIALERS",  DIALERS,
#ifdef  USRSPOOLLOCKS
    "USRSPOOLLOCKS",    "/var/spool/locks",
#endif
#ifdef  NOSTRANGERS
    "NOSTRANGERS",      NOSTRANGERS,
#endif
    "LIMITS",   LIMITS, /* if not defined we'll stat NULL, it's not a bug */
    "XQTDIR",   XQTDIR,
    "WORKSPACE",        WORKSPACE,
    "admin directory",  ADMIN,
    NULL,
   };

extern char *nextarg();
int verbose = 0;        /* fsck-like verbosity */

int
main(argc, argv)
int argc;
char *argv[];
{
    struct stat statbuf;
    struct tab *tabptr;
    int i;

        (void) strcpy(Progname, "uucheck");
        while ((i = getopt(argc, argv, "vx:")) != EOF) {
                switch(i){

                case 'v':
                        verbose++;
                        break;

                case 'x':
                        Debug = atoi(optarg);
                        if (Debug <= 0)
                                Debug = 1;
#ifdef SMALL
                        fprintf(stderr,
                        "WARNING: uucheck built with SMALL flag defined -- no debug info available\n");
#endif /* SMALL */
                        break;

                default:
                        (void) fprintf(stderr, "\tusage: %s %s\n",
                            Progname, USAGE);
                        exit(1);
                }
        }
        if (argc != optind) {
                (void) fprintf(stderr, "\tusage: %s %s\n", Progname, USAGE);
                exit(1);
        }

    if (verbose) printf("*** uucheck:  Check Required Files and Directories\n");
    for (tabptr = tab; tabptr->name != NULL; tabptr++) {
        if (stat(tabptr->value, &statbuf) < 0) {
            fprintf(stderr, "%s - ", tabptr->name);
            perror(tabptr->value);
            Uerrors++;
        }
    }

    if (verbose) printf("*** uucheck:  Directories Check Complete\n\n");

    /* check the permissions file */

    if (verbose) printf("*** uucheck:  Check %s file\n", PERMISSIONS);
    Uerrors += checkPerm();
    if (verbose) printf("*** uucheck:  %s Check Complete\n\n", PERMISSIONS);

    return(Uerrors);
}

int
checkPerm ()
{
    int type;
    int error=0;
    char defaults[BUFSIZ];

    for (type=0; type<2; type++) {
        /* type = 0 for LOGNAME, 1 for MACHINE */

        if (verbose) printf("** %s \n\n",
            type == U_MACHINE
                ?"MACHINE PHASE (when we call or execute their uux requests)"
                :"LOGNAME PHASE (when they call us)" );

        Fp = fopen(PERMISSIONS, "r");
        if (Fp == NULL) {
                if (verbose) printf("can't open %s\n", PERMISSIONS);
                exit(1);
        }

        for (;;) {
            if (parse_tokens(_Flds, NULL) != 0) {
                fclose(Fp);
                break;
            }
            if (_Flds[type] == NULL)
                continue;

            /* XXX - need to reset defaults here */
            fillFlds();
            /* if no ReadPath set num to 1--Path already set */
            fillList(U_READPATH, _RPaths);
            fillList(U_WRITEPATH, _WPaths);
            fillList(U_NOREADPATH, _NoRPaths);
            fillList(U_NOWRITEPATH, _NoWPaths);
            if (_Flds[U_COMMANDS] == NULL) {
                strcpy(defaults, DEFAULTCMDS);
                _Flds[U_COMMANDS] = defaults;
            }
            fillList(U_COMMANDS, _Commands);
            error += outLine(type);
        }
    if (verbose) printf("\n");
    }
    return(error);
}

int
outLine(type)
int type;
{
        int i;
        char *p;
        char *arg, cmd[BUFSIZ];
        int error = 0;
        char myname[MAXBASENAME+1];

        if (_Flds[type][0] == 0)
            return(0);

        if (type == U_LOGNAME) { /* for LOGNAME */
            p = _Flds[U_LOGNAME];
            if (verbose) printf("When a system logs in as: ");
            while (*p != '\0') {
                p = nextarg(p, &arg);
                if (verbose)    printf("(%s) ", arg);
            }
            if (verbose) printf("\n");

            if (callBack()) {
                if (verbose) printf("\tWe will call them back.\n\n");
                return(0);
            }
        }
        else {  /* MACHINE */
            p = _Flds[U_MACHINE];
            if (verbose) printf("When we call system(s): ");
            while (*p != '\0') {
                p = nextarg(p, &arg);
                if (verbose) printf("(%s) ", arg);
            }
            if (verbose) printf("\n");

        }

        if (verbose) printf("\tWe %s allow them to request files.\n",
            requestOK()? "DO" : "DO NOT");

        if (type == U_LOGNAME) {
                if (verbose) printf("\tWe %s send files queued for them on this call.\n",
                    switchRole()? "WILL" : "WILL NOT");
        }

        if (verbose) printf("\tThey can send files to\n");
        if (_Flds[U_WRITEPATH] == NULL) {
            if (verbose) printf("\t    %s (DEFAULT)\n", Pubdir);
        }
        else {
            for (i=0; _WPaths[i] != NULL; i++)
                if (verbose) printf("\t    %s\n", _WPaths[i]);
        }

        if (_Flds[U_NOWRITEPATH] != NULL) {
            if (verbose) printf("\tExcept\n");
            for (i=0; _NoWPaths[i] != NULL; i++)
                if (verbose) printf("\t    %s\n", _NoWPaths[i]);
        }

        if (verbose) {
            if (noSpool())
                (void) printf("\tSent files will be created directly in the target directory.\n");
            else {
                (void) printf("\tSent files will be created in %s\n", SPOOL);
                (void) printf("\t before they are copied to the target directory.\n");
            }
        }

        if (requestOK()) {
            if (verbose) printf("\tThey can request files from\n");
            if (_Flds[U_READPATH] == NULL) {
                if (verbose) printf("\t    %s (DEFAULT)\n", Pubdir);
            }
            else {
                for (i=0; _RPaths[i] != NULL; i++)
                    if (verbose) printf("\t    %s\n", _RPaths[i]);
            }

            if (_Flds[U_NOREADPATH] != NULL) {
                if (verbose) printf("\tExcept\n");
                for (i=0; _NoRPaths[i] != NULL; i++)
                    if (verbose) printf("\t    %s\n", _NoRPaths[i]);
            }
        }

        myName(myname);
        if (verbose) printf("\tMyname for the conversation will be %s.\n",
            myname);
        if (verbose) printf("\tPUBDIR for the conversation will be %s.\n",
            Pubdir);

        if (verbose) printf("\n");

        if (type == U_MACHINE) {
            if (verbose) printf("Machine(s): ");
            p = _Flds[U_MACHINE];
            while (*p != '\0') {
                p = nextarg(p, &arg);
                if (verbose) printf("(%s) ", arg);
            }
            if (verbose) printf("\nCAN execute the following commands:\n");
            for (i=0; _Commands[i] != NULL; i++) {
                if (cmdOK(BASENAME(_Commands[i], '/'), cmd) == FALSE) {
                    if (verbose) printf("Software Error in permission.c\n");
                    error++;
                }
                if (verbose) printf("command (%s), fullname (%s)\n",
                    BASENAME(_Commands[i], '/'), cmd);
            }
            if (verbose) printf("\n");
        }

        return(error);
}

void
cleanup(s)
        int s;
{
        exit(s);
}