ftprestart.c
上传用户:zibowangxu
上传日期:2007-01-04
资源大小:331k
文件大小:8k
源码类别:

Ftp客户端

开发平台:

Unix_Linux

  1. /****************************************************************************  
  2.  
  3.   Copyright (c) 1999 WU-FTPD Development Group.  
  4.   All rights reserved.
  5.   
  6.   Portions Copyright (c) 1980, 1985, 1988, 1989, 1990, 1991, 1993, 1994
  7.     The Regents of the University of California.
  8.   Portions Copyright (c) 1993, 1994 Washington University in Saint Louis.
  9.   Portions Copyright (c) 1996, 1998 Berkeley Software Design, Inc.
  10.   Portions Copyright (c) 1989 Massachusetts Institute of Technology.
  11.   Portions Copyright (c) 1998 Sendmail, Inc.
  12.   Portions Copyright (c) 1983, 1995, 1996, 1997 Eric P.  Allman.
  13.   Portions Copyright (c) 1997 by Stan Barber.
  14.   Portions Copyright (c) 1997 by Kent Landfield.
  15.   Portions Copyright (c) 1991, 1992, 1993, 1994, 1995, 1996, 1997
  16.     Free Software Foundation, Inc.  
  17.  
  18.   Use and distribution of this software and its source code are governed 
  19.   by the terms and conditions of the WU-FTPD Software License ("LICENSE").
  20.  
  21.   If you did not receive a copy of the license, it may be obtained online
  22.   at http://www.wu-ftpd.org/license.html.
  23.  
  24.   $Id: ftprestart.c,v 1.6 1999/09/19 19:21:24 wuftpd Exp $
  25.  
  26. ****************************************************************************/
  27. /* ftprestart
  28.    **
  29.    ** removes the ftpd shutdown files.
  30.    **
  31.    **  In the previous versions of the wu-ftpd server it was recommended to 
  32.    **  create a link in order for shutdown to work properly for real and 
  33.    **  anonymous user, e.g.  If you use ftpshut, it will create a message 
  34.    **  file at the location specified in the ftpaccess shutdown directive.
  35.    **  ln -s /etc/shutmsg  ~ftp/etc/shutmsg 
  36.    **  
  37.    **  When ftp service is to be restarted after an ftpshut, the shutdown 
  38.    **  message files must be removed. This program reads the ftpaccess
  39.    **  file and finds the location of the system shutdown file.  It
  40.    **  then proceeds to construct a path to the anonymous ftp area with
  41.    **  information found in the "ftp" account.  If virtual ftp servers
  42.    **  are enabled, the shutdown message files within those directories 
  43.    **  are also removed.
  44.    ** 
  45.    **  Initial Author: Kent Landfield
  46.  */
  47. #include "config.h"
  48. #include <errno.h>
  49. #include <stdio.h>
  50. #include <string.h>
  51. #include <ctype.h>
  52. #include <sys/stat.h>
  53. #include <sys/param.h>
  54. #include <pwd.h>
  55. #include "pathnames.h"
  56. char *msgfiles[1024];
  57. int numfiles = 0;
  58. #ifdef VIRTUAL
  59. int read_servers_line(FILE *, char *, char *);
  60. #endif
  61. void print_copyright(void);
  62. static int newfile(char *fpath)
  63. {
  64.     int i;
  65.     int fnd;
  66.     /* 
  67.        ** Check to see if the message file path has already been
  68.        ** seen. If so then there is no need to create it again.
  69.      */
  70.     fnd = 0;
  71.     for (i = 0; i < numfiles; i++) {
  72. if (strcmp(msgfiles[i], fpath) == 0) {
  73.     fnd = 1;
  74.     break;
  75. }
  76.     }
  77.     if (!fnd) {
  78. msgfiles[numfiles++] = strdup(fpath);
  79. return (1);
  80.     }
  81.     return (0);
  82. }
  83. static int remove_shutdown_file(char *path)
  84. {
  85.     struct stat stbuf;
  86.     int rc = 1; /* guilty until proven innocent */
  87.     fprintf(stderr, "ftprestart: %s ", path);
  88.     if (stat(path, &stbuf) == 0) {
  89. if ((rc = unlink(path)) == 0)
  90.     fprintf(stderr, "removed.n");
  91. else
  92.     perror(path);
  93.     }
  94.     else
  95. fprintf(stderr, "does not exist.n");
  96.     return (rc);
  97. }
  98. int main(int argc, char **argv)
  99. {
  100.     int c;
  101.     char *p;
  102.     char *cp = NULL;
  103.     char linebuf[BUFSIZ];
  104.     char shutmsg[256];
  105.     char anonpath[BUFSIZ];
  106.     FILE *accessfile;
  107.     struct passwd *pw;
  108. #if defined(VIRTUAL)
  109.     FILE *svrfp;
  110.     char *sp;
  111.     char hostaddress[32];
  112.     char root[MAXPATHLEN];
  113.     char configdir[MAXPATHLEN];
  114.     char accesspath[MAXPATHLEN];
  115.     char altmsgpath[MAXPATHLEN];
  116.     struct stat finfo;
  117. #endif
  118.     if (argc > 1) {
  119. while ((c = getopt(argc, argv, "V")) != EOF) {
  120.     switch (c) {
  121.     case 'V':
  122. print_copyright();
  123. exit(0);
  124.     default:
  125. fprintf(stderr, "usage: %s [-V]n", argv[0]);
  126. exit(1);
  127.     }
  128. }
  129.     }
  130.     if ((accessfile = fopen(_PATH_FTPACCESS, "r")) == NULL) {
  131. if (errno != ENOENT)
  132.     perror("ftprestart: could not open() access file");
  133. return (1);
  134.     }
  135.     /* 
  136.        ** Search the access file for the 'shutdown' directive.
  137.      */
  138.     while (fgets(linebuf, BUFSIZ, accessfile) != NULL) {
  139. if (strncasecmp(linebuf, "shutdown", 8) == 0) {
  140.     (void) strtok(linebuf, " t");
  141.     cp = strncpy(shutmsg, strtok(NULL, " t"), sizeof(shutmsg));
  142.     shutmsg[sizeof(shutmsg) - 1] = '';
  143.     if ((p = strchr(cp, 'n')) != NULL)
  144. *p = '';
  145. }
  146.     }
  147.     if (cp == NULL) {
  148. fprintf(stderr, "No shutdown file defined in ftpaccess file.n");
  149. fclose(accessfile);
  150. return (1);
  151.     }
  152.     msgfiles[numfiles++] = shutmsg;
  153.     /*
  154.        ** Get the location of the anonymous ftp area and check
  155.        ** to see if there is a file shutdown file there as well. 
  156.        ** If so, remove it.
  157.      */
  158.     if ((pw = getpwnam("ftp")) != NULL) {
  159. sprintf(anonpath, "%s%s", pw->pw_dir, shutmsg);
  160. if (newfile(anonpath))
  161.     (void) remove_shutdown_file(anonpath);
  162.     }
  163. #ifdef VIRTUAL
  164.     /*
  165.        ** Search the access file for virtual ftp servers.
  166.        ** If found, check if there are links/shutdown
  167.        ** message files files in the virtual server areas.
  168.        ** If so, remove them.
  169.      */
  170.     rewind(accessfile);
  171.     while (fgets(linebuf, sizeof(linebuf) - 1, accessfile) != NULL) {
  172. if (strncasecmp(linebuf, "virtual", 7) == 0) {
  173.     if ((p = strstr(linebuf, "root")) != NULL) {
  174. p += 4;
  175. if ((cp = strchr(linebuf, 'n')) != NULL)
  176.     *cp = '';
  177. /* skip to the path */
  178. while (*p && isspace(*p))
  179.     p++;
  180. cp = p;
  181. while (*p && isalnum(*p))
  182.     p++;
  183. sprintf(altmsgpath, "%s%s", cp, shutmsg);
  184. if (newfile(altmsgpath))
  185.     (void) remove_shutdown_file(altmsgpath);
  186.     }
  187. }
  188.     }
  189.     /*
  190.        ** Need to deal with the access files at the virtual domain directory
  191.        ** locations specified in the ftpservers file.
  192.      */
  193.     if ((svrfp = fopen(_PATH_FTPSERVERS, "r")) != NULL) {
  194. while (read_servers_line(svrfp, hostaddress, configdir) == 1) {
  195.     /* get rid of any trailing slash */
  196.     sp = configdir + (strlen(configdir) - 1);
  197.     if (*sp == '/')
  198. *sp = '';
  199.     /*
  200.        ** check to see that a valid directory value was
  201.        ** supplied and not something such as "INTERNAL"
  202.        **
  203.        ** It is valid to have a string such as "INTERNAL" in the
  204.        ** ftpservers entry. This is not an error. Silently ignore it.
  205.      */
  206.     if ((stat(configdir, &finfo) == 0) &&
  207. ((finfo.st_mode & S_IFMT) == S_IFDIR))
  208. sprintf(accesspath, "%s/ftpaccess", configdir);
  209.     else
  210. continue;
  211.     sprintf(accesspath, "%s/ftpaccess", configdir);
  212.     (void) fclose(accessfile);
  213.     if ((accessfile = fopen(accesspath, "r")) == NULL) {
  214. if (errno != ENOENT) {
  215.     fprintf(stderr, "%s: could not open %s accessfilen",
  216.     argv[0], accesspath);
  217.     continue;
  218. }
  219.     }
  220.     /* need to find the root path */
  221.     while (fgets(linebuf, sizeof(linebuf) - 1, accessfile) != NULL) {
  222. if ((sp = strstr(linebuf, "root")) != NULL) {
  223.     if ((cp = strchr(sp, 'n')) != NULL)
  224. *cp = ''; /* strip newline */
  225.     sp += 4; /* skip past "root" keyword */
  226.     while (*sp && isspace(*sp)) /* skip whitespace to path */
  227. sp++;
  228.     cp = sp;
  229.     while (*sp && !isspace(*sp))
  230. sp++;
  231.     *sp = ''; /* truncate blanks, comments etc. */
  232.     strcpy(root, cp);
  233.     break;
  234. }
  235.     }
  236.     rewind(accessfile);
  237.     /* need to find the shutdown message file path */
  238.     while (fgets(linebuf, sizeof(linebuf) - 1, accessfile) != NULL) {
  239. if ((sp = strstr(linebuf, "shutdown")) != NULL) {
  240.     if ((cp = strchr(sp, 'n')) != NULL)
  241. *cp = ''; /* strip newline */
  242.     sp += 8; /* skip past "root" keyword */
  243.     while (*sp && isspace(*sp)) /* skip whitespace to path */
  244. sp++;
  245.     cp = sp;
  246.     while (*sp && !isspace(*sp))
  247. sp++;
  248.     *sp = ''; /* truncate blanks, comments etc. */
  249.     break;
  250. }
  251.     }
  252.     /*
  253.        ** check to make sure the admin hasn't specified 
  254.        ** a complete path in the 'shutdown' directive.
  255.      */
  256.     if ((sp = strstr(cp, root)) == NULL)
  257. sprintf(altmsgpath, "%s%s", root, cp);
  258.     if (newfile(altmsgpath))
  259. (void) remove_shutdown_file(altmsgpath);
  260. }
  261. fclose(svrfp);
  262.     }
  263. #endif
  264.     fclose(accessfile);
  265.     /*
  266.        ** Time to remove the system wide shutdown file.
  267.      */
  268.     return (remove_shutdown_file(shutmsg));
  269. }