This is ftpcount.c in view mode; [Download] [Up]
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <syslog.h>
#include <time.h>
#include <ctype.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/file.h>
#include <sys/param.h>
#include "pathnames.h"
#include "extensions.h"
typedef int pid_t;
/*************************************************************************/
/* FUNCTION : parse_time */
/* PURPOSE : Check a single valid-time-string against the current time */
/* and return whether or not a match occurs. */
/* ARGUMENTS : a pointer to the time-string */
/*************************************************************************/
int
parsetime(whattime)
char *whattime;
{
static char *days[] = { "Su", "Mo", "Tu", "We", "Th", "Fr", "Sa", "Wk" };
long clock;
struct tm *curtime;
int wday, start, stop, ltime, validday, loop, match;
(void) time(&clock);
curtime = localtime(&clock);
wday = curtime->tm_wday;
validday = 0;
match = 1;
while (match && isalpha(*whattime) && isupper(*whattime)) {
match = 0;
for (loop = 0; loop < 8; loop++) {
if (strncmp(days[loop], whattime, 2) == NULL) {
whattime += 2;
match = 1;
if ((wday == loop) | ((loop == 7) && wday && (wday < 6)))
validday = 1;
}
}
}
if (strncmp(whattime, "Any", 3) == NULL) {
validday = 1;
whattime += 3;
}
if (!validday) return(0);
if (sscanf(whattime, "%d-%d", &start, &stop) == 2) {
ltime = curtime->tm_min + 100 * curtime->tm_hour;
if ((start < stop) && ((ltime > start) && ltime < stop)) return(1);
if ((start > stop) && ((ltime > start) || ltime < stop)) return(1);
} else return(1);
return(0);
}
/*************************************************************************/
/* FUNCTION : validtime */
/* PURPOSE : Break apart a set of valid time-strings and pass them to */
/* parse_time, returning whether or not ANY matches occurred */
/* ARGUMENTS : a pointer to the time-string */
/*************************************************************************/
int
validtime(ptr)
char *ptr;
{
char *nextptr;
int good;
while (1) {
nextptr = strchr(ptr, '|');
if (strchr(ptr, '|') == NULL) return(parsetime(ptr));
*nextptr = '\0';
good = parsetime(ptr);
*nextptr++ = '|'; /* gotta restore the | or things get skipped! */
if (good) return(1);
ptr = nextptr;
}
}
acl_getlimit(aclbuf, class)
char *aclbuf, *class;
{
char *crptr,
*ptr,
linebuf[1024];
int limit;
while (*aclbuf != NULL) {
if (strncasecmp(aclbuf, "limit", 5) == 0) {
for (crptr = aclbuf; *crptr++ != '\n'; );
*--crptr = NULL;
strcpy(linebuf, aclbuf);
*crptr = '\n';
(void) strtok(linebuf, " \t"); /* returns "limit" */
if (strcmp(class, strtok(NULL, " \t")) == 0) {
limit = atoi(strtok(NULL, " \t")); /* returns limit <n> */
if ((ptr = strtok(NULL, " \t")) && validtime(ptr))
return(limit);
}
}
while (*aclbuf && *aclbuf++ != '\n');
}
return(0);
}
acl_countusers(class)
char *class;
{
int pidfd,
count,
stat,
which;
char pidfile[1024];
pid_t buf[MAXUSERS];
sprintf(pidfile, _PATH_PIDNAMES, class);
pidfd = open(pidfile, O_RDONLY, 0644);
if (pidfd == -1) {
printf("error opening pid file (%s): %s\n", pidfile,
strerror(errno));
return(0);
}
lseek(pidfd, 0, L_SET);
count = 0;
if (read(pidfd, buf, sizeof(buf)) == sizeof(buf)) {
for (which = 0; which < MAXUSERS; which++)
if (buf[which]) {
stat = kill (buf[which], SIGCONT);
if (((stat == -1) && (errno == EPERM)) || !stat) count++;
}
}
flock(pidfd, LOCK_UN);
close(pidfd);
return(count);
}
main(argc, argv)
int argc;
char *argv[];
{
FILE *accessfile, *pidfile;
char class[80],
linebuf[1024],
*aclbuf,
*myaclbuf,
*crptr;
int limit;
struct stat finfo;
if ((accessfile = fopen(_PATH_FTPACCESS, "r")) == NULL) {
if (errno != ENOENT) perror("ftpcount: could not open() access file");
exit(1);
}
if (stat(_PATH_FTPACCESS, &finfo)) {
perror("ftpcount: could not stat() access file");
exit(1);
}
if (finfo.st_size == 0) {
printf("ftpcount: no service classes defined, no usage count kept\n");
exit(0);
} else {
if (!(aclbuf = 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, "class", 5) == 0) {
for (crptr = myaclbuf; *crptr++ != '\n'; );
*--crptr = NULL;
strcpy(linebuf, myaclbuf);
*crptr = '\n';
(void) strtok(linebuf, " \t"); /* returns "class" */
strcpy(class, strtok(NULL, " \t")); /* returns class name */
limit = acl_getlimit(myaclbuf, class, NULL);
printf("Service class %-20.20s - %3d users (%3d maximum)\n", class,
acl_countusers(class), limit);
}
while (*myaclbuf && *myaclbuf++ != '\n');
}
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.