# 1 "Connect.c"

# 1 "./Connect.h"




# 1 "./Error.h"




# 1 "/usr/include/sys/types.h"











































































# 78 "/usr/include/sys/types.h"


# 1 "/usr/include/ansi_compat.h"




























































# 63 "/usr/include/ansi_compat.h"


# 67 "/usr/include/ansi_compat.h"














# 83 "/usr/include/ansi_compat.h"


# 87 "/usr/include/ansi_compat.h"


# 91 "/usr/include/ansi_compat.h"


# 95 "/usr/include/ansi_compat.h"


# 99 "/usr/include/ansi_compat.h"


# 106 "/usr/include/ansi_compat.h"


# 110 "/usr/include/ansi_compat.h"


# 114 "/usr/include/ansi_compat.h"



# 80 "/usr/include/sys/types.h"
















typedef	unsigned char	u_char;
typedef	unsigned short	u_short;
typedef	unsigned int	u_int;
typedef	unsigned int	uint;		
typedef	unsigned long	u_long;
typedef	unsigned short	ushort;		

typedef	volatile char		v_char;
typedef	volatile short		v_short;
typedef	volatile long		v_long;
typedef	volatile unsigned char	vu_char;
typedef	volatile unsigned short	vu_short;
typedef	volatile unsigned long	vu_long;

typedef

	signed

		char	s_char;

# 121 "/usr/include/sys/types.h"



typedef	struct	_physadr { int r[1]; } *physadr;




typedef	struct	label_t	{
	int	val[12];
} label_t;


typedef	struct	_quad { long val[2]; } quad;
typedef	long	daddr_t;
typedef	char *	caddr_t;
typedef u_long	gno_t;
typedef short	cnt_t;			
typedef	long	swblk_t;
typedef long	paddr_t;		
typedef	long	audit_ID_t;


typedef	short	dev_t;
typedef short	gid_t;			
typedef	unsigned long	ino_t;
typedef unsigned short	mode_t;		
typedef short	nlink_t;		
typedef	int	off_t;


typedef int	pid_t;			

typedef short	uid_t;			


typedef int	time_t;





typedef	unsigned int	size_t;



typedef int	clock_t;			

typedef long	key_t;			




























typedef long	fd_mask;






typedef	struct fd_set {
	fd_mask	fds_bits[	(((4096	)+(( (sizeof(fd_mask) * 8		)	)-1))/( (sizeof(fd_mask) * 8		)	))];
} fd_set;








# 5 "./Error.h"

# 1 "./machine.h"



typedef unsigned long  Card32;
typedef unsigned short Card16;
typedef unsigned char  Card8;




# 6 "./Error.h"







typedef struct _Errer
{
  Card32 error;
  caddr_t description;
} Errer;


extern Errer Errur[10];
extern int Error_StackTop;
extern char *errtbl[MAXERROR+1];


























typedef int Trap;














# 64 "./Error.h"





typedef Trap (*Method)();


# 5 "./Connect.h"




typedef Card32 Addr;

typedef struct _Packet
{
  Addr Source, Destination;
  Card16 control;
  Card32 length;
  time_t when;
  char *packet;
} Packet;

typedef struct _connectDomain
{
  char *Domain;			
  Method Initialize;		
  Method NameToAddress;		
  Method AddressToName;		
  Method FreeAddress;		
  Method OpenConnection;	
  Method CloseConnection;	
  Method SendPacket;		
  Method ReceivePacket;		
} ConnectDomain;




































extern Trap Connect_Initialize(void);
extern Trap Connect_RegisterDomain(ConnectDomain *domain);
extern Trap Connect_NameToAddress(char *name, Addr *address);
extern Trap Connect_AddressToName(Addr address, char *name, int length);
extern Trap Connect_FreeAddress(Addr address);
extern Trap Connect_OpenConnection(Addr from, Addr to);
extern Trap Connect_CloseConnection(Addr from, Addr to);
extern Trap Connect_SendPacket(Packet *p);
extern Trap Connect_NewAddress(int d, Addr *address);
extern void Connect_KillAddress(Addr address);
extern Trap Connect_RegisterDescriptor(Addr address, int descriptor);
extern void Connect_FreeDescriptor(int descriptor);
extern void Connect_SelectInterest(int descriptor, int read, int write, int except);
extern Trap Connect_Wait(Packet *packet, Card32 timeout);


# 2 "Connect.c"

# 1 "/usr/include/sys/types.h"



























































































