This is netaux.c in view mode; [Download] [Up]
#ifndef lint static char *sccsid = "@(#)$Header: netaux.c,v 1.14 91/02/10 13:59:20 sob Exp $"; #endif /* * Routines to deal with network stuff for * stand-alone version of server. */ #include "common.h" #include <sys/socket.h> #include <netinet/in.h> #ifndef EXCELAN #include <netdb.h> #endif not EXCELAN #include <sys/ioctl.h> #include <signal.h> #ifdef USG #include <time.h> #else not USG #include <sys/time.h> #endif USG #ifdef ALONE /* * disassociate this process from the invoker's terminal. * Close all file descriptors, and then open 0, 1, and 2 to * somewhere bogus (i.e., "/", O_RDONLY). This way we will know * that stdin/out/err will at least be claimed. * * Parameters: None. * * Returns: Nothing. * * Side effects: Disassociates this process from * a terminal; closes file descriptors; * fd 0-2 opened as O_RDONLY to /. */ disassoc() { register int i; #ifdef USG (void) signal(SIGTERM, SIG_IGN); (void) signal(SIGINT, SIG_IGN); (void) signal(SIGQUIT, SIG_IGN); #endif if (fork()) exit(0); for (i = 0; i < 10; i++) (void) close(i); #ifdef USG (void) open("/", 0); (void) dup2(0, 1); (void) dup2(0, 2); setpgrp(); umask(000); #else /* not USG */ i = open("/dev/tty", O_RDWR); if (i >= 0) { ioctl(i, TIOCNOTTY, 0); (void) close(i); } i = open("/", O_RDONLY); if (i >= 0) { if (i != 0) { /* should never happen */ (void) dup2(i, 0); (void) close(i); } (void) dup2(0, 1); (void) dup2(1, 2); } #endif /* not USG */ } /* * get_socket -- create a socket bound to the appropriate * port number. * * Parameters: None. * * Returns: Socket bound to correct address. * * Side effects: None. * * Errors: Syslogd, cause abortion. */ get_socket() { int s; struct sockaddr_in sin; #ifndef EXCELAN struct servent *sp; int on = 1; sp = getservbyname("nntp", "tcp"); if (sp == NULL) { #ifdef SYSLOG syslog(LOG_ERR, "get_socket: tcp/nntp, unknown service."); #endif exit(1); } #endif /* not EXCELAN */ bzero((char *) &sin, sizeof (sin)); sin.sin_family = AF_INET; sin.sin_addr.s_addr = htonl(INADDR_ANY); #ifndef EXCELAN sin.sin_port = sp->s_port; s = socket(AF_INET, SOCK_STREAM, 0); #else /* EXCELAN */ sin.sin_port = htons(IPPORT_NNTP); s = 3; /* WTF??? */ s = socket(SOCK_STREAM, (struct sockproto *)0, &sin, (SO_KEEPALIVE|SO_ACCEPTCONN)); #endif /* EXCELAN */ if (s < 0) { #ifdef EXCELAN sleep(5); return (-1); #else /* not EXCELAN */ #ifdef SYSLOG syslog(LOG_ERR, "get_socket: socket: %m"); #endif /* SYSLOG */ exit(1); #endif /* not EXCELAN */ } #ifndef EXCELAN #ifdef SO_REUSEADDR if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof (on)) < 0) perror("setsockopt - SO_REUSEADDR"); #endif /* SO_REUSEADDR */ if (bind(s, (struct sockaddr *) &sin, sizeof(sin)) < 0) { #ifdef SYSLOG syslog(LOG_ERR, "get_socket: bind: %m"); #endif exit(1); } #endif /* not EXCELAN */ return (s); } /* * make_stdio -- make a given socket be our standard input * and output. * * Parameters: "sockt" is the socket we want to * be file descriptors 0, 1, and 2. * * Returns: Nothing. * * Side effects: None. */ make_stdio(sockt) int sockt; { if (sockt != 0) { (void) dup2(sockt, 0); (void) close(sockt); } (void) dup2(0, 1); (void) dup2(1, 2); } /* * set_timer -- set up the interval timer so that * the active file is read in every so often. * * Parameters: None. * * Returns: Nothing. * * Side effects: Sets interval timer to READINTVL seconds. * Sets SIGALRM to call read_again. */ set_timer() { #ifndef USG struct itimerval new, old; #endif /* not USG */ extern int read_again(); (void) signal(SIGALRM, read_again); #ifdef USG alarm(READINTVL); #else /* not USG */ new.it_value.tv_sec = READINTVL; new.it_value.tv_usec = 0; new.it_interval.tv_sec = READINTVL; new.it_interval.tv_usec = 0; old.it_value.tv_sec = 0; old.it_value.tv_usec = 0; old.it_interval.tv_sec = 0; old.it_interval.tv_usec = 0; if (setitimer(ITIMER_REAL, &new, &old) < 0) { #ifdef SYSLOG syslog(LOG_ERR, "set_timer: setitimer: %m\n"); #endif SYSLOG exit(1); } #endif /* not USG */ } /* * read_again -- (maybe) read in the active file again, * if it's changed since the last time we checked. * * Parameters: None (called by interrupt). * * Returns: Nothing. * * Side effects: May change "num_groups" and "group_array". */ read_again() { static long last_mtime; /* Last time active file was changed */ struct stat statbuf; if (stat(activefile, &statbuf) < 0) return; if (statbuf.st_mtime != last_mtime) { last_mtime = statbuf.st_mtime; num_groups = read_groups(); } } /* * reaper -- reap children who are ready to die. * Called by signal. * * Parameters: None. * * Returns: Nothing. * * Side effects: None. */ reaper() { #ifndef USG union wait status; while (wait3(&status, WNOHANG, (struct rusage *)0) > 0) ; #endif /* not USG */ } #else /* not ALONE */ /* Kludge for greenhill's C compiler */ static netaux_greenkludge() { } #endif /* not ALONE */
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.