|
|
1.1 ! root 1: #include <sys/types.h> ! 2: #include <sys/ioctl.h> ! 3: #include <sys/stat.h> ! 4: #include <ipc.h> ! 5: #include "defs.h" ! 6: ! 7: /* exported */ ! 8: char *errstr; ! 9: cahr *ipcname; ! 10: ! 11: /* imports */ ! 12: extern int atoi(); ! 13: extern char *memchr(); ! 14: ! 15: /* local only */ ! 16: static int net[128]; ! 17: ! 18: extern int tcpdial(), tcpaccept(), tcpreject(); ! 19: ipcinfo *tcplisten(); ! 20: ! 21: static struct network{ ! 22: char *name; ! 23: int (*dial)(); ! 24: ipcinfo *(*listen)(); ! 25: int (*accept)(); ! 26: int (*reject)(); ! 27: } nets[] = { ! 28: #define TCP 0 ! 29: { "/cs/tcp", tcpdial, tcplisten, tcpaccept, tcpreject }, ! 30: { 0, 0, 0, 0, 0 } ! 31: }; ! 32: ! 33: /* ! 34: * announce or connect to a detination ! 35: */ ! 36: int ! 37: ipcdial(ip) ! 38: ipcinfo *ip; ! 39: { ! 40: int fd; ! 41: char name[128]; ! 42: char *field[3]; ! 43: struct network *np; ! 44: static char nipcname[128]; ! 45: ! 46: /* parse the name */ ! 47: strcpy(name, ip->name); ! 48: setfields("!"); ! 49: getfields(name, field, 3); ! 50: ! 51: /* action depends on network */ ! 52: for(np=nets; np->name; np++) ! 53: if (strcmp(field[0], np->name)==0) ! 54: break; ! 55: if (np->name) { ! 56: ip->net = net[fd] = np-nets; ! 57: fd = (*np->dial)(ip, field[1], field[2]); ! 58: sprintf(nipcname, "%s!%s", nets[ip->net].name, ipcname); ! 59: ipcname = nipcname; ! 60: } ! 61: ! 62: /* unknown network/service */ ! 63: return _ipcabort("not implemented", EIO, ip); ! 64: } ! 65: ! 66: /* ! 67: * plug into a name space ! 68: */ ! 69: int ! 70: ipccreat(name, param) ! 71: char *name; /* name being dialed */ ! 72: char *param; /* parameters for creation */ ! 73: { ! 74: int pfd[2]; ! 75: char *path=name; ! 76: ipcinfo info; ! 77: ! 78: /* remote creat */ ! 79: info.rfd = info.cfd = -1; ! 80: info.myname = info.user = info.machine = NULL; ! 81: info.uid = info.gid = -1; ! 82: info.name = name; ! 83: info.param = param; ! 84: info.flags = IPC_CREAT; ! 85: return ipcdial(&info); ! 86: } ! 87: ! 88: /* ! 89: * call up an announced service ! 90: */ ! 91: int ! 92: ipcopen(name, param) ! 93: char *name; /* name being dialed */ ! 94: char *param; /* parameters for dialer */ ! 95: { ! 96: ipcinfo info; ! 97: ! 98: info.rfd = info.cfd = -1; ! 99: info.myname = info.user = info.machine = NULL; ! 100: info.uid = info.gid = -1; ! 101: info.name = name; ! 102: info.param = param; ! 103: info.flags = IPC_OPEN; ! 104: return ipcdial(&info); ! 105: } ! 106: ! 107: /* ! 108: * set error number and string and return -1 ! 109: */ ! 110: int ! 111: _ipcabort(no, err, ip) ! 112: int no; ! 113: char *err; ! 114: ipcinfo *ip; ! 115: { ! 116: errstr = err; ! 117: errno = no; ! 118: return -1; ! 119: } ! 120: ! 121: /* ! 122: * listen for a connection ! 123: */ ! 124: ipcinfo * ! 125: ipclisten(fd) ! 126: int fd; ! 127: { ! 128: static ipcinfo info; ! 129: static char myname[128]; ! 130: static char machine[128]; ! 131: static char nipcname[128]; ! 132: ipcinfo *ip; ! 133: ! 134: info.rfd = info.cfd = -1; ! 135: info.myname = info.machine = ""; ! 136: info.user = "unknown"; ! 137: info.uid = info.gid = -1; ! 138: info.name = name; ! 139: info.param = param; ! 140: info.flags = IPC_CREAT; ! 141: ip = (*nets[net[fd]].listen)(fd, &info); ! 142: if(ip == NULL) ! 143: return(ip); ! 144: ip->net = net[fd]; ! 145: sprintf(myname, "%s!%s", nets[ip->net].name, ip->myname); ! 146: ip->myname = myname; ! 147: sprintf(machine, "%s!%s", nets[ip->net].name, ip->machine); ! 148: ip->machine = machine; ! 149: sprintf(nipcname, "%s!%s", nets[ip->net].name, ipcname); ! 150: ipcname = nipcname; ! 151: return(ip); ! 152: } ! 153: ! 154: /* ! 155: * Accept a connection. Close all except ip->cfd. ! 156: */ ! 157: int ! 158: ipcaccept(ip) ! 159: ipcinfo *ip; ! 160: { ! 161: return (*nets[ip->net].accept)(ip); ! 162: } ! 163: ! 164: /* ! 165: * Reject a connection. ! 166: */ ! 167: int ! 168: ipcreject(ip, no, str) ! 169: ipcinfo *ip; ! 170: int no; /* error number */ ! 171: char *str; /* error string */ ! 172: { ! 173: return (*nets[ip->net].reject)(ip, no, str); ! 174: _ipcabort(no, str, ip); ! 175: return 0; ! 176: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.