# 215 "/usr/include/sys/types.h"

# 3 "Connect.c"

# 1 "/usr/include/sys/time.h"





























































# 64 "/usr/include/sys/time.h"


# 1 "/usr/include/ansi_compat.h"












































# 116 "/usr/include/ansi_compat.h"

# 66 "/usr/include/sys/time.h"







struct timeval {
	long	tv_sec;		
	long	tv_usec;	
};

struct timezone {
	int	tz_minuteswest;	
	int	tz_dsttime;	
};















# 97 "/usr/include/sys/time.h"











struct	itimerval {
	struct	timeval it_interval;	
	struct	timeval it_value;	
};





struct tm {
	int	tm_sec;
	int	tm_min;
	int	tm_hour;
	int	tm_mday;
	int	tm_mon;
	int	tm_year;
	int	tm_wday;
	int	tm_yday;
	int	tm_isdst;
	long	tm_gmtoff;
	char	*tm_zone;
};








# 141 "/usr/include/sys/time.h"


# 146 "/usr/include/sys/time.h"


# 151 "/usr/include/sys/time.h"










# 164 "/usr/include/sys/time.h"





# 182 "/usr/include/sys/time.h"

extern	struct tm *gmtime(), *localtime();
extern	char *asctime(), *ctime();
extern	size_t strftime();
extern	void tzset();
extern	clock_t clock();
extern	time_t time(), mktime();
extern	double difftime();


extern	char *tzname[];





extern	char *timezone();
# 202 "/usr/include/sys/time.h"





# 4 "Connect.c"

# 1 "/usr/include/sys/param.h"




















































































































# 120 "/usr/include/sys/param.h"


# 1 "/usr/include/ansi_compat.h"












































# 116 "/usr/include/ansi_compat.h"

# 122 "/usr/include/sys/param.h"

# 1 "/usr/include/machine/param.h"































































































































extern unsigned int sr_usermask;






# 137 "/usr/include/machine/param.h"



# 123 "/usr/include/sys/param.h"






















# 164 "/usr/include/sys/param.h"













# 177 "/usr/include/sys/param.h"















				
				
				
				


















# 216 "/usr/include/sys/param.h"































# 249 "/usr/include/sys/param.h"


# 1 "/usr/include/signal.h"






































































# 73 "/usr/include/signal.h"


# 1 "/usr/include/ansi_compat.h"












































# 116 "/usr/include/ansi_compat.h"

# 75 "/usr/include/signal.h"

















					
































































# 157 "/usr/include/signal.h"



























































# 341 "/usr/include/signal.h"












# 251 "/usr/include/sys/param.h"




# 255 "/usr/include/sys/param.h"










 






















# 293 "/usr/include/sys/param.h"













# 1 "/usr/include/sys/types.h"



























































































# 215 "/usr/include/sys/types.h"

# 306 "/usr/include/sys/param.h"
# 310 "/usr/include/sys/param.h"




# 1 "/usr/include/sys/smp_lock.h"


























































































































# 125 "/usr/include/sys/smp_lock.h"


# 1 "/usr/include/ansi_compat.h"












































# 116 "/usr/include/ansi_compat.h"

# 127 "/usr/include/sys/smp_lock.h"































struct __lock_t {
	volatile unsigned int
			l_call:8,	
			l_hierpos:8,	
			l_ipl:8,	
			l_type:7,	
			l_lock:1;	
	struct __lock_t	*l_plock;	
	char *		l_pc;
	unsigned long 	l_lost; 	
	unsigned long 	l_spin;		
	unsigned long 	l_won;		
	unsigned short 	l_wanted;	

};








struct lock_trace {
	long tr_pid;	
	caddr_t tr_pc;	
	long tr_psl;	
	struct __lock_t *tr_lock;	
};



struct debug_entry {
		unsigned int spinct;
		caddr_t calling_pc;
		caddr_t holding_pc;
	};
struct debug_lock_trace {
	struct __lock_t *traced_lock;
	int current_lock_trace;	
	int debug_lock_entries;
	struct debug_entry element[200];
};

extern struct debug_lock_trace *debug_lock_trace;


struct lock_data {
	char	l_hierpos;
	char	l_type;
	char	l_ipl;
};










# 384 "/usr/include/sys/smp_lock.h"




# 314 "/usr/include/sys/param.h"
# 318 "/usr/include/sys/param.h"





























# 347 "/usr/include/sys/param.h"


