|
|
1.1 ! root 1: #include <sys/param.h> ! 2: #include <stdio.h> ! 3: #include <sys/filio.h> ! 4: #include <signal.h> ! 5: #include <ipc.h> ! 6: #include <libc.h> ! 7: #include <setjmp.h> ! 8: #include "defs.h" ! 9: ! 10: jmp_buf xyz; ! 11: ! 12: /* preeclared */ ! 13: void dodialin(); ! 14: ! 15: /* global */ ! 16: int pid; ! 17: int debug; ! 18: ! 19: /* imported */ ! 20: extern char *av0; ! 21: extern int net_announce(); ! 22: extern void net_accept(); ! 23: extern void net_reject(); ! 24: extern ipcinfo *net_listen(); ! 25: ! 26: /* take alarm */ ! 27: static int ! 28: ding() { ! 29: logevent("time out\n"); ! 30: longjmp(xyz, 1); ! 31: } ! 32: ! 33: /* loop on calls into the CPU */ ! 34: void ! 35: dodialin(mtpt, netname, param) ! 36: char *mtpt; ! 37: char *netname; ! 38: char *param; ! 39: { ! 40: int fd; ! 41: ipcinfo info; ! 42: ! 43: signal(SIGPIPE, SIG_IGN); ! 44: pid = getpid(); ! 45: ! 46: /* ! 47: * plug into network name space ! 48: */ ! 49: for(;;){ ! 50: info.name = netname; ! 51: info.user = getlogin(); ! 52: info.param = param; ! 53: info.rfd = info.cfd = -1; ! 54: ! 55: /* ! 56: * announce yourrself. alarm is for avoiding ! 57: * the single thread deadlock ! 58: */ ! 59: signal(SIGALRM, ding); ! 60: alarm(30); ! 61: if(setjmp(xyz)==0) ! 62: fd = net_announce(&info); ! 63: else ! 64: fd = -1; ! 65: alarm(0); ! 66: signal(SIGALRM, SIG_IGN); ! 67: if (fd>=0) ! 68: break; ! 69: ! 70: /* ! 71: * it didn't work, complain and try again ! 72: */ ! 73: logconsole("%s: can't announce to network as %s (%s)\n", ! 74: av0, netname, errstr); ! 75: sleep(60); ! 76: } ! 77: if (*info.machine) ! 78: netname = info.machine; ! 79: logconsole("%s: announced to network as %s\n", av0, netname); ! 80: ! 81: /* loop on requests */ ! 82: for(;;) { ! 83: ipcinfo *ip; ! 84: int rv; ! 85: static stretch newsrc; ! 86: static stretch newmyname; ! 87: ! 88: /* ! 89: * get a request from the network ! 90: */ ! 91: ip = net_listen(fd); ! 92: if (ip == NULL) { ! 93: logevent("broken listen (%s)\n", errstr); ! 94: break; ! 95: } ! 96: if(debug) ! 97: logevent("dialin: rcved\n"); ! 98: ! 99: /* ! 100: * be careful not to write on an unmounted file ! 101: */ ! 102: ip->flags |= IPC_CAREFUL; ! 103: ! 104: /* ! 105: * default service is login ! 106: */ ! 107: if (ip->name==NULL || *ip->name=='\0') ! 108: ip->name = "login"; ! 109: ! 110: /* ! 111: * tack network name onto requestor, requestee, and ! 112: * name of this service. ! 113: */ ! 114: _strcat(&newsrc, mtpt, "!", ip->machine); ! 115: ip->machine = newsrc.ptr; ! 116: _strcat(&newmyname, mtpt, "!", ip->myname); ! 117: ip->myname = newmyname.ptr; ! 118: ! 119: /* ! 120: * pass request to internal service provider. once ! 121: * again avoid internal single thread deadlock. ! 122: */ ! 123: if (ip->flags & IPC_CREAT) { ! 124: net_reject(ip, EINVAL, "bad request"); ! 125: logstatus("in", ip); ! 126: continue; ! 127: } ! 128: if(setjmp(xyz)==0){ ! 129: signal(SIGALRM, ding); ! 130: alarm(30); ! 131: rv = ipcdial(ip); ! 132: alarm(0); ! 133: } else { ! 134: /* here after timeout */ ! 135: rv = -1; ! 136: } ! 137: signal(SIGALRM, SIG_IGN); ! 138: if(debug) ! 139: logevent("dialin: passed\n"); ! 140: if (rv<0) { ! 141: net_reject(ip, errno, errstr); ! 142: logstatus("in", ip); ! 143: continue; ! 144: } else ! 145: close(rv); ! 146: ! 147: /* ! 148: * tell requestor that the connection was accepted ! 149: */ ! 150: errno = 0; errstr = ""; ! 151: logstatus("in", ip); ! 152: net_accept(ip); ! 153: } ! 154: close(fd); ! 155: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.