|
|
1.1 ! root 1: #include "stdio.h" ! 2: #include "tiuser.h" ! 3: #include "sys/fcntl.h" ! 4: #include "sys/stropts.h" ! 5: ! 6: /* ! 7: * s5sockbcon(): System V socket-bind-connect sequence ! 8: * ! 9: * Alan M Buckwalter 3-90 ! 10: * ! 11: * Mimic the BSD socket(), bind() and connect() sequence using ! 12: * System V TLI calls. ! 13: * ! 14: * In: IP Address (char *) ! 15: * Port Number (int) ! 16: * UNIX Device (char *) ! 17: * Out: Open File Descriptor or -1 on Failure ! 18: * ! 19: * Warning, there is a bug in the standard UTS Phase I inet_addr() ! 20: * library call that corrupts the passed string. Make sure ! 21: * this fix is installed on your system to avoid any nasty ! 22: * side affects from this routine. ! 23: */ ! 24: ! 25: #define MAXRETRY 10 ! 26: ! 27: s5sockbcon(add,port,dev) ! 28: char *add,*dev; ! 29: int port; ! 30: { ! 31: int netfd,i; ! 32: char addrs[20]; ! 33: struct t_call *callp; ! 34: struct netbuf addr; ! 35: static int stoa(); ! 36: static char *atos(); ! 37: extern int t_errno; ! 38: ! 39: sprintf(addrs,"\\x%08x%04x0000\0",inet_addr(add),port); ! 40: stoa(addrs,&addr); ! 41: ! 42: #ifdef DEBUG ! 43: fprintf(stderr,"%s - %d\n",atos(&addr),addr.len); ! 44: #endif ! 45: ! 46: /* open transport endpoint */ ! 47: if((netfd=t_open(dev,O_RDWR,NULL))<0) { ! 48: t_error("t_open"); ! 49: return(-1); ! 50: } ! 51: ! 52: /* bind default address */ ! 53: if(t_bind(netfd,NULL,NULL)<0) { ! 54: t_error("t_bind"); ! 55: return(-1); ! 56: } ! 57: ! 58: /* allocate call structure */ ! 59: if((callp=(struct t_call *)t_alloc(netfd,T_CALL,0))==NULL) { ! 60: t_error("t_alloc"); ! 61: return(-1); ! 62: } ! 63: ! 64: callp->addr.buf=addr.buf; ! 65: callp->addr.len=addr.len; ! 66: ! 67: /* connect to the listener */ ! 68: for (i=0;i<MAXRETRY;i++) { ! 69: if(t_connect(netfd,callp,NULL)==0) ! 70: break; ! 71: if((t_errno==TLOOK)&&(t_look(netfd)==T_DISCONNECT)) { ! 72: t_rcvdis(netfd,NULL); ! 73: } else { ! 74: t_error("t_connect"); ! 75: return(-1); ! 76: } ! 77: } ! 78: if(i>2) { ! 79: t_error("t_connect"); ! 80: return(-1); ! 81: } ! 82: ! 83: /* push the read/write streams modules */ ! 84: if(ioctl(netfd,I_PUSH,"tirdwr")<0) { ! 85: t_error("ioctl"); ! 86: return(-1); ! 87: } ! 88: return(netfd); ! 89: } ! 90: ! 91: static int ! 92: stoa(s, np) ! 93: register char *s; ! 94: struct netbuf *np; ! 95: { ! 96: static char buf[128]; ! 97: register char *bp = buf; ! 98: int b; ! 99: ! 100: if (s[0] == '\\' && tolower(s[1]) == 'x') { ! 101: while (*(s += 2)) { ! 102: sscanf(s, "%2x", &b); ! 103: *bp++ = b; ! 104: } ! 105: np->len = bp - buf; ! 106: } else ! 107: np->len = strlen(strcpy(buf, s)); ! 108: np->buf = buf; ! 109: return 1; ! 110: } ! 111: ! 112: static char * ! 113: atos(np) ! 114: register struct netbuf *np; ! 115: { ! 116: static char buf[128]; ! 117: register char *bp = buf; ! 118: register int i; ! 119: ! 120: bp += sprintf(bp, "\\x"); ! 121: for (i = 0; i < np->len; i++) ! 122: bp += sprintf(bp, "%.2x", np->buf[i]); ! 123: return buf; ! 124: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.