# 349 "/usr/include/sys/param.h"

















































# 5 "Connect.c"

# 1 "/usr/include/errno.h"




































































































	













	













	






















































extern int errno;

# 6 "Connect.c"

int numDomains;
ConnectDomain connectDomains[10];

Card32 newAddress;
Card32 addresses[8192	/32];
Card32 one[32];







Addr owner[64		]; 
fd_set ref_read, ref_write, ref_except;
int maxfds;



Trap Connect_Initialize()
{
  int i;
  Card32 j;

  j = 1;
  for (i = 0; i < 32; i++)
    {
      one[i] = j;
      j = j << 1;
    }

  for (i = 0; i < 8192	/32; i++)
    addresses[i] = 0;

   addresses[(0)/32] |= one[(0)%32]; 
  newAddress = 1;

  numDomains = 0;

  for (i = 0; i < 64		; i++)
    owner[i] = ((Addr)((Card32)~0));

  maxfds = 0;
  	bzero((char *)(&ref_read), sizeof(*(&ref_read)));
  	bzero((char *)(&ref_write), sizeof(*(&ref_write)));
  	bzero((char *)(&ref_except), sizeof(*(&ref_except)));

  return (Trap)0;
}










Trap Connect_RegisterDomain(domain)
     ConnectDomain *domain;
{
  int i;

  for (i = 0; i < numDomains; i++)
    if (!strcmp(domain->Domain, connectDomains[i].Domain))
       {  ((Error_StackTop == 10 - 1) ? 			  0 : Error_StackTop++),   Errur[Error_StackTop].error = CONNECT_DOMAINEXISTS,   Errur[Error_StackTop].description = (caddr_t)  0; return (Trap)-1; };

  if (numDomains == 10)
     {  ((Error_StackTop == 10 - 1) ? 			  0 : Error_StackTop++),   Errur[Error_StackTop].error = CONNECT_DOMAINLISTFULL,   Errur[Error_StackTop].description = (caddr_t)  0; return (Trap)-1; };

  bcopy(domain, &connectDomains[numDomains], sizeof(ConnectDomain));
  numDomains++;

  





  
  if (connectDomains[numDomains - 1].Initialize(numDomains - 1) &&
      (Errur[Error_StackTop].error & 0x30000000) == (3<<28))
    {
      numDomains--;
      return (Trap)-1;
    }

  return (Trap)0;
}












Trap Connect_NameToAddress(name, address)
     char *name;
     Addr *address;
{
  static char domain[30], *d, *p;
  int i;

  if (name == 0)
     {  ((Error_StackTop == 10 - 1) ? 			  0 : Error_StackTop++),   Errur[Error_StackTop].error = BOZO_NULLPOINTER,   Errur[Error_StackTop].description = (caddr_t)  0; return (Trap)-1; };

  p = name;
  d = domain;

  while (*p != ':' && *p != '\0')
    *(d++) = *(p++);

  *d = '\0';
  p++;

  for (i = 0; i < numDomains; i++)
    if (!strcmp(domain, connectDomains[i].Domain))
      return(connectDomains[i].NameToAddress(i, p, address));

   {  ((Error_StackTop == 10 - 1) ? 			  0 : Error_StackTop++),   Errur[Error_StackTop].error = CONNECT_DOMAINUNKNOWN,   Errur[Error_StackTop].description = (caddr_t)  domain; return (Trap)-1; };
}







Trap Connect_AddressToName(address, name, length)
     Addr address;
     char *name;
     int length;
{
  if ( (int)((address) >> 24) > numDomains)
     {  ((Error_StackTop == 10 - 1) ? 			  0 : Error_StackTop++),   Errur[Error_StackTop].error = CONNECT_BADADDRESS,   Errur[Error_StackTop].description = (caddr_t)  address; return (Trap)-1; };

  strncpy(name, connectDomains[ (int)((address) >> 24)].Domain, length);
  length -= strlen(name);
  if (length > 0)
    {
      strcat(name, ":");
      length--;
    }

  return
    connectDomains[ (int)((address) >> 24)].AddressToName(address,
							  name, length);
}

Trap Connect_FreeAddress(address)
     Addr address;
{
  if ( (int)((address) >> 24) > numDomains)
     {  ((Error_StackTop == 10 - 1) ? 			  0 : Error_StackTop++),   Errur[Error_StackTop].error = CONNECT_BADADDRESS,   Errur[Error_StackTop].description = (caddr_t)  address; return (Trap)-1; };

  return connectDomains[ (int)((address) >> 24)].FreeAddress(address);
}

