/* Low level socket routines * Copyright 1991 Phil Karn, KA9Q */ #include "global.h" #include "mbuf.h" #include "netuser.h" #include "socket.h" #include "usock.h" /* Convert a socket (address + port) to an ascii string of the form * aaa.aaa.aaa.aaa:ppppp */ char * psocket(p) void *p; { struct sockaddr *sp; /* Pointer to structure to decode */ sp = (struct sockaddr *)p; if(sp->sa_family < AF_INET || sp->sa_family >= NAF) return NULLCHAR; return (*Psock[sp->sa_family])(sp); } /* Return ASCII string giving reason for connection closing */ char * sockerr(s) int s; /* Socket index */ { register struct usock *up; struct socklink *sp; if((up = itop(s)) == NULLUSOCK){ errno = EBADF; return Badsocket; } sp = up->sp; if(sp->error != NULL){ return sp->error[up->errcodes[0]]; } else { errno = EOPNOTSUPP; /* not yet, anyway */ return NULLCHAR; } } /* Get state of protocol. Valid only for connection-oriented sockets. */ char * sockstate(s) int s; /* Socket index */ { register struct usock *up; struct socklink *sp; if((up = itop(s)) == NULLUSOCK){ errno = EBADF; return NULLCHAR; } if(up->cb.p == NULLCHAR){ errno = ENOTCONN; return NULLCHAR; } sp = up->sp; if(sp->state != NULL) return (*sp->state)(up); /* Datagram sockets don't have state */ errno = EOPNOTSUPP; return NULLCHAR; } /* Convert a socket index to an internal user socket structure pointer */ struct usock * itop(s) register int s; /* Socket index */ { register struct usock *up; s -= SOCKBASE; if(s < 0 || s >= Nusock) return NULLUSOCK; up = &Usock[s]; if(up->type == NOTUSED) return NULLUSOCK; return up; } void st_garbage(red) int red; { int i; struct usock *up; for(i=SOCKBASE;itype == TYPE_LOCAL_STREAM) mbuf_crunch(&up->cb.local->q); } }