int code;
int haveGlock = ISAFS_GLOCK();
+
+ memset(&u, 0, sizeof(u));
+ memset(&iov, 0, sizeof(iov));
+
/*AFS_STATCNT(osi_NetReceive); */
if (nvecs > RX_MAXIOVECS)
*addr = *(struct sockaddr_in *)sa;
} else
printf("Unknown socket family %d in NetReceive\n", sa->sa_family);
- FREE(sa, M_SONAME);
+ free(sa, M_SONAME);
}
return code;
}
-#define so_is_disconn(so) ((so)->so_state & SS_ISDISCONNECTED)
-
extern int rxk_ListenerPid;
void
osi_StopListener(void)
{
+ struct sockaddr_in taddr;
+ struct iovec dvec;
struct proc *p;
+ char c;
+ c = '\0';
/*
* Have to drop global lock to safely do this.
if (haveGlock)
AFS_GUNLOCK();
soshutdown(rx_socket, SHUT_RDWR);
- soclose(rx_socket);
p = pfind(rxk_ListenerPid);
- afs_warn("osi_StopListener: rxk_ListenerPid %lx\n", p);
- if (p)
- psignal(p, SIGUSR1);
- PROC_UNLOCK(p);
-#ifdef AFS_FBSD70_ENV
- {
- /* Avoid destroying socket until osi_NetReceive has
- * had a chance to clean up */
- int tries;
- struct mtx s_mtx;
-
- MUTEX_INIT(&s_mtx, "rx_shutdown_mutex", MUTEX_DEFAULT, 0);
- MUTEX_ENTER(&s_mtx);
- tries = 3;
- while ((tries > 0) && (!so_is_disconn(rx_socket))) {
- msleep(&osi_StopListener, &s_mtx, PSOCK | PCATCH,
- "rx_shutdown_timedwait", 1 * hz);
- --tries;
- }
- if (so_is_disconn(rx_socket))
- soclose(rx_socket);
- MUTEX_EXIT(&s_mtx);
- MUTEX_DESTROY(&s_mtx);
+ if (p) {
+ afs_warn("osi_StopListener: rxk_ListenerPid %u\n", rxk_ListenerPid);
+ kern_psignal(p, SIGUSR1);
+ PROC_UNLOCK(p);
+ } else
+ afs_warn("osi_StopListener: rxk_Listener not found (pid %u)\n",
+ rxk_ListenerPid);
+
+ /* Avoid destroying socket until osi_NetReceive has
+ * had a chance to clean up. Otherwise we can't restart. */
+ bzero(&taddr, sizeof(taddr));
+ taddr.sin_len = sizeof(struct sockaddr_in);
+ taddr.sin_family = AF_INET;
+ taddr.sin_port = rx_port;
+ taddr.sin_addr.s_addr = htonl(0x7f000001); /* no place like localhost */
+ bzero(&dvec, sizeof(dvec));
+ dvec.iov_base = &c;
+ dvec.iov_len = 1;
+ /* afs_osi_Sleep requires the GLOCK */
+ AFS_GLOCK();
+ while(rxk_ListenerPid) {
+ afs_warn("waiting for rxk_ListenerPid to die\n");
+ osi_NetSend(rx_socket, &taddr, &dvec, 1, 1, 0);
+ afs_osi_Sleep(&rxk_ListenerPid);
}
-#endif
+ AFS_GUNLOCK();
+ /* in theory, we are now the only people doing anything with rx_socket */
+ soclose(rx_socket);
+
if (haveGlock)
AFS_GLOCK();
}
osi_NetSend(osi_socket asocket, struct sockaddr_in *addr, struct iovec *dvec,
int nvecs, afs_int32 alength, int istack)
{
- register afs_int32 code;
+ afs_int32 code;
int i;
struct iovec iov[RX_MAXIOVECS];
struct uio u;
int haveGlock = ISAFS_GLOCK();
+ memset(&u, 0, sizeof(u));
+ memset(&iov, 0, sizeof(iov));
+
AFS_STATCNT(osi_NetSend);
if (nvecs > RX_MAXIOVECS)
osi_Panic("osi_NetSend: %d: Too many iovecs.\n", nvecs);
/* start intercepting basic calls */
rxk_init()
{
- register struct protosw *tpro, *last;
+ struct protosw *tpro, *last;
if (rxk_initDone)
return 0;
last = inetdomain.dom_protoswNPROTOSW;
for (tpro = inetdomain.dom_protosw; tpro < last; tpro++)
if (tpro->pr_protocol == IPPROTO_UDP) {
-#if 0 /* not exported */
- /* force UDP checksumming on for AFS */
- extern int udpcksum;
- udpcksum = 1;
-#endif
memcpy(&parent_proto, tpro, sizeof(parent_proto));
tpro->pr_input = rxk_input;
tpro->pr_fasttimo = rxk_fasttimo;
rxk_input(struct mbuf *am, int iphlen)
{
void (*tproc) ();
- register unsigned short *tsp;
+ unsigned short *tsp;
int hdr;
struct udphdr *tu;
- register struct ip *ti;
+ struct ip *ti;
struct udpiphdr *tvu;
- register int i;
+ int i;
char *phandle;
afs_int32 code;
struct sockaddr_in taddr;
* sometimes */
static
trysblock(sb)
- register struct sockbuf *sb;
+ struct sockbuf *sb;
{
AFS_STATCNT(trysblock);
if (sb->sb_flags & SB_LOCK) {
osi_NetSend(osi_socket asocket, struct sockaddr_in *addr, struct iovec *dvec,
int nvec, afs_int32 asize, int istack)
{
- register struct mbuf *tm, *um;
- register afs_int32 code;
+ struct mbuf *tm, *um;
+ afs_int32 code;
int s;
struct mbuf *top = 0;
- register struct mbuf *m, **mp;
+ struct mbuf *m, **mp;
int len;
char *tdata;
caddr_t tpa;