Trap Connect_OpenConnection(from, to)
     Addr from, to;
{
  if ( (int)((to) >> 24) > numDomains)
     {  ((Error_StackTop == 10 - 1) ? 			  0 : Error_StackTop++),   Errur[Error_StackTop].error = CONNECT_BADADDRESS,   Errur[Error_StackTop].description = (caddr_t)  to; return (Trap)-1; };

  return connectDomains[ (int)((to) >> 24)].OpenConnection(from, to);
}

Trap Connect_CloseConnection(from, to)
     Addr from, to;
{
  if ( (int)((to) >> 24) > numDomains)
     {  ((Error_StackTop == 10 - 1) ? 			  0 : Error_StackTop++),   Errur[Error_StackTop].error = CONNECT_BADADDRESS,   Errur[Error_StackTop].description = (caddr_t)  to; return (Trap)-1; };

  return
    connectDomains[ (int)((to) >> 24)].CloseConnection(from, to);
}

Trap Connect_SendPacket(p)
     Packet *p;
{
  if ( (int)((p->Destination) >> 24) > numDomains)
     {  ((Error_StackTop == 10 - 1) ? 			  0 : Error_StackTop++),   Errur[Error_StackTop].error = CONNECT_BADADDRESS,   Errur[Error_StackTop].description = (caddr_t)  p->Destination; return (Trap)-1; };

  return connectDomains[ (int)((p->Destination) >> 24)].SendPacket(p);
}




Card32 nextAddress(a)
     Card32 a;
{
  Card32 s;

  if (! (addresses[(a)/32] & one[(a)%32]))
    {
       addresses[(a)/32] |= one[(a)%32];
      return a;
    }

  s = a;
   while ( ((0xFFFFFFFF & ~addresses[(a)/32]) == 0) && (a) <  8192	) (a) += 32;

  if (a != s)
    a -= a%32;

  if (a >= 8192	)
    {
      a = 0;
       while ( ((0xFFFFFFFF & ~addresses[(a)/32]) == 0) && (a) <  s) (a) += 32;
      if (a >= s)
	return 0; 
    }

  while ( (addresses[(a)/32] & one[(a)%32])) a++; 
   addresses[(a)/32] |= one[(a)%32];
  return a;
}







Trap Connect_NewAddress(d, address)
     int d;
     Addr *address;
{
  Card32 a;

  a = nextAddress(newAddress);

  if (a == 0)
     {  ((Error_StackTop == 10 - 1) ? 			  0 : Error_StackTop++),   Errur[Error_StackTop].error = CONNECT_ADDRTBLFULL,   Errur[Error_StackTop].description = (caddr_t)  8192	; return (Trap)-1; }; 

  newAddress = a + 1;
  *address =  ((Addr)((d) << 24) | (Addr)( a));
  return (Trap)0;
}

void Connect_KillAddress(address)
     Addr address;
{
  if ( (Card32)(((address) & 0x00FFFFFF)) != ((Addr)0) &&
       (Card32)(((address) & 0x00FFFFFF)) < 8192	)
     addresses[( (Card32)(((address) & 0x00FFFFFF)))/32] &= ~one[( (Card32)(((address) & 0x00FFFFFF)))%32];
}







Trap Connect_RegisterDescriptor(address, descriptor)
     Addr address;
     int descriptor;
{
  if (descriptor > 64		)
     {  ((Error_StackTop == 10 - 1) ? 			  0 : Error_StackTop++),   Errur[Error_StackTop].error = CONNECT_FILDESTOOLARGE,   Errur[Error_StackTop].description = (caddr_t)  descriptor; return (Trap)-1; };

  owner[descriptor] = address;
  maxfds =  (((descriptor + 1)>( maxfds))?(descriptor + 1):( maxfds));
  return (Trap)0;
}

void Connect_FreeDescriptor(descriptor)
     int descriptor;
{
  
  owner[descriptor] = ((Addr)((Card32)~0));
  	(( &ref_read)->fds_bits[(descriptor)/(sizeof(fd_mask) * 8		)	] &= ~(1 << ((descriptor) % (sizeof(fd_mask) * 8		)	)));
  	(( &ref_write)->fds_bits[(descriptor)/(sizeof(fd_mask) * 8		)	] &= ~(1 << ((descriptor) % (sizeof(fd_mask) * 8		)	)));
  	(( &ref_except)->fds_bits[(descriptor)/(sizeof(fd_mask) * 8		)	] &= ~(1 << ((descriptor) % (sizeof(fd_mask) * 8		)	)));
}

