|
|
1.1 ! root 1: /* acserver1.c - generic server dispatch */ ! 2: ! 3: #ifndef lint ! 4: static char *rcsid = "$Header: /f/osi/acsap/RCS/acserver1.c,v 7.2 90/07/09 14:30:45 mrose Exp $"; ! 5: #endif ! 6: ! 7: /* ! 8: * $Header: /f/osi/acsap/RCS/acserver1.c,v 7.2 90/07/09 14:30:45 mrose Exp $ ! 9: * ! 10: * ! 11: * $Log: acserver1.c,v $ ! 12: * Revision 7.2 90/07/09 14:30:45 mrose ! 13: * sync ! 14: * ! 15: * Revision 7.1 90/02/19 13:07:05 mrose ! 16: * update ! 17: * ! 18: * Revision 7.0 89/11/23 21:22:02 mrose ! 19: * Release 6.0 ! 20: * ! 21: */ ! 22: ! 23: /* ! 24: * NOTICE ! 25: * ! 26: * Acquisition, use, and distribution of this module and related ! 27: * materials are subject to the restrictions of a license agreement. ! 28: * Consult the Preface in the User's Manual for the full terms of ! 29: * this agreement. ! 30: * ! 31: */ ! 32: ! 33: ! 34: /* LINTLIBRARY */ ! 35: ! 36: #include <signal.h> ! 37: #include "psap.h" ! 38: #include "tsap.h" ! 39: #include <sys/ioctl.h> ! 40: #ifdef BSD42 ! 41: #include <sys/file.h> ! 42: #endif ! 43: #ifdef SYS5 ! 44: #include <fcntl.h> ! 45: #endif ! 46: #include "tailor.h" ! 47: ! 48: /* */ ! 49: ! 50: int isodeserver (argc, argv, aei, initfnx, workfnx, losefnx, td) ! 51: int argc; ! 52: char **argv; ! 53: AEI aei; ! 54: IFP initfnx, ! 55: workfnx, ! 56: losefnx; ! 57: struct TSAPdisconnect *td; ! 58: { ! 59: int fd, ! 60: nfds, ! 61: vecp; ! 62: fd_set ifds, ! 63: mask; ! 64: char *vec[4]; ! 65: ! 66: isodetailor (NULLCP, 0); ! 67: ! 68: nfds = 0; ! 69: FD_ZERO (&mask); ! 70: ! 71: if (argc > 1) { ! 72: if ((fd = (*initfnx) (argc, argv)) == NOTOK) ! 73: return tsaplose (td, DR_NETWORK, NULLCP, "initialization failed"); ! 74: ! 75: nfds = fd + 1; ! 76: FD_SET (fd, &mask); ! 77: } ! 78: else { ! 79: struct PSAPaddr *pa; ! 80: ! 81: if ((pa = aei2addr (aei)) == NULLPA) ! 82: return tsaplose (td, DR_ADDRESS, NULLCP, ! 83: "address translation failed"); ! 84: ! 85: if (TNetListen (&pa -> pa_addr.sa_addr, td) == NOTOK) ! 86: return NOTOK; ! 87: ! 88: if (!isatty (2)) { ! 89: int i; ! 90: ! 91: for (i = 0; i < 5; i++) { ! 92: switch (fork ()) { ! 93: case NOTOK: ! 94: sleep (5); ! 95: continue; ! 96: ! 97: case OK: ! 98: break; ! 99: ! 100: default: ! 101: _exit (0); ! 102: } ! 103: break; ! 104: } ! 105: ! 106: (void) chdir ("/"); ! 107: ! 108: if ((fd = open ("/dev/null", O_RDWR)) != NOTOK) { ! 109: if (fd != 0) ! 110: (void) dup2 (fd, 0), (void) close (fd); ! 111: (void) dup2 (0, 1); ! 112: (void) dup2 (0, 2); ! 113: } ! 114: ! 115: #ifdef SETSID ! 116: (void) setsid (); ! 117: #endif ! 118: #ifdef TIOCNOTTY ! 119: if ((fd = open ("/dev/tty", O_RDWR)) != NOTOK) { ! 120: (void) ioctl (fd, TIOCNOTTY, NULLCP); ! 121: (void) close (fd); ! 122: } ! 123: #else ! 124: #ifdef SYS5 ! 125: (void) setpgrp (); ! 126: (void) signal (SIGINT, SIG_IGN); ! 127: (void) signal (SIGQUIT, SIG_IGN); ! 128: #endif ! 129: #endif ! 130: isodexport (NULLCP); /* re-initialize logfiles */ ! 131: } ! 132: } ! 133: ! 134: for (;;) { ! 135: ifds = mask; ! 136: if (TNetAccept (&vecp, vec, nfds, &ifds, NULLFD, NULLFD, NOTOK, td) ! 137: == NOTOK) { ! 138: (void) (*losefnx) (td); ! 139: continue; ! 140: } ! 141: ! 142: if (vecp > 0 && (fd = (*initfnx) (vecp, vec)) != NOTOK) { ! 143: if (fd >= nfds) ! 144: nfds = fd + 1; ! 145: FD_SET (fd, &mask); ! 146: } ! 147: ! 148: for (fd = 0; fd < nfds; fd++) ! 149: if (FD_ISSET (fd, &ifds)) { ! 150: if (workfnx == NULLIFP) { ! 151: (void) TNetClose (NULLTA, td); ! 152: return tsaplose (td, DR_OPERATION, NULLCP, ! 153: "no worker routine for connected fd"); ! 154: } ! 155: ! 156: if ((*workfnx) (fd) == NOTOK) { ! 157: if (nfds == fd + 1) ! 158: nfds--; ! 159: FD_CLR (fd, &mask); ! 160: if (argc > 1) { ! 161: int xd; ! 162: ! 163: for (xd = 0; xd < nfds; xd++) ! 164: if (FD_ISSET (xd, &mask)) ! 165: break; ! 166: if (xd >= nfds) ! 167: return OK; ! 168: } ! 169: } ! 170: } ! 171: } ! 172: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.