Annotation of 43BSD/contrib/nntp/server/netaux.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char    *sccsid = "@(#)netaux.c 1.3     (Berkeley) 3/12/86";
                      3: #endif
                      4: 
                      5: /*
                      6:  * Routines to deal with network stuff for
                      7:  * stand-alone version of server.
                      8:  */
                      9: 
                     10: #include "common.h"
                     11: #include <sys/socket.h>
                     12: #include <netinet/in.h>
                     13: #include <netdb.h>
                     14: #include <sys/ioctl.h>
                     15: #include <sys/time.h>
                     16: #include <signal.h>
                     17: 
                     18: #ifdef ALONE
                     19: 
                     20: 
                     21: /*
                     22:  * disassoc -- disassociate user's terminal from this
                     23:  * process.  Closes all file descriptors, except
                     24:  * the control socket.
                     25:  *
                     26:  *     Parameters:     None.
                     27:  *
                     28:  *     Returns:        Nothing.
                     29:  *
                     30:  *     Side effects:   Disassociates this process from
                     31:  *                     a terminal; closes file descriptors.
                     32:  */
                     33: 
                     34: disassoc()
                     35: {
                     36:        register int    i;
                     37: 
                     38:        if (fork())
                     39:                exit(0);
                     40: 
                     41:        for (i = 0; i < 10; i++)
                     42:                (void) close(i);
                     43: 
                     44:        i = open("/dev/tty", O_RDWR);
                     45:        if (i >= 0) {
                     46:                ioctl(i, TIOCNOTTY, 0);
                     47:                (void) close(i);
                     48:        }
                     49: }
                     50: 
                     51: 
                     52: /*
                     53:  * get_socket -- create a socket bound to the appropriate
                     54:  *     port number.
                     55:  *
                     56:  *     Parameters:     None.
                     57:  *
                     58:  *     Returns:        Socket bound to correct address.
                     59:  *
                     60:  *     Side effects:   None.
                     61:  *
                     62:  *     Errors:         Syslogd, cause aboriton.
                     63:  */
                     64: 
                     65: get_socket()
                     66: {
                     67:        int                     s;
                     68:        struct sockaddr_in      sin;
                     69:        struct servent          *sp;
                     70: 
                     71:        sp = getservbyname("nntp", "tcp");
                     72:        if (sp == NULL) {
                     73:                syslog(LOG_ERR, "get_socket: tcp/nntp, unknown service.");
                     74:                exit(1);
                     75:        }
                     76: 
                     77:        bzero((char *) &sin, sizeof (sin));
                     78:        sin.sin_family = AF_INET;
                     79:        sin.sin_addr.s_addr = htonl(INADDR_ANY);
                     80:        sin.sin_port = sp->s_port;
                     81: 
                     82:        s = socket(AF_INET, SOCK_STREAM, 0);
                     83:        if (s < 0) {
                     84:                syslog(LOG_ERR, "get_socket: socket: %m");
                     85:                exit(1);
                     86:        }
                     87: 
                     88:        if (bind(s, (struct sockaddr *) &sin, sizeof(sin)) < 0) {
                     89:                syslog(LOG_ERR, "get_socket: bind: %m");
                     90:                exit(1);
                     91:        }
                     92: 
                     93:        return (s);
                     94: }
                     95: 
                     96: /*
                     97:  * make_stdio -- make a given socket be our standard input
                     98:  *     and output.
                     99:  *
                    100:  *     Parameters:     "sockt" is the socket we want to
                    101:  *                     make be file descriptors 0 and 1.
                    102:  *
                    103:  *     Returns:        Nothing.
                    104:  *
                    105:  *     Side effects:   None.
                    106:  */
                    107: 
                    108: make_stdio(sockt)
                    109: int    sockt;
                    110: {
                    111:        int     ttyd, i;
                    112: 
                    113:        (void) dup2(sockt, 0);
                    114:        (void) close(sockt);
                    115:        (void) dup2(0, 1);
                    116:        for (i = getdtablesize(); --i > 2; )
                    117:                (void) close(i);
                    118:        ttyd = open("/dev/tty", O_RDWR);
                    119:        if (ttyd >= 0) {
                    120:                ioctl(ttyd, TIOCNOTTY, 0);
                    121:                (void) close(ttyd);
                    122:        }
                    123: }
                    124: 
                    125: /*
                    126:  * set_timer -- set up the interval timer so that
                    127:  *     the active file is read in every so often.
                    128:  *
                    129:  *     Parameters:     None.
                    130:  *
                    131:  *     Returns:        Nothing.
                    132:  *
                    133:  *     Side effects:   Sets interval timer to READINTVL seconds.
                    134:  *                     Sets SIGALRM to call read_again.
                    135:  */
                    136: 
                    137: set_timer()
                    138: {
                    139:        struct itimerval        new, old;
                    140:        extern int              read_again();
                    141: 
                    142:        (void) signal(SIGALRM, read_again);
                    143: 
                    144:        new.it_value.tv_sec = READINTVL;
                    145:        new.it_value.tv_usec = 0;
                    146:        new.it_interval.tv_sec = READINTVL;
                    147:        new.it_interval.tv_usec = 0;
                    148:        old.it_value.tv_sec = 0;
                    149:        old.it_value.tv_usec = 0;
                    150:        old.it_interval.tv_sec = 0;
                    151:        old.it_interval.tv_usec = 0;
                    152: 
                    153:        if (setitimer(ITIMER_REAL, &new, &old) < 0) {
                    154:                syslog(LOG_ERR, "set_timer: setitimer: %m\n");
                    155:                exit(1);
                    156:        }
                    157: }
                    158: 
                    159: 
                    160: /*
                    161:  * read_again -- (maybe) read in the active file again,
                    162:  *     if it's changed since the last time we checked.
                    163:  *
                    164:  *     Parameters:     None (called by interrupt).
                    165:  *
                    166:  *     Returns:        Nothing.
                    167:  *
                    168:  *     Side effects:   May change "num_groups" and "group_array".
                    169:  */
                    170: 
                    171: read_again()
                    172: {
                    173:        static long     last_mtime;     /* Last time active file was changed */
                    174:        struct stat     statbuf;
                    175: 
                    176:        if (stat(ACTIVE_FILE, &statbuf) < 0)
                    177:                return;
                    178: 
                    179:        if (statbuf.st_mtime != last_mtime) {
                    180:                last_mtime = statbuf.st_mtime;
                    181:                num_groups = read_groups();
                    182:        }
                    183: }
                    184: 
                    185: 
                    186: /*
                    187:  * reaper -- reap children who are ready to die.
                    188:  *     Called by signal.
                    189:  *
                    190:  *     Parameters:     None.
                    191:  *
                    192:  *     Returns:        Nothing.
                    193:  *
                    194:  *     Side effects:   None.
                    195:  */
                    196: 
                    197: reaper()
                    198: {
                    199:        union wait      status;
                    200: 
                    201:        while (wait3(&status, WNOHANG, (struct rusage *)0) > 0)
                    202:                ;
                    203: }
                    204: 
                    205: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.