void Connect_SelectInterest(descriptor, read, write, except)
     int descriptor;
     int read, write, except;
{
  if (descriptor > 64		 ||
      owner[descriptor] == ((Addr)((Card32)~0)))
    return;

  switch(read)
    {
    case 1:
      	(( &ref_read)->fds_bits[(descriptor)/(sizeof(fd_mask) * 8		)	] |= (1 << ((descriptor) % (sizeof(fd_mask) * 8		)	)));
      break;
    case 0:
      	(( &ref_read)->fds_bits[(descriptor)/(sizeof(fd_mask) * 8		)	] &= ~(1 << ((descriptor) % (sizeof(fd_mask) * 8		)	)));
      break;
    default:
      break;
    }

  switch(write)
    {
    case 1:
      	(( &ref_write)->fds_bits[(descriptor)/(sizeof(fd_mask) * 8		)	] |= (1 << ((descriptor) % (sizeof(fd_mask) * 8		)	)));
      break;
    case 0:
      	(( &ref_write)->fds_bits[(descriptor)/(sizeof(fd_mask) * 8		)	] &= ~(1 << ((descriptor) % (sizeof(fd_mask) * 8		)	)));
      break;
    default:
      break;
    }

  switch(except)
    {
    case 1:
      	(( &ref_except)->fds_bits[(descriptor)/(sizeof(fd_mask) * 8		)	] |= (1 << ((descriptor) % (sizeof(fd_mask) * 8		)	)));
      break;
    case 0:
      	(( &ref_except)->fds_bits[(descriptor)/(sizeof(fd_mask) * 8		)	] &= ~(1 << ((descriptor) % (sizeof(fd_mask) * 8		)	)));
      break;
    default:
      break;
    }
}
















Trap Connect_Wait(packet, timeout)
     Packet *packet;
     Card32 timeout;
{
  fd_set readfds, writefds, exceptfds;
  static int nfound = 0, first;
  int i;
  struct timeval t;

  



  if (nfound == 0)
    {
      if (timeout != ((Card32)~0))
	{
	  t.tv_sec = timeout / 1000;
	  t.tv_usec = (timeout % 1000) * 1000;
	}

      bcopy(&ref_read, &readfds, sizeof(fd_set));
      bcopy(&ref_write, &writefds, sizeof(fd_set));
      bcopy(&ref_except, &exceptfds, sizeof(fd_set));

      first = 0;
      nfound = select(maxfds, &readfds, &writefds, &exceptfds,
		      (timeout == ((Card32)~0) ? 0 : &t));

      switch(nfound)
	{
	case -1:
	   {  ((Error_StackTop == 10 - 1) ? 			  0 : Error_StackTop++),   Errur[Error_StackTop].error = CONNECT_SELECT,   Errur[Error_StackTop].description = (caddr_t)  errno; return (Trap)-1; };
	  break;
	case 0:
	   {  ((Error_StackTop == 10 - 1) ? 			  0 : Error_StackTop++),   Errur[Error_StackTop].error = CONNECT_TIMEOUT,   Errur[Error_StackTop].description = (caddr_t)  0; return (Trap)-1; };
	  break;
	}
   }

  for (i = first; i < 64		; i++)
    if (	(( &readfds)->fds_bits[(i)/(sizeof(fd_mask) * 8		)	] & (1 << ((i) % (sizeof(fd_mask) * 8		)	))))
      {
	first = i + 1;
	nfound--;

	if (owner[i] == ((Addr)((Card32)~0)))
	   {  ((Error_StackTop == 10 - 1) ? 			  0 : Error_StackTop++),   Errur[Error_StackTop].error = CONNECT_SOCKETREAD,   Errur[Error_StackTop].description = (caddr_t)  i; return (Trap)-1; };

	
	packet->when = time(0);
	return connectDomains[ (int)((owner[i]) >> 24)].
	  ReceivePacket(i, owner[i], packet);
      }

  
  nfound = 0;
   {  ((Error_StackTop == 10 - 1) ? 			  0 : Error_StackTop++),   Errur[Error_StackTop].error = CONNECT_CONFUSED,   Errur[Error_StackTop].description = (caddr_t)  0; return (Trap)-1; };
}
