ftpshut.c
上传用户:pycemail
上传日期:2007-01-04
资源大小:329k
文件大小:4k
源码类别:

Ftp客户端

开发平台:

Unix_Linux

  1. /*
  2.  * ProFTPD - FTP server daemon
  3.  * Copyright (c) 1997, 1998 Public Flood Software
  4.  *
  5.  * This program is free software; you can redistribute it and/or modify
  6.  * it under the terms of the GNU General Public License as published by
  7.  * the Free Software Foundation; either version 2 of the License, or
  8.  * (at your option) any later version.
  9.  *
  10.  * This program is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  * GNU General Public License for more details.
  14.  *
  15.  * You should have received a copy of the GNU General Public License
  16.  * along with this program; if not, write to the Free Software
  17.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307, USA.
  18.  */
  19. /* Simply utility to create the proftpd shutdown message file, allowing
  20.  * an admin to configure the shutdown, deny, disc and messages.
  21.  *
  22.  * Usage: ftpshut [ -l min ] [ -d min ] time [ warning-message ... ]
  23.  */
  24. #include "conf.h"
  25. static void show_usage(char *progname)
  26. {
  27.   printf("usage: %s [ -l min ] [ -d min ] time [ warning-message ... ]n",
  28.          progname);
  29.   exit(1);
  30. }
  31. static int isnumeric(char *str)
  32. {
  33.   while(str && isspace(*str))
  34.     str++;
  35.   
  36.   if(!str || !*str)
  37.     return 0;
  38.   
  39.   for(; str && *str; str++) {
  40.     if(!isdigit(*str))
  41.       return 0;
  42.   }
  43.   
  44.   return 1;
  45. }
  46. int main(int argc, char *argv[])
  47. {
  48.   int deny = 10,disc = 5,c;
  49.   FILE *outf;
  50.   char *shut,*msg,*progname = argv[0];
  51.   time_t now;
  52.   struct tm *tm;
  53.   int mn = 0,hr = 0;
  54.   opterr = 0;
  55.   while((c = getopt(argc,argv,"l:d:")) != -1) {
  56.     switch(c) {
  57.     case 'l':
  58.     case 'd':
  59.       if(!optarg) {
  60.         fprintf(stderr,"%s: -%c requires an argument.n", progname, c);
  61.         show_usage(progname);
  62.       }
  63.       if(!isnumeric(optarg)) {
  64. fprintf(stderr, "%s: -%c requires a numeric argument.n",
  65. progname, c);
  66. show_usage(progname);
  67.       }
  68.       
  69.       if(c == 'd')
  70. disc = atoi(optarg);
  71.       else if(c == 'l')
  72. deny = atoi(optarg);
  73.       
  74.       break;
  75.       
  76.     case '?':
  77.       fprintf(stderr,"%s: unknown option '%c'.n",progname,(char)optopt);
  78.       
  79.     case 'h':
  80.     default:
  81.       show_usage(progname);
  82.     }
  83.   }
  84.   /* everything left on the command line is the message */
  85.   if(optind >= argc)
  86.     show_usage(progname);
  87.   shut = argv[optind++];
  88.   if(optind < argc)
  89.     msg = argv[optind];
  90.   else
  91.     msg = "going down at %s";
  92.   time(&now);
  93.   tm = localtime(&now);
  94.   /* shut must be either 'now', '+number' or 'HHMM' */
  95.   if(strcmp(shut,"now") != 0) {
  96.     if(*shut == '+') {
  97.       shut++;
  98.       while(shut && *shut && isspace((UCHAR)*shut)) shut++;
  99.       if(!isnumeric(shut)) {
  100. fprintf(stderr, "%s: Invalid time interval specified.n", progname);
  101. show_usage(progname);
  102.       }
  103.       
  104.       now += (60 * atoi(shut));
  105.       tm = localtime(&now);
  106.     } else {
  107.       if((strlen(shut) != 4 && strlen(shut) != 2) || !isnumeric(shut)) {
  108. fprintf(stderr, "%s: Invalid time interval specified.n", progname);
  109. show_usage(progname);
  110.       }
  111.       if(strlen(shut) > 2) {
  112.         mn = atoi((shut + strlen(shut) - 2));
  113. if(mn > 59) {
  114.   fprintf(stderr, "%s: Invalid time interval specified.n",
  115.   progname);
  116.   show_usage(progname);
  117. }
  118.         *(shut + strlen(shut) - 2) = '';
  119.       }
  120.       hr = atoi(shut);
  121.       if(hr > 23) {
  122. fprintf(stderr, "%s: Invalid time interval specified.n",
  123. progname);
  124. show_usage(progname);
  125.       }
  126.       
  127.       if(hr < tm->tm_hour || (hr == tm->tm_hour && mn <= tm->tm_min)) {
  128.         now += 86400; /* one day forward */
  129.         tm = localtime(&now);
  130.       }
  131.       tm->tm_hour = hr;
  132.       tm->tm_min = mn;
  133.     }
  134.   }
  135.   umask(022);
  136.   if((outf = fopen(SHUTMSG_PATH,"w")) == NULL) {
  137.     fprintf(stderr,"%s: %s: %sn",progname,
  138.             SHUTMSG_PATH,strerror(errno));
  139.     exit(1);
  140.   }
  141.   fprintf(outf,"%d %d %d %d %d %d",
  142.           tm->tm_year+1900,tm->tm_mon,tm->tm_mday,tm->tm_hour,
  143.           tm->tm_min,tm->tm_sec);
  144.   fprintf(outf," %02d%02d %02d%02dn",
  145.           (deny / 60),(deny % 60),
  146.           (disc / 60),(disc % 60));
  147.   fprintf(outf,"%sn",msg);
  148.   fclose(outf);
  149.   return 0;
  150. }