home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Meeting Pearls 3
/
Meeting_Pearls_III.iso
/
Pearls
/
tcp
/
Networking
/
TCP
/
Server
/
wu-ftpd
/
src
/
ftpshut.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-08-08
|
8KB
|
276 lines
/* Copyright (c) 1993, 1994 Washington University in Saint Louis
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met: 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer. 2.
* Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution. 3. All advertising
* materials mentioning features or use of this software must display the
* following acknowledgement: This product includes software developed by the
* Washington University in Saint Louis and its contributors. 4. Neither the
* name of the University nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific
* prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY WASHINGTON UNIVERSITY AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL WASHINGTON
* UNIVERSITY OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
/* ftpshut
* =======
* creates the ftpd shutdown file.
*/
#include "config.h"
#include <errno.h>
#include <pwd.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/file.h>
#include <sys/param.h>
#include "pathnames.h"
#define WIDTH 70
int denyoffset = 10; /* default deny time */
int discoffset = 5; /* default disc time */
char *message = "System shutdown at %s"; /* default message */
extern version[];
void
massage(char *buf)
{
char *sp = NULL;
char *ptr;
int i = 0;
int j = 0;
ptr = buf;
while (*ptr++ != '\0') {
++i;
/* if we have a space, keep track of where and at what "count" */
if (*ptr == ' ') {
sp = ptr;
j = i;
}
/* magic cookies... */
if (*ptr == '%') {
++ptr;
switch (*ptr) {
case 'r':
case 's':
case 'd':
case 'T':
i = i + 24;
break;
case '\n':
i = 0;
break;
case 'C':
case 'R':
case 'L':
case 'U':
i = i + 10;
break;
case 'M':
case 'N':
i = i + 3;
break;
case '\0':
return;
break;
default:
i = i + 1;
break;
}
}
/* break up the long lines... */
if ((i >= WIDTH) && (sp != NULL)) {
*sp = '\n';
sp = NULL;
i = i - j;
}
}
}
int
main(int argc, char **argv)
{
time_t c_time;
struct tm *tp;
char buf[BUFSIZ];
int c;
extern int optind;
extern char *optarg;
FILE *fp;
FILE *accessfile;
char *aclbuf,
*myaclbuf,
*crptr;
char *sp = NULL;
char linebuf[1024];
struct stat finfo;
int off = 0;
while ((c = getopt(argc, argv, "vl:d:")) != EOF) {
switch (c) {
case 'l':
denyoffset = atoi(optarg);
break;
case 'd':
discoffset = atoi(optarg);
break;
case 'v':
fprintf(stderr, "%s\n", version);
exit(0);
default:
fprintf(stderr,
"Usage: %s [-d min] [-l min] now [\"message\"]\n", argv[0]);
fprintf(stderr,
" %s [-d min] [-l min] +dd [\"message\"]\n", argv[0]);
fprintf(stderr,
" %s [-d min] [-l min] HHMM [\"message\"]\n", argv[0]);
fprintf(stderr,
" %s off\n", argv[0]);
exit(-1);
}
}
if ((accessfile = fopen(_PATH_FTPACCESS, "r")) == NULL) {
if (errno != ENOENT)
perror("ftpshut: could not open() access file");
exit(1);
}
if (stat(_PATH_FTPACCESS, &finfo)) {
perror("ftpshut: could not stat() access file");
exit(1);
}
if (finfo.st_size == 0) {
printf("ftpshut: no service shutdown path defined\n");
exit(0);
} else {
if (!(aclbuf = (char *) malloc(finfo.st_size + 1))) {
perror("ftpcount: could not malloc aclbuf");
exit(1);
}
fread(aclbuf, finfo.st_size, 1, accessfile);
*(aclbuf + finfo.st_size) = '\0';
}
myaclbuf = aclbuf;
while (*myaclbuf != NULL) {
if (strncasecmp(myaclbuf, "shutdown", 8) == 0) {
for (crptr = myaclbuf; *crptr++ != '\n';) ;
*--crptr = NULL;
strcpy(linebuf, myaclbuf);
*crptr = '\n';
(void) strtok(linebuf, " \t"); /* returns "shutdown" */
sp = strtok(NULL, " \t"); /* returns shutdown path */
}
while (*myaclbuf && *myaclbuf++ != '\n') ;
}
/* three cases
* -- now
* -- +ddd
* -- HHMM
*/
c = -1;
if (optind < argc) {
if (!strcasecmp(argv[optind], "off")) {
off = 1;
} else if (!strcasecmp(argv[optind], "now")) {
c_time = time(0);
tp = localtime(&c_time);
} else if ((*(argv[optind])) == '+') {
c_time = time(0);
c_time += 60 * atoi(++(argv[optind]));
tp = localtime(&c_time);
} else if ((c = atoi(argv[optind])) >= 0) {
c_time = time(0);
tp = localtime(&c_time);
tp->tm_hour = c / 100;
tp->tm_min = c % 100;
if ((tp->tm_hour > 23) || (tp->tm_min > 59)) {
fprintf(stderr, "Illegal time format.\n");
return(1);
}
}
}
if (c_time <= 0) {
fprintf(stderr, "Usage: %s [-d min] [-l min] now [\"message\"]\n",
argv[0]);
fprintf(stderr, " %s [-d min] [-l min] +dd [\"message\"]\n",
argv[0]);
fprintf(stderr, " %s [-d min] [-l min] HHMM [\"message\"]\n",
argv[0]);
fprintf(stderr, " %s off\n",
argv[0]);
return(1);
}
/* do we have a shutdown message? */
if (++optind < argc)
strcpy(buf, argv[optind++]);
else
strcpy(buf, message);
massage(buf);
if ( sp == NULL ) {
fprintf(stderr, "No shutdown file defined in ftpaccess file.\n");
return(1);
}
if (off) {
remove(sp);
} else {
if ( (fp = fopen(sp, "w")) == NULL ) {
perror("Couldn't open shutdown file");
return(1);
}
fprintf(fp, "%.4d %.2d %.2d %.2d %.2d %.4d %.4d\n",
(tp->tm_year) + 1900,
tp->tm_mon,
tp->tm_mday,
tp->tm_hour,
tp->tm_min,
denyoffset,
discoffset);
fprintf(fp, "%s\n", buf);
fclose(fp);
}
}