|
|
1.1 root 1: #ifndef lint
2: static char *sccsid = "@(#)netaux.c 1.8 (Berkeley) 7/17/87";
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: * disassociate this process from the invoker's terminal.
23: * Close all file descriptors, and then open 0, 1, and 2 to
24: * somewhere bogus (i.e., "/", O_RDONLY). This way we will know
25: * that stdin/out/err will at least be claimed.
26: *
27: * Parameters: None.
28: *
29: * Returns: Nothing.
30: *
31: * Side effects: Disassociates this process from
32: * a terminal; closes file descriptors;
33: * fd 0-2 opened as O_RDONLY to /.
34: */
35:
36: disassoc()
37: {
38: register int i;
39:
40: if (fork())
41: exit(0);
42:
43: for (i = 0; i < 10; i++)
44: (void) close(i);
45:
46: i = open("/dev/tty", O_RDWR);
47: if (i >= 0) {
48: ioctl(i, TIOCNOTTY, 0);
49: (void) close(i);
50: }
51:
52: i = open("/", O_RDONLY);
53: if (i >= 0) {
54: if (i != 0) { /* should never happen */
55: (void) dup2(i, 0);
56: (void) close(i);
57: }
58: (void) dup2(0, 1);
59: (void) dup2(1, 2);
60: }
61: }
62:
63:
64: /*
65: * get_socket -- create a socket bound to the appropriate
66: * port number.
67: *
68: * Parameters: None.
69: *
70: * Returns: Socket bound to correct address.
71: *
72: * Side effects: None.
73: *
74: * Errors: Syslogd, cause aboriton.
75: */
76:
77: get_socket()
78: {
79: int s;
80: struct sockaddr_in sin;
81: struct servent *sp;
82:
83: sp = getservbyname("nntp", "tcp");
84: if (sp == NULL) {
85: #ifdef SYSLOG
86: syslog(LOG_ERR, "get_socket: tcp/nntp, unknown service.");
87: #endif
88: exit(1);
89: }
90:
91: bzero((char *) &sin, sizeof (sin));
92: sin.sin_family = AF_INET;
93: sin.sin_addr.s_addr = htonl(INADDR_ANY);
94: sin.sin_port = sp->s_port;
95:
96: s = socket(AF_INET, SOCK_STREAM, 0);
97: if (s < 0) {
98: #ifdef SYSLOG
99: syslog(LOG_ERR, "get_socket: socket: %m");
100: #endif
101: exit(1);
102: }
103:
104: if (bind(s, (struct sockaddr *) &sin, sizeof(sin)) < 0) {
105: #ifdef SYSLOG
106: syslog(LOG_ERR, "get_socket: bind: %m");
107: #endif
108: exit(1);
109: }
110:
111: return (s);
112: }
113:
114: /*
115: * make_stdio -- make a given socket be our standard input
116: * and output.
117: *
118: * Parameters: "sockt" is the socket we want to
119: * be file descriptors 0, 1, and 2.
120: *
121: * Returns: Nothing.
122: *
123: * Side effects: None.
124: */
125:
126: make_stdio(sockt)
127: int sockt;
128: {
129: if (sockt != 0) {
130: (void) dup2(sockt, 0);
131: (void) close(sockt);
132: }
133: (void) dup2(0, 1);
134: (void) dup2(1, 2);
135: }
136:
137: /*
138: * set_timer -- set up the interval timer so that
139: * the active file is read in every so often.
140: *
141: * Parameters: None.
142: *
143: * Returns: Nothing.
144: *
145: * Side effects: Sets interval timer to READINTVL seconds.
146: * Sets SIGALRM to call read_again.
147: */
148:
149: set_timer()
150: {
151: struct itimerval new, old;
152: extern int read_again();
153:
154: (void) signal(SIGALRM, read_again);
155:
156: new.it_value.tv_sec = READINTVL;
157: new.it_value.tv_usec = 0;
158: new.it_interval.tv_sec = READINTVL;
159: new.it_interval.tv_usec = 0;
160: old.it_value.tv_sec = 0;
161: old.it_value.tv_usec = 0;
162: old.it_interval.tv_sec = 0;
163: old.it_interval.tv_usec = 0;
164:
165: if (setitimer(ITIMER_REAL, &new, &old) < 0) {
166: #ifdef SYSLOG
167: syslog(LOG_ERR, "set_timer: setitimer: %m\n");
168: #endif
169: exit(1);
170: }
171: }
172:
173:
174: /*
175: * read_again -- (maybe) read in the active file again,
176: * if it's changed since the last time we checked.
177: *
178: * Parameters: None (called by interrupt).
179: *
180: * Returns: Nothing.
181: *
182: * Side effects: May change "num_groups" and "group_array".
183: */
184:
185: read_again()
186: {
187: static long last_mtime; /* Last time active file was changed */
188: struct stat statbuf;
189:
190: if (stat(activefile, &statbuf) < 0)
191: return;
192:
193: if (statbuf.st_mtime != last_mtime) {
194: last_mtime = statbuf.st_mtime;
195: num_groups = read_groups();
196: }
197: }
198:
199:
200: /*
201: * reaper -- reap children who are ready to die.
202: * Called by signal.
203: *
204: * Parameters: None.
205: *
206: * Returns: Nothing.
207: *
208: * Side effects: None.
209: */
210:
211: reaper()
212: {
213: union wait status;
214:
215: while (wait3(&status, WNOHANG, (struct rusage *)0) > 0)
216: ;
217: }
218:
219: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.