|
|
1.1 ! root 1: /* $Header: xnscourierd.c,v 2.0 85/11/21 07:21:56 jqj Exp $ */ ! 2: ! 3: /* ! 4: * daemon for XNS Courier. Listens on SPP socket 5 for requests for ! 5: * Courier connections. Forks one process per SPP connection to service ! 6: * the Courier requests ! 7: */ ! 8: ! 9: /* ! 10: * $Log: xnscourierd.c,v $ ! 11: * Revision 2.0 85/11/21 07:21:56 jqj ! 12: * 4.3BSD standard release ! 13: * ! 14: * Revision 1.1 85/11/21 06:06:52 jqj ! 15: * Initial revision ! 16: * ! 17: */ ! 18: ! 19: #include <stdio.h> /* for lots of things */ ! 20: #include <errno.h> /* for EINTR */ ! 21: #include <signal.h> /* for signal() */ ! 22: #include <sys/wait.h> /* for struct wait and WNOHANG */ ! 23: #include <sgtty.h> ! 24: #include <sys/types.h> /* for lots of things, e.g. xn.h */ ! 25: #include <sys/socket.h> /* for SOCK_STREAM, AF_NS, etc. */ ! 26: #include <netns/ns.h> /* for sockaddr_ns, etc. */ ! 27: #include <netns/sp.h> ! 28: #include <xnscourier/courier.h> /* for lots of things */ ! 29: #include <xnscourier/realcourierconnection.h> /* for CourierConnection */ ! 30: ! 31: struct sockaddr_ns here, dest; ! 32: ! 33: int CourierServerDebuggingFlag = 0; ! 34: ! 35: ! 36: /* ! 37: * Message stream handle. ! 38: */ ! 39: CourierConnection *_serverConnection = 0; ! 40: Unspecified tid; /* transaction ID */ ! 41: ! 42: ! 43: static void ! 44: reapchild() ! 45: { ! 46: union wait status; ! 47: ! 48: while (wait3(&status, WNOHANG, 0) > 0) ! 49: ; ! 50: } ! 51: ! 52: main(argc, argv) ! 53: int argc; ! 54: char *argv[]; ! 55: { ! 56: int s, pid; ! 57: extern int errno; ! 58: ! 59: here.sns_family = AF_NS; ! 60: here.sns_addr.x_port = htons(IDPPORT_COURIER); ! 61: ! 62: #ifndef DEBUG ! 63: if (fork()) ! 64: exit(0); ! 65: for (s = 0; s < 10; s++) ! 66: (void) close(s); ! 67: (void) open("/", 0); ! 68: (void) dup2(0, 1); ! 69: (void) dup2(0, 2); ! 70: s = open("/dev/tty", 2); ! 71: if (s > 0) { ! 72: ioctl(s, TIOCNOTTY, 0); ! 73: close(s); ! 74: } ! 75: #endif ! 76: while ((s = socket(AF_NS, SOCK_SEQPACKET, 0)) < 0) { ! 77: perror("xnscourierd: socket"); ! 78: sleep(5); ! 79: } ! 80: while (bind(s, &here, sizeof here) < 0) { ! 81: perror("xnscourierd: bind"); ! 82: sleep(5); ! 83: } ! 84: signal(SIGCHLD, reapchild); ! 85: listen(s, 10); ! 86: for (;;) { ! 87: int s2, fromlen = sizeof(struct sockaddr_ns); ! 88: /* int padbefore[100]; */ ! 89: struct sockaddr_ns from; ! 90: /* int padafter[100]; */ ! 91: ! 92: s2 = accept(s, (caddr_t)&from, &fromlen); ! 93: if (s2 < 0) { ! 94: if (errno == EINTR) ! 95: continue; ! 96: perror("xnscourierd: accept"); ! 97: sleep(1); ! 98: continue; ! 99: } ! 100: #ifndef DEBUGDBX ! 101: if ((pid = fork()) < 0) { ! 102: perror("xnscourierd: Out of processes"); ! 103: sleep(5); ! 104: } ! 105: else if (pid == 0) { ! 106: /* child */ ! 107: signal(SIGCHLD, SIG_DFL); ! 108: close(s); /* don't keep accepting */ ! 109: doit(s2, &from); ! 110: /*NOTREACHED*/ ! 111: } ! 112: #else ! 113: signal(SIGCHLD, SIG_DFL); ! 114: doit(s2, &from); ! 115: #endif ! 116: close(s2); ! 117: } ! 118: /*NOTREACHED*/ ! 119: } ! 120: ! 121: static CourierConnection connblock; ! 122: ! 123: /* ! 124: * f is the socket on which we have gotten an SPP connection. ! 125: * who is the sockaddr_ns for the other end. ! 126: */ ! 127: doit(f, who) ! 128: int f; ! 129: struct sockaddr_ns *who; ! 130: { ! 131: LongCardinal programnum; ! 132: Cardinal versionnum; ! 133: int skipcount; ! 134: Unspecified skippedwords[8]; ! 135: Unspecified *bp; ! 136: static Cardinal ourversion = COURIERVERSION; ! 137: ! 138: /* set up the CourierConnection data */ ! 139: _serverConnection = &connblock; ! 140: _serverConnection->fd = f; ! 141: _serverConnection->state = wantversion; ! 142: _serverConnection->bdtstate = wantdata; ! 143: /* send our version number */ ! 144: bp = skippedwords; ! 145: bp += externalize_Cardinal(&ourversion, bp); ! 146: bp += externalize_Cardinal(&ourversion, bp); ! 147: CourierWrite(_serverConnection, (bp-skippedwords), skippedwords, ! 148: 0, (Unspecified*) NULL); ! 149: /* read and process a connection message */ ! 150: for (;;) { ! 151: skipcount = LookAheadCallMsg(&programnum, &versionnum, ! 152: skippedwords); ! 153: if (skipcount < 0) fatal("connection timed out"); ! 154: #ifdef DEBUG ! 155: fprintf(stderr,"Chaining to %d(%d). Skipcount =%d\n", ! 156: programnum, versionnum, skipcount); ! 157: #endif ! 158: ExecCourierProgram(programnum, versionnum, skipcount, ! 159: skippedwords); ! 160: } ! 161: } ! 162: ! 163: ! 164: fatal(msg) ! 165: char *msg; ! 166: { ! 167: (void) fprintf(stderr, "xnscourierd: %s.\n", msg); ! 168: exit(1); ! 169: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.