home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
HAM Radio 1
/
HamRadio.cdr
/
misc
/
tcpipsrc
/
sockutil.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-01-26
|
3KB
|
157 lines
/* Low level socket routines
* Copyright 1991 Phil Karn, KA9Q
*/
#include "global.h"
#include "mbuf.h"
#include "netuser.h"
#include "socket.h"
#include "usock.h"
#include "lapb.h"
#include "tcp.h"
#include "nr4.h"
#include "config.h"
/* Convert a socket (address + port) to an ascii string of the form
* aaa.aaa.aaa.aaa:ppppp
*/
char *
psocket(p)
void *p; /* Pointer to structure to decode */
{
#if defined(AX25) || defined(NETROM)
char tmp[11];
#endif
static char buf[30];
union sp sp;
struct socket socket;
sp.p = p;
switch(sp.sa->sa_family){
case AF_LOCAL:
buf[0] = '\0';
break;
case AF_INET:
socket.address = sp.in->sin_addr.s_addr;
socket.port = sp.in->sin_port;
strcpy(buf,pinet(&socket));
break;
#ifdef AX25
case AF_AX25:
pax25(tmp,sp.ax->ax25_addr);
if(strlen(sp.ax->iface) != 0)
sprintf(buf,"%s on %s",tmp,sp.ax->iface);
else
strcpy(buf,tmp);
break;
#endif
#ifdef NETROM
case AF_NETROM:
pax25(tmp,sp.nr->nr_addr.user);
sprintf(buf,"%s @ ",tmp);
pax25(tmp,sp.nr->nr_addr.node);
strcat(buf,tmp);
break;
#endif
}
return buf;
}
/* Return ASCII string giving reason for connection closing */
char *
sockerr(s)
int s; /* Socket index */
{
register struct usock *up;
if((up = itop(s)) == NULLUSOCK){
errno = EBADF;
return Badsocket;
}
switch(up->type){
#ifdef AX25
case TYPE_AX25I:
if(up->cb.ax25 != NULLAX25)
return NULLCHAR; /* nothing wrong */
return Axreasons[up->errcodes[0]];
#endif
#ifdef NETROM
case TYPE_NETROML4:
if(up->cb.nr4 != NULLNR4CB)
return NULLCHAR; /* nothing wrong */
return Nr4reasons[up->errcodes[0]];
#endif
case TYPE_TCP:
if(up->cb.tcb != NULLTCB)
return NULLCHAR; /* nothing wrong */
return Tcpreasons[up->errcodes[0]];
default:
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;
if((up = itop(s)) == NULLUSOCK){
errno = EBADF;
return NULLCHAR;
}
if(up->cb.p == NULLCHAR){
errno = ENOTCONN;
return NULLCHAR;
}
switch(up->type){
case TYPE_TCP:
return Tcpstates[up->cb.tcb->state];
#ifdef AX25
case TYPE_AX25I:
return Ax25states[up->cb.ax25->state];
#endif
#ifdef NETROM
case TYPE_NETROML4:
return Nr4states[up->cb.nr4->state];
#endif
default:
/* Datagram sockets don't have state */
errno = EOPNOTSUPP;
return NULLCHAR;
}
/*NOTREACHED*/
}
/* 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;i<SOCKBASE+Nusock;i++){
up = &Usock[i];
if(up->type == TYPE_LOCAL_STREAM)
mbuf_crunch(&up->cb.local->q);
}
}