1 /*
   2  * Copyright 2003 Sun Microsystems, Inc.  All rights reserved.
   3  * Use is subject to license terms.
   4  */
   5 
   6 #pragma ident   "%Z%%M% %I%     %E% SMI"
   7 
   8 /****************************************************************************  
   9  
  10   Copyright (c) 1999,2000 WU-FTPD Development Group.  
  11   All rights reserved.
  12   
  13   Portions Copyright (c) 1980, 1985, 1988, 1989, 1990, 1991, 1993, 1994
  14     The Regents of the University of California.
  15   Portions Copyright (c) 1993, 1994 Washington University in Saint Louis.
  16   Portions Copyright (c) 1996, 1998 Berkeley Software Design, Inc.
  17   Portions Copyright (c) 1989 Massachusetts Institute of Technology.
  18   Portions Copyright (c) 1998 Sendmail, Inc.
  19   Portions Copyright (c) 1983, 1995, 1996, 1997 Eric P.  Allman.
  20   Portions Copyright (c) 1997 by Stan Barber.
  21   Portions Copyright (c) 1997 by Kent Landfield.
  22   Portions Copyright (c) 1991, 1992, 1993, 1994, 1995, 1996, 1997
  23     Free Software Foundation, Inc.  
  24  
  25   Use and distribution of this software and its source code are governed 
  26   by the terms and conditions of the WU-FTPD Software License ("LICENSE").
  27  
  28   If you did not receive a copy of the license, it may be obtained online
  29   at http://www.wu-ftpd.org/license.html.
  30  
  31   $Id: ckconfig.c,v 1.10 2000/07/01 18:17:38 wuftpd Exp $
  32  
  33 ****************************************************************************/
  34 #include "config.h"
  35 #ifndef HOST_ACCESS
  36 #define  HOST_ACCESS  1
  37 #endif
  38 #include <stdio.h>
  39 #include <string.h>
  40 #include <sys/types.h>
  41 #include <sys/param.h>
  42 #include <sys/stat.h>
  43 #include "pathnames.h"
  44 #if defined(VIRTUAL) && defined(INET6)
  45 #include <netinet/in.h>
  46 #endif
  47 
  48 /* Prototypes */
  49 #ifdef VIRTUAL
  50 extern int read_servers_line(FILE *, char *, size_t, char *, size_t);
  51 #endif
  52 void print_copyright(void);
  53 
  54 int main(int argc, char **argv)
  55 {
  56     struct stat sbuf;
  57     char *sp;
  58     char buf[1024];
  59     int c;
  60 
  61 #ifdef VIRTUAL
  62     FILE *svrfp;
  63     char accesspath[MAXPATHLEN];
  64 #ifdef INET6
  65     char hostaddress[INET6_ADDRSTRLEN];
  66 #else
  67     char hostaddress[32];
  68 #endif
  69 #endif
  70 
  71     if (argc > 1) {
  72         while ((c = getopt(argc, argv, "V")) != EOF) {
  73             switch (c) {
  74             case 'V':
  75                 print_copyright();
  76                 exit(0);
  77             default:
  78                 fprintf(stderr, "usage: %s [-V]\n", argv[0]);
  79                 exit(1);
  80             }
  81         }
  82     }
  83 
  84     /* _PATH_FTPUSERS   */
  85     fprintf(stdout, "Checking _PATH_FTPUSERS :: %s\n", _PATH_FTPUSERS);
  86     if ((stat(_PATH_FTPUSERS, &sbuf)) < 0)
  87         printf("I can't find it... look in doc/examples for an example.\n");
  88     else
  89         printf("ok.\n");
  90 
  91 #ifdef VIRTUAL
  92 
  93     /* _PATH_FTPSERVERS  */
  94     fprintf(stdout, "\nChecking _PATH_FTPSERVERS :: %s\n", _PATH_FTPSERVERS);
  95     if ((stat(_PATH_FTPSERVERS, &sbuf)) < 0)
  96         printf("I can't find it... look in doc/examples for an example.\n");
  97     else {
  98         printf("ok.\n");
  99         /* Need to check the access files specified in the ftpservers file. */
 100         if ((svrfp = fopen(_PATH_FTPSERVERS, "r")) == NULL)
 101             printf("I can't open it! check permissions and run ckconfig again.\n");
 102         else {
 103             while (read_servers_line(svrfp, hostaddress, sizeof(hostaddress),
 104                    accesspath, sizeof(accesspath)) == 1) {
 105                 fprintf(stderr, "\nChecking accessfile for %s :: %s\n", hostaddress, accesspath);
 106                 /*
 107                    ** check to see that a valid directory value was
 108                    ** supplied and not something such as "INTERNAL"
 109                    **
 110                    ** It is valid to have a string such as "INTERNAL" in the
 111                    ** ftpservers entry. This is not an error. Silently ignore it.
 112                  */
 113                 if (stat(accesspath, &sbuf) == 0) {
 114                     if ((sbuf.st_mode & S_IFMT) == S_IFDIR)
 115                         printf("ok.\n");
 116                     else {
 117                         printf("Check servers file and make sure only directories are listed...\n");
 118                         printf("look in doc/examples for an example.\n");
 119                     }
 120                 }
 121                 else
 122                     printf("Internal ftpaccess usage specified... ok.\n");
 123             }
 124             fclose(svrfp);
 125         }
 126     }
 127 #endif
 128 
 129     /* _PATH_FTPACCESS  */
 130     fprintf(stdout, "\nChecking _PATH_FTPACCESS :: %s\n", _PATH_FTPACCESS);
 131     if ((stat(_PATH_FTPACCESS, &sbuf)) < 0)
 132         printf("I can't find it... look in doc/examples for an example.\n");
 133     else
 134         printf("ok.\n");
 135 
 136     /* _PATH_PIDNAMES   */
 137     fprintf(stdout, "\nChecking _PATH_PIDNAMES :: %s\n", _PATH_PIDNAMES);
 138     (void) strlcpy(buf, _PATH_PIDNAMES, sizeof(buf));
 139     sp = (char *) strrchr(buf, '/');
 140     *sp = '\0';
 141     if ((stat(buf, &sbuf)) < 0) {
 142         printf("I can't find it...\n");
 143         printf("You need to make this directory [%s] in order for\n", buf);
 144         printf("the limit and user count functions to work.\n");
 145     }
 146     else
 147         printf("ok.\n");
 148 
 149     /* _PATH_CVT        */
 150     fprintf(stdout, "\nChecking _PATH_CVT :: %s\n", _PATH_CVT);
 151     if ((stat(_PATH_CVT, &sbuf)) < 0)
 152         printf("I can't find it... look in doc/examples for an example.\n");
 153     else
 154         printf("ok.\n");
 155 
 156     /* _PATH_XFERLOG    */
 157     fprintf(stdout, "\nChecking _PATH_XFERLOG :: %s\n", _PATH_XFERLOG);
 158     if ((stat(_PATH_XFERLOG, &sbuf)) < 0) {
 159         printf("I can't find it... \n");
 160         printf("Don't worry, it will be created automatically by the\n");
 161         printf("server if you do transfer logging.\n");
 162     }
 163     else
 164         printf("ok.\n");
 165 
 166     /* _PATH_PRIVATE    */
 167     fprintf(stdout, "\nChecking _PATH_PRIVATE :: %s\n", _PATH_PRIVATE);
 168     if ((stat(_PATH_PRIVATE, &sbuf)) < 0) {
 169         printf("I can't find it... look in doc/examples for an example.\n");
 170         printf("You only need this if you want SITE GROUP and SITE GPASS\n");
 171         printf("functionality. If you do, you will need to edit the example.\n");
 172     }
 173     else
 174         printf("ok.\n");
 175 
 176     /* _PATH_FTPHOSTS   */
 177     fprintf(stdout, "\nChecking _PATH_FTPHOSTS :: %s\n", _PATH_FTPHOSTS);
 178     if ((stat(_PATH_FTPHOSTS, &sbuf)) < 0) {
 179         printf("I can't find it... look in doc/examples for an example.\n");
 180         printf("You only need this if you are using the HOST ACCESS features\n");
 181         printf("of the server.\n");
 182     }
 183     else
 184         printf("ok.\n");
 185     return (0);
 186 }