1540eaef7Sderaadt /* $NetBSD: utils.c,v 1.5.2.1 1995/11/14 08:45:46 thorpej Exp $ */ 2df930be7Sderaadt 3df930be7Sderaadt /* 4df930be7Sderaadt * Copyright (c) 1988, 1992 The University of Utah and the Center 5df930be7Sderaadt * for Software Science (CSS). 6df930be7Sderaadt * Copyright (c) 1992, 1993 7df930be7Sderaadt * The Regents of the University of California. All rights reserved. 8df930be7Sderaadt * 9df930be7Sderaadt * This code is derived from software contributed to Berkeley by 10df930be7Sderaadt * the Center for Software Science of the University of Utah Computer 11df930be7Sderaadt * Science Department. CSS requests users of this software to return 12df930be7Sderaadt * to css-dist@cs.utah.edu any improvements that they make and grant 13df930be7Sderaadt * CSS redistribution rights. 14df930be7Sderaadt * 15df930be7Sderaadt * Redistribution and use in source and binary forms, with or without 16df930be7Sderaadt * modification, are permitted provided that the following conditions 17df930be7Sderaadt * are met: 18df930be7Sderaadt * 1. Redistributions of source code must retain the above copyright 19df930be7Sderaadt * notice, this list of conditions and the following disclaimer. 20df930be7Sderaadt * 2. Redistributions in binary form must reproduce the above copyright 21df930be7Sderaadt * notice, this list of conditions and the following disclaimer in the 22df930be7Sderaadt * documentation and/or other materials provided with the distribution. 23df930be7Sderaadt * 3. All advertising materials mentioning features or use of this software 24df930be7Sderaadt * must display the following acknowledgement: 25df930be7Sderaadt * This product includes software developed by the University of 26df930be7Sderaadt * California, Berkeley and its contributors. 27df930be7Sderaadt * 4. Neither the name of the University nor the names of its contributors 28df930be7Sderaadt * may be used to endorse or promote products derived from this software 29df930be7Sderaadt * without specific prior written permission. 30df930be7Sderaadt * 31df930be7Sderaadt * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 32df930be7Sderaadt * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 33df930be7Sderaadt * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 34df930be7Sderaadt * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 35df930be7Sderaadt * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36df930be7Sderaadt * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37df930be7Sderaadt * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38df930be7Sderaadt * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 39df930be7Sderaadt * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 40df930be7Sderaadt * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 41df930be7Sderaadt * SUCH DAMAGE. 42df930be7Sderaadt * 43df930be7Sderaadt * from: @(#)utils.c 8.1 (Berkeley) 6/4/93 44df930be7Sderaadt * 45df930be7Sderaadt * From: Utah Hdr: utils.c 3.1 92/07/06 46df930be7Sderaadt * Author: Jeff Forys, University of Utah CSS 47df930be7Sderaadt */ 48df930be7Sderaadt 49df930be7Sderaadt #ifndef lint 50df930be7Sderaadt /*static char sccsid[] = "@(#)utils.c 8.1 (Berkeley) 6/4/93";*/ 51540eaef7Sderaadt static char rcsid[] = "$NetBSD: utils.c,v 1.5.2.1 1995/11/14 08:45:46 thorpej Exp $"; 52df930be7Sderaadt #endif /* not lint */ 53df930be7Sderaadt 54df930be7Sderaadt #include <sys/param.h> 55df930be7Sderaadt 56df930be7Sderaadt #include <fcntl.h> 57df930be7Sderaadt #include <signal.h> 58df930be7Sderaadt #include <stdio.h> 59df930be7Sderaadt #include <stdlib.h> 60df930be7Sderaadt #include <string.h> 61df930be7Sderaadt #include <syslog.h> 62df930be7Sderaadt #include <time.h> 63df930be7Sderaadt #include <unistd.h> 64df930be7Sderaadt #include "defs.h" 65df930be7Sderaadt 66df930be7Sderaadt /* 67df930be7Sderaadt ** DispPkt -- Display the contents of an RMPCONN packet. 68df930be7Sderaadt ** 69df930be7Sderaadt ** Parameters: 70df930be7Sderaadt ** rconn - packet to be displayed. 71df930be7Sderaadt ** direct - direction packet is going (DIR_*). 72df930be7Sderaadt ** 73df930be7Sderaadt ** Returns: 74df930be7Sderaadt ** Nothing. 75df930be7Sderaadt ** 76df930be7Sderaadt ** Side Effects: 77df930be7Sderaadt ** None. 78df930be7Sderaadt */ 79df930be7Sderaadt void 80df930be7Sderaadt DispPkt(rconn, direct) 81df930be7Sderaadt RMPCONN *rconn; 82df930be7Sderaadt int direct; 83df930be7Sderaadt { 84df930be7Sderaadt static char BootFmt[] = "\t\tRetCode:%u SeqNo:%lx SessID:%x Vers:%u"; 85df930be7Sderaadt static char ReadFmt[] = "\t\tRetCode:%u Offset:%lx SessID:%x\n"; 86df930be7Sderaadt 87df930be7Sderaadt struct tm *tmp; 88df930be7Sderaadt register struct rmp_packet *rmp; 89df930be7Sderaadt int i, omask; 90df930be7Sderaadt u_int32_t t; 91df930be7Sderaadt 92df930be7Sderaadt /* 93df930be7Sderaadt * Since we will be working with RmpConns as well as DbgFp, we 94df930be7Sderaadt * must block signals that can affect either. 95df930be7Sderaadt */ 96df930be7Sderaadt omask = sigblock(sigmask(SIGHUP)|sigmask(SIGUSR1)|sigmask(SIGUSR2)); 97df930be7Sderaadt 98df930be7Sderaadt if (DbgFp == NULL) { /* sanity */ 99df930be7Sderaadt (void) sigsetmask(omask); 100df930be7Sderaadt return; 101df930be7Sderaadt } 102df930be7Sderaadt 103df930be7Sderaadt /* display direction packet is going using '>>>' or '<<<' */ 104df930be7Sderaadt fputs((direct==DIR_RCVD)?"<<< ":(direct==DIR_SENT)?">>> ":"", DbgFp); 105df930be7Sderaadt 106df930be7Sderaadt /* display packet timestamp */ 107df930be7Sderaadt tmp = localtime((time_t *)&rconn->tstamp.tv_sec); 108df930be7Sderaadt fprintf(DbgFp, "%02d:%02d:%02d.%06ld ", tmp->tm_hour, tmp->tm_min, 109df930be7Sderaadt tmp->tm_sec, rconn->tstamp.tv_usec); 110df930be7Sderaadt 111df930be7Sderaadt /* display src or dst addr and information about network interface */ 112df930be7Sderaadt fprintf(DbgFp, "Addr: %s Intf: %s\n", EnetStr(rconn), IntfName); 113df930be7Sderaadt 114df930be7Sderaadt rmp = &rconn->rmp; 115df930be7Sderaadt 116df930be7Sderaadt /* display IEEE 802.2 Logical Link Control header */ 117df930be7Sderaadt (void) fprintf(DbgFp, "\t802.2 LLC: DSAP:%x SSAP:%x CTRL:%x\n", 118df930be7Sderaadt rmp->hp_llc.dsap, rmp->hp_llc.ssap, ntohs(rmp->hp_llc.cntrl)); 119df930be7Sderaadt 120df930be7Sderaadt /* display HP extensions to 802.2 Logical Link Control header */ 121df930be7Sderaadt (void) fprintf(DbgFp, "\tHP Ext: DXSAP:%x SXSAP:%x\n", 122df930be7Sderaadt ntohs(rmp->hp_llc.dxsap), ntohs(rmp->hp_llc.sxsap)); 123df930be7Sderaadt 124df930be7Sderaadt /* 125df930be7Sderaadt * Display information about RMP packet using type field to 126df930be7Sderaadt * determine what kind of packet this is. 127df930be7Sderaadt */ 128df930be7Sderaadt switch(rmp->r_type) { 129df930be7Sderaadt case RMP_BOOT_REQ: /* boot request */ 130df930be7Sderaadt (void) fprintf(DbgFp, "\tBoot Request:"); 131df930be7Sderaadt GETWORD(rmp->r_brq.rmp_seqno, t); 132df930be7Sderaadt if (ntohs(rmp->r_brq.rmp_session) == RMP_PROBESID) { 133df930be7Sderaadt if (WORDZE(rmp->r_brq.rmp_seqno)) 134df930be7Sderaadt fputs(" (Send Server ID)", DbgFp); 135df930be7Sderaadt else 136df930be7Sderaadt fprintf(DbgFp," (Send Filename #%u)",t); 137df930be7Sderaadt } 138df930be7Sderaadt (void) fputc('\n', DbgFp); 139df930be7Sderaadt (void) fprintf(DbgFp, BootFmt, rmp->r_brq.rmp_retcode, 140df930be7Sderaadt t, ntohs(rmp->r_brq.rmp_session), 141df930be7Sderaadt ntohs(rmp->r_brq.rmp_version)); 142df930be7Sderaadt (void) fprintf(DbgFp, "\n\t\tMachine Type: "); 143df930be7Sderaadt for (i = 0; i < RMP_MACHLEN; i++) 144df930be7Sderaadt (void) fputc(rmp->r_brq.rmp_machtype[i], DbgFp); 145df930be7Sderaadt DspFlnm(rmp->r_brq.rmp_flnmsize, &rmp->r_brq.rmp_flnm); 146df930be7Sderaadt break; 147df930be7Sderaadt case RMP_BOOT_REPL: /* boot reply */ 148df930be7Sderaadt fprintf(DbgFp, "\tBoot Reply:\n"); 149df930be7Sderaadt GETWORD(rmp->r_brpl.rmp_seqno, t); 150df930be7Sderaadt (void) fprintf(DbgFp, BootFmt, rmp->r_brpl.rmp_retcode, 151df930be7Sderaadt t, ntohs(rmp->r_brpl.rmp_session), 152df930be7Sderaadt ntohs(rmp->r_brpl.rmp_version)); 153df930be7Sderaadt DspFlnm(rmp->r_brpl.rmp_flnmsize,&rmp->r_brpl.rmp_flnm); 154df930be7Sderaadt break; 155df930be7Sderaadt case RMP_READ_REQ: /* read request */ 156df930be7Sderaadt (void) fprintf(DbgFp, "\tRead Request:\n"); 157df930be7Sderaadt GETWORD(rmp->r_rrq.rmp_offset, t); 158df930be7Sderaadt (void) fprintf(DbgFp, ReadFmt, rmp->r_rrq.rmp_retcode, 159df930be7Sderaadt t, ntohs(rmp->r_rrq.rmp_session)); 160df930be7Sderaadt (void) fprintf(DbgFp, "\t\tNoOfBytes: %u\n", 161df930be7Sderaadt ntohs(rmp->r_rrq.rmp_size)); 162df930be7Sderaadt break; 163df930be7Sderaadt case RMP_READ_REPL: /* read reply */ 164df930be7Sderaadt (void) fprintf(DbgFp, "\tRead Reply:\n"); 165df930be7Sderaadt GETWORD(rmp->r_rrpl.rmp_offset, t); 166df930be7Sderaadt (void) fprintf(DbgFp, ReadFmt, rmp->r_rrpl.rmp_retcode, 167df930be7Sderaadt t, ntohs(rmp->r_rrpl.rmp_session)); 168*e38ed7b7Sderaadt (void) fprintf(DbgFp, "\t\tNoOfBytesSent: %ld\n", 169*e38ed7b7Sderaadt (long)(rconn->rmplen - RMPREADSIZE(0))); 170df930be7Sderaadt break; 171df930be7Sderaadt case RMP_BOOT_DONE: /* boot complete */ 172df930be7Sderaadt (void) fprintf(DbgFp, "\tBoot Complete:\n"); 173df930be7Sderaadt (void) fprintf(DbgFp, "\t\tRetCode:%u SessID:%x\n", 174df930be7Sderaadt rmp->r_done.rmp_retcode, 175df930be7Sderaadt ntohs(rmp->r_done.rmp_session)); 176df930be7Sderaadt break; 177df930be7Sderaadt default: /* ??? */ 178df930be7Sderaadt (void) fprintf(DbgFp, "\tUnknown Type:(%d)\n", 179df930be7Sderaadt rmp->r_type); 180df930be7Sderaadt } 181df930be7Sderaadt (void) fputc('\n', DbgFp); 182df930be7Sderaadt (void) fflush(DbgFp); 183df930be7Sderaadt 184df930be7Sderaadt (void) sigsetmask(omask); /* reset old signal mask */ 185df930be7Sderaadt } 186df930be7Sderaadt 187df930be7Sderaadt 188df930be7Sderaadt /* 189df930be7Sderaadt ** GetEtherAddr -- convert an RMP (Ethernet) address into a string. 190df930be7Sderaadt ** 191df930be7Sderaadt ** An RMP BOOT packet has been received. Look at the type field 192df930be7Sderaadt ** and process Boot Requests, Read Requests, and Boot Complete 193df930be7Sderaadt ** packets. Any other type will be dropped with a warning msg. 194df930be7Sderaadt ** 195df930be7Sderaadt ** Parameters: 196df930be7Sderaadt ** addr - array of RMP_ADDRLEN bytes. 197df930be7Sderaadt ** 198df930be7Sderaadt ** Returns: 199df930be7Sderaadt ** Pointer to static string representation of `addr'. 200df930be7Sderaadt ** 201df930be7Sderaadt ** Side Effects: 202df930be7Sderaadt ** None. 203df930be7Sderaadt ** 204df930be7Sderaadt ** Warnings: 205df930be7Sderaadt ** - The return value points to a static buffer; it must 206df930be7Sderaadt ** be copied if it's to be saved. 207df930be7Sderaadt */ 208df930be7Sderaadt char * 209df930be7Sderaadt GetEtherAddr(addr) 210df930be7Sderaadt u_int8_t *addr; 211df930be7Sderaadt { 212df930be7Sderaadt static char Hex[] = "0123456789abcdef"; 213df930be7Sderaadt static char etherstr[RMP_ADDRLEN*3]; 214df930be7Sderaadt register int i; 215df930be7Sderaadt register char *cp; 216df930be7Sderaadt 217df930be7Sderaadt /* 218df930be7Sderaadt * For each byte in `addr', convert it to "<hexchar><hexchar>:". 219df930be7Sderaadt * The last byte does not get a trailing `:' appended. 220df930be7Sderaadt */ 221df930be7Sderaadt i = 0; 222df930be7Sderaadt cp = etherstr; 223df930be7Sderaadt for(;;) { 224df930be7Sderaadt *cp++ = Hex[*addr >> 4 & 0xf]; 225df930be7Sderaadt *cp++ = Hex[*addr++ & 0xf]; 226df930be7Sderaadt if (++i == RMP_ADDRLEN) 227df930be7Sderaadt break; 228df930be7Sderaadt *cp++ = ':'; 229df930be7Sderaadt } 230df930be7Sderaadt *cp = '\0'; 231df930be7Sderaadt 232df930be7Sderaadt return(etherstr); 233df930be7Sderaadt } 234df930be7Sderaadt 235df930be7Sderaadt 236df930be7Sderaadt /* 237df930be7Sderaadt ** DispFlnm -- Print a string of bytes to DbgFp (often, a file name). 238df930be7Sderaadt ** 239df930be7Sderaadt ** Parameters: 240df930be7Sderaadt ** size - number of bytes to print. 241df930be7Sderaadt ** flnm - address of first byte. 242df930be7Sderaadt ** 243df930be7Sderaadt ** Returns: 244df930be7Sderaadt ** Nothing. 245df930be7Sderaadt ** 246df930be7Sderaadt ** Side Effects: 247df930be7Sderaadt ** - Characters are sent to `DbgFp'. 248df930be7Sderaadt */ 249df930be7Sderaadt void 250df930be7Sderaadt DspFlnm(size, flnm) 251df930be7Sderaadt register u_int size; 252df930be7Sderaadt register char *flnm; 253df930be7Sderaadt { 254df930be7Sderaadt register int i; 255df930be7Sderaadt 256df930be7Sderaadt (void) fprintf(DbgFp, "\n\t\tFile Name (%u): <", size); 257df930be7Sderaadt for (i = 0; i < size; i++) 258df930be7Sderaadt (void) fputc(*flnm++, DbgFp); 259df930be7Sderaadt (void) fputs(">\n", DbgFp); 260df930be7Sderaadt } 261df930be7Sderaadt 262df930be7Sderaadt 263df930be7Sderaadt /* 264df930be7Sderaadt ** NewClient -- allocate memory for a new CLIENT. 265df930be7Sderaadt ** 266df930be7Sderaadt ** Parameters: 267df930be7Sderaadt ** addr - RMP (Ethernet) address of new client. 268df930be7Sderaadt ** 269df930be7Sderaadt ** Returns: 270df930be7Sderaadt ** Ptr to new CLIENT or NULL if we ran out of memory. 271df930be7Sderaadt ** 272df930be7Sderaadt ** Side Effects: 273df930be7Sderaadt ** - Memory will be malloc'd for the new CLIENT. 274df930be7Sderaadt ** - If malloc() fails, a log message will be generated. 275df930be7Sderaadt */ 276df930be7Sderaadt CLIENT * 277df930be7Sderaadt NewClient(addr) 278df930be7Sderaadt u_int8_t *addr; 279df930be7Sderaadt { 280df930be7Sderaadt CLIENT *ctmp; 281df930be7Sderaadt 282df930be7Sderaadt if ((ctmp = (CLIENT *) malloc(sizeof(CLIENT))) == NULL) { 283df930be7Sderaadt syslog(LOG_ERR, "NewClient: out of memory (%s)", 284df930be7Sderaadt GetEtherAddr(addr)); 285df930be7Sderaadt return(NULL); 286df930be7Sderaadt } 287df930be7Sderaadt 288df930be7Sderaadt bzero(ctmp, sizeof(CLIENT)); 289df930be7Sderaadt bcopy(addr, &ctmp->addr[0], RMP_ADDRLEN); 290df930be7Sderaadt return(ctmp); 291df930be7Sderaadt } 292df930be7Sderaadt 293df930be7Sderaadt /* 294df930be7Sderaadt ** FreeClient -- free linked list of Clients. 295df930be7Sderaadt ** 296df930be7Sderaadt ** Parameters: 297df930be7Sderaadt ** None. 298df930be7Sderaadt ** 299df930be7Sderaadt ** Returns: 300df930be7Sderaadt ** Nothing. 301df930be7Sderaadt ** 302df930be7Sderaadt ** Side Effects: 303df930be7Sderaadt ** - All malloc'd memory associated with the linked list of 304df930be7Sderaadt ** CLIENTS will be free'd; `Clients' will be set to NULL. 305df930be7Sderaadt ** 306df930be7Sderaadt ** Warnings: 307df930be7Sderaadt ** - This routine must be called with SIGHUP blocked. 308df930be7Sderaadt */ 309df930be7Sderaadt void 310df930be7Sderaadt FreeClients() 311df930be7Sderaadt { 312df930be7Sderaadt register CLIENT *ctmp; 313df930be7Sderaadt 314df930be7Sderaadt while (Clients != NULL) { 315df930be7Sderaadt ctmp = Clients; 316df930be7Sderaadt Clients = Clients->next; 317df930be7Sderaadt FreeClient(ctmp); 318df930be7Sderaadt } 319df930be7Sderaadt } 320df930be7Sderaadt 321df930be7Sderaadt /* 322df930be7Sderaadt ** NewStr -- allocate memory for a character array. 323df930be7Sderaadt ** 324df930be7Sderaadt ** Parameters: 325df930be7Sderaadt ** str - null terminated character array. 326df930be7Sderaadt ** 327df930be7Sderaadt ** Returns: 328df930be7Sderaadt ** Ptr to new character array or NULL if we ran out of memory. 329df930be7Sderaadt ** 330df930be7Sderaadt ** Side Effects: 331df930be7Sderaadt ** - Memory will be malloc'd for the new character array. 332df930be7Sderaadt ** - If malloc() fails, a log message will be generated. 333df930be7Sderaadt */ 334df930be7Sderaadt char * 335df930be7Sderaadt NewStr(str) 336df930be7Sderaadt char *str; 337df930be7Sderaadt { 338df930be7Sderaadt char *stmp; 339df930be7Sderaadt 340df930be7Sderaadt if ((stmp = (char *)malloc((unsigned) (strlen(str)+1))) == NULL) { 341df930be7Sderaadt syslog(LOG_ERR, "NewStr: out of memory (%s)", str); 342df930be7Sderaadt return(NULL); 343df930be7Sderaadt } 344df930be7Sderaadt 345df930be7Sderaadt (void) strcpy(stmp, str); 346df930be7Sderaadt return(stmp); 347df930be7Sderaadt } 348df930be7Sderaadt 349df930be7Sderaadt /* 350df930be7Sderaadt ** To save time, NewConn and FreeConn maintain a cache of one RMPCONN 351df930be7Sderaadt ** in `LastFree' (defined below). 352df930be7Sderaadt */ 353df930be7Sderaadt 354df930be7Sderaadt static RMPCONN *LastFree = NULL; 355df930be7Sderaadt 356df930be7Sderaadt /* 357df930be7Sderaadt ** NewConn -- allocate memory for a new RMPCONN connection. 358df930be7Sderaadt ** 359df930be7Sderaadt ** Parameters: 360df930be7Sderaadt ** rconn - initialization template for new connection. 361df930be7Sderaadt ** 362df930be7Sderaadt ** Returns: 363df930be7Sderaadt ** Ptr to new RMPCONN or NULL if we ran out of memory. 364df930be7Sderaadt ** 365df930be7Sderaadt ** Side Effects: 366df930be7Sderaadt ** - Memory may be malloc'd for the new RMPCONN (if not cached). 367df930be7Sderaadt ** - If malloc() fails, a log message will be generated. 368df930be7Sderaadt */ 369df930be7Sderaadt RMPCONN * 370df930be7Sderaadt NewConn(rconn) 371df930be7Sderaadt RMPCONN *rconn; 372df930be7Sderaadt { 373df930be7Sderaadt RMPCONN *rtmp; 374df930be7Sderaadt 375df930be7Sderaadt if (LastFree == NULL) { /* nothing cached; make a new one */ 376df930be7Sderaadt if ((rtmp = (RMPCONN *) malloc(sizeof(RMPCONN))) == NULL) { 377df930be7Sderaadt syslog(LOG_ERR, "NewConn: out of memory (%s)", 378df930be7Sderaadt EnetStr(rconn)); 379df930be7Sderaadt return(NULL); 380df930be7Sderaadt } 381df930be7Sderaadt } else { /* use the cached RMPCONN */ 382df930be7Sderaadt rtmp = LastFree; 383df930be7Sderaadt LastFree = NULL; 384df930be7Sderaadt } 385df930be7Sderaadt 386df930be7Sderaadt /* 387df930be7Sderaadt * Copy template into `rtmp', init file descriptor to `-1' and 388df930be7Sderaadt * set ptr to next elem NULL. 389df930be7Sderaadt */ 390df930be7Sderaadt bcopy((char *)rconn, (char *)rtmp, sizeof(RMPCONN)); 391df930be7Sderaadt rtmp->bootfd = -1; 392df930be7Sderaadt rtmp->next = NULL; 393df930be7Sderaadt 394df930be7Sderaadt return(rtmp); 395df930be7Sderaadt } 396df930be7Sderaadt 397df930be7Sderaadt /* 398df930be7Sderaadt ** FreeConn -- Free memory associated with an RMPCONN connection. 399df930be7Sderaadt ** 400df930be7Sderaadt ** Parameters: 401df930be7Sderaadt ** rtmp - ptr to RMPCONN to be free'd. 402df930be7Sderaadt ** 403df930be7Sderaadt ** Returns: 404df930be7Sderaadt ** Nothing. 405df930be7Sderaadt ** 406df930be7Sderaadt ** Side Effects: 407df930be7Sderaadt ** - Memory associated with `rtmp' may be free'd (or cached). 408df930be7Sderaadt ** - File desc associated with `rtmp->bootfd' will be closed. 409df930be7Sderaadt */ 410df930be7Sderaadt void 411df930be7Sderaadt FreeConn(rtmp) 412df930be7Sderaadt register RMPCONN *rtmp; 413df930be7Sderaadt { 414df930be7Sderaadt /* 415df930be7Sderaadt * If the file descriptor is in use, close the file. 416df930be7Sderaadt */ 417df930be7Sderaadt if (rtmp->bootfd >= 0) { 418df930be7Sderaadt (void) close(rtmp->bootfd); 419df930be7Sderaadt rtmp->bootfd = -1; 420df930be7Sderaadt } 421df930be7Sderaadt 422df930be7Sderaadt if (LastFree == NULL) /* cache for next time */ 423df930be7Sderaadt rtmp = LastFree; 424df930be7Sderaadt else /* already one cached; free this one */ 425df930be7Sderaadt free((char *)rtmp); 426df930be7Sderaadt } 427df930be7Sderaadt 428df930be7Sderaadt /* 429df930be7Sderaadt ** FreeConns -- free linked list of RMPCONN connections. 430df930be7Sderaadt ** 431df930be7Sderaadt ** Parameters: 432df930be7Sderaadt ** None. 433df930be7Sderaadt ** 434df930be7Sderaadt ** Returns: 435df930be7Sderaadt ** Nothing. 436df930be7Sderaadt ** 437df930be7Sderaadt ** Side Effects: 438df930be7Sderaadt ** - All malloc'd memory associated with the linked list of 439df930be7Sderaadt ** connections will be free'd; `RmpConns' will be set to NULL. 440df930be7Sderaadt ** - If LastFree is != NULL, it too will be free'd & NULL'd. 441df930be7Sderaadt ** 442df930be7Sderaadt ** Warnings: 443df930be7Sderaadt ** - This routine must be called with SIGHUP blocked. 444df930be7Sderaadt */ 445df930be7Sderaadt void 446df930be7Sderaadt FreeConns() 447df930be7Sderaadt { 448df930be7Sderaadt register RMPCONN *rtmp; 449df930be7Sderaadt 450df930be7Sderaadt while (RmpConns != NULL) { 451df930be7Sderaadt rtmp = RmpConns; 452df930be7Sderaadt RmpConns = RmpConns->next; 453df930be7Sderaadt FreeConn(rtmp); 454df930be7Sderaadt } 455df930be7Sderaadt 456df930be7Sderaadt if (LastFree != NULL) { 457df930be7Sderaadt free((char *)LastFree); 458df930be7Sderaadt LastFree = NULL; 459df930be7Sderaadt } 460df930be7Sderaadt } 461df930be7Sderaadt 462df930be7Sderaadt /* 463df930be7Sderaadt ** AddConn -- Add a connection to the linked list of connections. 464df930be7Sderaadt ** 465df930be7Sderaadt ** Parameters: 466df930be7Sderaadt ** rconn - connection to be added. 467df930be7Sderaadt ** 468df930be7Sderaadt ** Returns: 469df930be7Sderaadt ** Nothing. 470df930be7Sderaadt ** 471df930be7Sderaadt ** Side Effects: 472df930be7Sderaadt ** - RmpConn will point to new connection. 473df930be7Sderaadt ** 474df930be7Sderaadt ** Warnings: 475df930be7Sderaadt ** - This routine must be called with SIGHUP blocked. 476df930be7Sderaadt */ 477df930be7Sderaadt void 478df930be7Sderaadt AddConn(rconn) 479df930be7Sderaadt register RMPCONN *rconn; 480df930be7Sderaadt { 481df930be7Sderaadt if (RmpConns != NULL) 482df930be7Sderaadt rconn->next = RmpConns; 483df930be7Sderaadt RmpConns = rconn; 484df930be7Sderaadt } 485df930be7Sderaadt 486df930be7Sderaadt /* 487df930be7Sderaadt ** FindConn -- Find a connection in the linked list of connections. 488df930be7Sderaadt ** 489df930be7Sderaadt ** We use the RMP (Ethernet) address as the basis for determining 490df930be7Sderaadt ** if this is the same connection. According to the Remote Maint 491df930be7Sderaadt ** Protocol, we can only have one connection with any machine. 492df930be7Sderaadt ** 493df930be7Sderaadt ** Parameters: 494df930be7Sderaadt ** rconn - connection to be found. 495df930be7Sderaadt ** 496df930be7Sderaadt ** Returns: 497df930be7Sderaadt ** Matching connection from linked list or NULL if not found. 498df930be7Sderaadt ** 499df930be7Sderaadt ** Side Effects: 500df930be7Sderaadt ** None. 501df930be7Sderaadt ** 502df930be7Sderaadt ** Warnings: 503df930be7Sderaadt ** - This routine must be called with SIGHUP blocked. 504df930be7Sderaadt */ 505df930be7Sderaadt RMPCONN * 506df930be7Sderaadt FindConn(rconn) 507df930be7Sderaadt register RMPCONN *rconn; 508df930be7Sderaadt { 509df930be7Sderaadt register RMPCONN *rtmp; 510df930be7Sderaadt 511df930be7Sderaadt for (rtmp = RmpConns; rtmp != NULL; rtmp = rtmp->next) 512df930be7Sderaadt if (bcmp((char *)&rconn->rmp.hp_hdr.saddr[0], 513df930be7Sderaadt (char *)&rtmp->rmp.hp_hdr.saddr[0], RMP_ADDRLEN) == 0) 514df930be7Sderaadt break; 515df930be7Sderaadt 516df930be7Sderaadt return(rtmp); 517df930be7Sderaadt } 518df930be7Sderaadt 519df930be7Sderaadt /* 520df930be7Sderaadt ** RemoveConn -- Remove a connection from the linked list of connections. 521df930be7Sderaadt ** 522df930be7Sderaadt ** Parameters: 523df930be7Sderaadt ** rconn - connection to be removed. 524df930be7Sderaadt ** 525df930be7Sderaadt ** Returns: 526df930be7Sderaadt ** Nothing. 527df930be7Sderaadt ** 528df930be7Sderaadt ** Side Effects: 529df930be7Sderaadt ** - If found, an RMPCONN will cease to exist and it will 530df930be7Sderaadt ** be removed from the linked list. 531df930be7Sderaadt ** 532df930be7Sderaadt ** Warnings: 533df930be7Sderaadt ** - This routine must be called with SIGHUP blocked. 534df930be7Sderaadt */ 535df930be7Sderaadt void 536df930be7Sderaadt RemoveConn(rconn) 537df930be7Sderaadt register RMPCONN *rconn; 538df930be7Sderaadt { 539df930be7Sderaadt register RMPCONN *thisrconn, *lastrconn; 540df930be7Sderaadt 541df930be7Sderaadt if (RmpConns == rconn) { /* easy case */ 542df930be7Sderaadt RmpConns = RmpConns->next; 543df930be7Sderaadt FreeConn(rconn); 544df930be7Sderaadt } else { /* must traverse linked list */ 545df930be7Sderaadt lastrconn = RmpConns; /* set back ptr */ 546df930be7Sderaadt thisrconn = lastrconn->next; /* set current ptr */ 547df930be7Sderaadt while (thisrconn != NULL) { 548df930be7Sderaadt if (rconn == thisrconn) { /* found it */ 549df930be7Sderaadt lastrconn->next = thisrconn->next; 550df930be7Sderaadt FreeConn(thisrconn); 551df930be7Sderaadt break; 552df930be7Sderaadt } 553df930be7Sderaadt lastrconn = thisrconn; 554df930be7Sderaadt thisrconn = thisrconn->next; 555df930be7Sderaadt } 556df930be7Sderaadt } 557df930be7Sderaadt } 558