1*ae99bc57Sderaadt /* 2*ae99bc57Sderaadt * This code is not copyright, and is placed in the public domain. 3*ae99bc57Sderaadt * Feel free to use and modify. Please send modifications and/or 4*ae99bc57Sderaadt * suggestions + bug fixes to Klas Heggemann <klas@nada.kth.se> 5*ae99bc57Sderaadt * 6*ae99bc57Sderaadt * Various small changes by Theo de Raadt <deraadt@fsa.ca> 7*ae99bc57Sderaadt * 8*ae99bc57Sderaadt * $Id: bootparamd.c,v 1.1 1994/01/08 13:22:04 deraadt Exp $ 9*ae99bc57Sderaadt */ 10*ae99bc57Sderaadt 11*ae99bc57Sderaadt #include <sys/types.h> 12*ae99bc57Sderaadt #include <sys/ioctl.h> 13*ae99bc57Sderaadt #include <sys/stat.h> 14*ae99bc57Sderaadt #include <sys/socket.h> 15*ae99bc57Sderaadt #include <rpc/rpc.h> 16*ae99bc57Sderaadt #include <rpcsvc/bootparam_prot.h> 17*ae99bc57Sderaadt #include <stdio.h> 18*ae99bc57Sderaadt #include <netdb.h> 19*ae99bc57Sderaadt #include <ctype.h> 20*ae99bc57Sderaadt #include <syslog.h> 21*ae99bc57Sderaadt 22*ae99bc57Sderaadt #define MAXLEN 800 23*ae99bc57Sderaadt 24*ae99bc57Sderaadt struct hostent *he; 25*ae99bc57Sderaadt static char buffer[MAXLEN]; 26*ae99bc57Sderaadt static char hostname[MAX_MACHINE_NAME]; 27*ae99bc57Sderaadt static char askname[MAX_MACHINE_NAME]; 28*ae99bc57Sderaadt static char path[MAX_PATH_LEN]; 29*ae99bc57Sderaadt static char domain_name[MAX_MACHINE_NAME]; 30*ae99bc57Sderaadt 31*ae99bc57Sderaadt extern void bootparamprog_1(); 32*ae99bc57Sderaadt 33*ae99bc57Sderaadt int debug = 0; 34*ae99bc57Sderaadt int dolog = 0; 35*ae99bc57Sderaadt unsigned long route_addr, inet_addr(); 36*ae99bc57Sderaadt struct sockaddr_in my_addr; 37*ae99bc57Sderaadt char *progname; 38*ae99bc57Sderaadt char *bootpfile = "/etc/bootparams"; 39*ae99bc57Sderaadt 40*ae99bc57Sderaadt extern char *optarg; 41*ae99bc57Sderaadt extern int optind; 42*ae99bc57Sderaadt 43*ae99bc57Sderaadt void 44*ae99bc57Sderaadt usage() 45*ae99bc57Sderaadt { 46*ae99bc57Sderaadt fprintf(stderr, 47*ae99bc57Sderaadt "usage: rpc.bootparamd [-d] [-s] [-r router] [-f bootparmsfile]\n"); 48*ae99bc57Sderaadt } 49*ae99bc57Sderaadt 50*ae99bc57Sderaadt 51*ae99bc57Sderaadt /* 52*ae99bc57Sderaadt * ever familiar 53*ae99bc57Sderaadt */ 54*ae99bc57Sderaadt int 55*ae99bc57Sderaadt main(argc, argv) 56*ae99bc57Sderaadt int argc; 57*ae99bc57Sderaadt char **argv; 58*ae99bc57Sderaadt { 59*ae99bc57Sderaadt SVCXPRT *transp; 60*ae99bc57Sderaadt int i, s, pid; 61*ae99bc57Sderaadt char *rindex(); 62*ae99bc57Sderaadt struct hostent *he; 63*ae99bc57Sderaadt struct stat buf; 64*ae99bc57Sderaadt char *optstring; 65*ae99bc57Sderaadt char c; 66*ae99bc57Sderaadt 67*ae99bc57Sderaadt progname = rindex(argv[0], '/'); 68*ae99bc57Sderaadt if (progname) 69*ae99bc57Sderaadt progname++; 70*ae99bc57Sderaadt else 71*ae99bc57Sderaadt progname = argv[0]; 72*ae99bc57Sderaadt 73*ae99bc57Sderaadt while ((c = getopt(argc, argv, "dsr:f:")) != EOF) 74*ae99bc57Sderaadt switch (c) { 75*ae99bc57Sderaadt case 'd': 76*ae99bc57Sderaadt debug = 1; 77*ae99bc57Sderaadt break; 78*ae99bc57Sderaadt case 'r': 79*ae99bc57Sderaadt if (isdigit(*optarg)) { 80*ae99bc57Sderaadt route_addr = inet_addr(optarg); 81*ae99bc57Sderaadt break; 82*ae99bc57Sderaadt } 83*ae99bc57Sderaadt he = gethostbyname(optarg); 84*ae99bc57Sderaadt if (!he) { 85*ae99bc57Sderaadt fprintf(stderr, "%s: No such host %s\n", 86*ae99bc57Sderaadt progname, optarg); 87*ae99bc57Sderaadt usage(); 88*ae99bc57Sderaadt exit(1); 89*ae99bc57Sderaadt } 90*ae99bc57Sderaadt bcopy(he->h_addr, (char *) &route_addr, sizeof(route_addr)); 91*ae99bc57Sderaadt break; 92*ae99bc57Sderaadt case 'f': 93*ae99bc57Sderaadt bootpfile = optarg; 94*ae99bc57Sderaadt break; 95*ae99bc57Sderaadt case 's': 96*ae99bc57Sderaadt dolog = 1; 97*ae99bc57Sderaadt #ifndef LOG_DAEMON 98*ae99bc57Sderaadt openlog(progname, 0, 0); 99*ae99bc57Sderaadt #else 100*ae99bc57Sderaadt openlog(progname, 0, LOG_DAEMON); 101*ae99bc57Sderaadt setlogmask(LOG_UPTO(LOG_NOTICE)); 102*ae99bc57Sderaadt #endif 103*ae99bc57Sderaadt break; 104*ae99bc57Sderaadt default: 105*ae99bc57Sderaadt usage(); 106*ae99bc57Sderaadt exit(1); 107*ae99bc57Sderaadt } 108*ae99bc57Sderaadt 109*ae99bc57Sderaadt if (stat(bootpfile, &buf)) { 110*ae99bc57Sderaadt fprintf(stderr, "%s: ", progname); 111*ae99bc57Sderaadt perror(bootpfile); 112*ae99bc57Sderaadt exit(1); 113*ae99bc57Sderaadt } 114*ae99bc57Sderaadt if (!route_addr) { 115*ae99bc57Sderaadt get_myaddress(&my_addr); 116*ae99bc57Sderaadt bcopy(&my_addr.sin_addr.s_addr, &route_addr, sizeof(route_addr)); 117*ae99bc57Sderaadt } 118*ae99bc57Sderaadt if (!debug) 119*ae99bc57Sderaadt daemon(); 120*ae99bc57Sderaadt 121*ae99bc57Sderaadt (void) pmap_unset(BOOTPARAMPROG, BOOTPARAMVERS); 122*ae99bc57Sderaadt 123*ae99bc57Sderaadt transp = svcudp_create(RPC_ANYSOCK); 124*ae99bc57Sderaadt if (transp == NULL) { 125*ae99bc57Sderaadt fprintf(stderr, "cannot create udp service.\n"); 126*ae99bc57Sderaadt exit(1); 127*ae99bc57Sderaadt } 128*ae99bc57Sderaadt if (!svc_register(transp, BOOTPARAMPROG, BOOTPARAMVERS, 129*ae99bc57Sderaadt bootparamprog_1, IPPROTO_UDP)) { 130*ae99bc57Sderaadt fprintf(stderr, 131*ae99bc57Sderaadt "bootparamd: unable to register BOOTPARAMPROG version %d, udp)\n", 132*ae99bc57Sderaadt BOOTPARAMVERS); 133*ae99bc57Sderaadt exit(1); 134*ae99bc57Sderaadt } 135*ae99bc57Sderaadt svc_run(); 136*ae99bc57Sderaadt fprintf(stderr, "svc_run returned\n"); 137*ae99bc57Sderaadt exit(1); 138*ae99bc57Sderaadt } 139*ae99bc57Sderaadt 140*ae99bc57Sderaadt bp_whoami_res * 141*ae99bc57Sderaadt bootparamproc_whoami_1(whoami) 142*ae99bc57Sderaadt bp_whoami_arg *whoami; 143*ae99bc57Sderaadt { 144*ae99bc57Sderaadt long haddr; 145*ae99bc57Sderaadt static bp_whoami_res res; 146*ae99bc57Sderaadt if (debug) 147*ae99bc57Sderaadt fprintf(stderr, "whoami got question for %d.%d.%d.%d\n", 148*ae99bc57Sderaadt 255 & whoami->client_address.bp_address_u.ip_addr.net, 149*ae99bc57Sderaadt 255 & whoami->client_address.bp_address_u.ip_addr.host, 150*ae99bc57Sderaadt 255 & whoami->client_address.bp_address_u.ip_addr.lh, 151*ae99bc57Sderaadt 255 & whoami->client_address.bp_address_u.ip_addr.impno); 152*ae99bc57Sderaadt if (dolog) 153*ae99bc57Sderaadt syslog(LOG_NOTICE, "whoami got question for %d.%d.%d.%d\n", 154*ae99bc57Sderaadt 255 & whoami->client_address.bp_address_u.ip_addr.net, 155*ae99bc57Sderaadt 255 & whoami->client_address.bp_address_u.ip_addr.host, 156*ae99bc57Sderaadt 255 & whoami->client_address.bp_address_u.ip_addr.lh, 157*ae99bc57Sderaadt 255 & whoami->client_address.bp_address_u.ip_addr.impno); 158*ae99bc57Sderaadt 159*ae99bc57Sderaadt bcopy((char *) &whoami->client_address.bp_address_u.ip_addr, (char *) &haddr, 160*ae99bc57Sderaadt sizeof(haddr)); 161*ae99bc57Sderaadt he = gethostbyaddr((char *) &haddr, sizeof(haddr), AF_INET); 162*ae99bc57Sderaadt if (!he) 163*ae99bc57Sderaadt goto failed; 164*ae99bc57Sderaadt 165*ae99bc57Sderaadt if (debug) 166*ae99bc57Sderaadt fprintf(stderr, "This is host %s\n", he->h_name); 167*ae99bc57Sderaadt if (dolog) 168*ae99bc57Sderaadt syslog(LOG_NOTICE, "This is host %s\n", he->h_name); 169*ae99bc57Sderaadt 170*ae99bc57Sderaadt strcpy(askname, he->h_name); 171*ae99bc57Sderaadt if (checkhost(askname, hostname)) { 172*ae99bc57Sderaadt res.client_name = hostname; 173*ae99bc57Sderaadt getdomainname(domain_name, MAX_MACHINE_NAME); 174*ae99bc57Sderaadt res.domain_name = domain_name; 175*ae99bc57Sderaadt 176*ae99bc57Sderaadt if (res.router_address.address_type != IP_ADDR_TYPE) { 177*ae99bc57Sderaadt res.router_address.address_type = IP_ADDR_TYPE; 178*ae99bc57Sderaadt bcopy(&route_addr, &res.router_address.bp_address_u.ip_addr, 4); 179*ae99bc57Sderaadt } 180*ae99bc57Sderaadt if (debug) 181*ae99bc57Sderaadt fprintf(stderr, "Returning %s %s %d.%d.%d.%d\n", 182*ae99bc57Sderaadt res.client_name, res.domain_name, 183*ae99bc57Sderaadt 255 & res.router_address.bp_address_u.ip_addr.net, 184*ae99bc57Sderaadt 255 & res.router_address.bp_address_u.ip_addr.host, 185*ae99bc57Sderaadt 255 & res.router_address.bp_address_u.ip_addr.lh, 186*ae99bc57Sderaadt 255 & res.router_address.bp_address_u.ip_addr.impno); 187*ae99bc57Sderaadt if (dolog) 188*ae99bc57Sderaadt syslog(LOG_NOTICE, "Returning %s %s %d.%d.%d.%d\n", 189*ae99bc57Sderaadt res.client_name, res.domain_name, 190*ae99bc57Sderaadt 255 & res.router_address.bp_address_u.ip_addr.net, 191*ae99bc57Sderaadt 255 & res.router_address.bp_address_u.ip_addr.host, 192*ae99bc57Sderaadt 255 & res.router_address.bp_address_u.ip_addr.lh, 193*ae99bc57Sderaadt 255 & res.router_address.bp_address_u.ip_addr.impno); 194*ae99bc57Sderaadt 195*ae99bc57Sderaadt return (&res); 196*ae99bc57Sderaadt } 197*ae99bc57Sderaadt failed: 198*ae99bc57Sderaadt if (debug) 199*ae99bc57Sderaadt fprintf(stderr, "whoami failed\n"); 200*ae99bc57Sderaadt if (dolog) 201*ae99bc57Sderaadt syslog(LOG_NOTICE, "whoami failed\n"); 202*ae99bc57Sderaadt return (NULL); 203*ae99bc57Sderaadt } 204*ae99bc57Sderaadt 205*ae99bc57Sderaadt 206*ae99bc57Sderaadt bp_getfile_res * 207*ae99bc57Sderaadt bootparamproc_getfile_1(getfile) 208*ae99bc57Sderaadt bp_getfile_arg *getfile; 209*ae99bc57Sderaadt { 210*ae99bc57Sderaadt char *where, *index(); 211*ae99bc57Sderaadt static bp_getfile_res res; 212*ae99bc57Sderaadt 213*ae99bc57Sderaadt if (debug) 214*ae99bc57Sderaadt fprintf(stderr, "getfile got question for \"%s\" and file \"%s\"\n", 215*ae99bc57Sderaadt getfile->client_name, getfile->file_id); 216*ae99bc57Sderaadt 217*ae99bc57Sderaadt if (dolog) 218*ae99bc57Sderaadt syslog(LOG_NOTICE, "getfile got question for \"%s\" and file \"%s\"\n", 219*ae99bc57Sderaadt getfile->client_name, getfile->file_id); 220*ae99bc57Sderaadt 221*ae99bc57Sderaadt he = NULL; 222*ae99bc57Sderaadt he = gethostbyname(getfile->client_name); 223*ae99bc57Sderaadt if (!he) 224*ae99bc57Sderaadt goto failed; 225*ae99bc57Sderaadt 226*ae99bc57Sderaadt strcpy(askname, he->h_name); 227*ae99bc57Sderaadt if (getthefile(askname, getfile->file_id, buffer)) { 228*ae99bc57Sderaadt if (where = index(buffer, ':')) { 229*ae99bc57Sderaadt /* buffer is re-written to contain the name of the 230*ae99bc57Sderaadt * info of file */ 231*ae99bc57Sderaadt strncpy(hostname, buffer, where - buffer); 232*ae99bc57Sderaadt hostname[where - buffer] = '\0'; 233*ae99bc57Sderaadt where++; 234*ae99bc57Sderaadt strcpy(path, where); 235*ae99bc57Sderaadt he = gethostbyname(hostname); 236*ae99bc57Sderaadt if (!he) 237*ae99bc57Sderaadt goto failed; 238*ae99bc57Sderaadt bcopy(he->h_addr, &res.server_address.bp_address_u.ip_addr, 4); 239*ae99bc57Sderaadt res.server_name = hostname; 240*ae99bc57Sderaadt res.server_path = path; 241*ae99bc57Sderaadt res.server_address.address_type = IP_ADDR_TYPE; 242*ae99bc57Sderaadt } else { /* special for dump, answer with null strings */ 243*ae99bc57Sderaadt if (!strcmp(getfile->file_id, "dump")) { 244*ae99bc57Sderaadt res.server_name[0] = '\0'; 245*ae99bc57Sderaadt res.server_path[0] = '\0'; 246*ae99bc57Sderaadt bzero(&res.server_address.bp_address_u.ip_addr, 4); 247*ae99bc57Sderaadt } else 248*ae99bc57Sderaadt goto failed; 249*ae99bc57Sderaadt } 250*ae99bc57Sderaadt if (debug) 251*ae99bc57Sderaadt fprintf(stderr, 252*ae99bc57Sderaadt "returning server:%s path:%s address: %d.%d.%d.%d\n", 253*ae99bc57Sderaadt res.server_name, res.server_path, 254*ae99bc57Sderaadt 255 & res.server_address.bp_address_u.ip_addr.net, 255*ae99bc57Sderaadt 255 & res.server_address.bp_address_u.ip_addr.host, 256*ae99bc57Sderaadt 255 & res.server_address.bp_address_u.ip_addr.lh, 257*ae99bc57Sderaadt 255 & res.server_address.bp_address_u.ip_addr.impno); 258*ae99bc57Sderaadt if (dolog) 259*ae99bc57Sderaadt syslog(LOG_NOTICE, 260*ae99bc57Sderaadt "returning server:%s path:%s address: %d.%d.%d.%d\n", 261*ae99bc57Sderaadt res.server_name, res.server_path, 262*ae99bc57Sderaadt 255 & res.server_address.bp_address_u.ip_addr.net, 263*ae99bc57Sderaadt 255 & res.server_address.bp_address_u.ip_addr.host, 264*ae99bc57Sderaadt 255 & res.server_address.bp_address_u.ip_addr.lh, 265*ae99bc57Sderaadt 255 & res.server_address.bp_address_u.ip_addr.impno); 266*ae99bc57Sderaadt return (&res); 267*ae99bc57Sderaadt } 268*ae99bc57Sderaadt failed: 269*ae99bc57Sderaadt if (debug) 270*ae99bc57Sderaadt fprintf(stderr, "getfile failed for %s\n", getfile->client_name); 271*ae99bc57Sderaadt if (dolog) 272*ae99bc57Sderaadt syslog(LOG_NOTICE, 273*ae99bc57Sderaadt "getfile failed for %s\n", getfile->client_name); 274*ae99bc57Sderaadt return (NULL); 275*ae99bc57Sderaadt } 276*ae99bc57Sderaadt 277*ae99bc57Sderaadt 278*ae99bc57Sderaadt /* 279*ae99bc57Sderaadt * getthefile return 1 and fills the buffer with the information 280*ae99bc57Sderaadt * of the file, e g "host:/export/root/client" if it can be found. 281*ae99bc57Sderaadt * If the host is in the database, but the file is not, the buffer 282*ae99bc57Sderaadt * will be empty. (This makes it possible to give the special 283*ae99bc57Sderaadt * empty answer for the file "dump") 284*ae99bc57Sderaadt */ 285*ae99bc57Sderaadt getthefile(askname, fileid, buffer) 286*ae99bc57Sderaadt char *askname; 287*ae99bc57Sderaadt char *fileid, *buffer; 288*ae99bc57Sderaadt { 289*ae99bc57Sderaadt FILE *bpf; 290*ae99bc57Sderaadt char *where; 291*ae99bc57Sderaadt 292*ae99bc57Sderaadt int ch, pch, fid_len, res = 0; 293*ae99bc57Sderaadt int match = 0; 294*ae99bc57Sderaadt char info[MAX_FILEID + MAX_PATH_LEN + MAX_MACHINE_NAME + 3]; 295*ae99bc57Sderaadt 296*ae99bc57Sderaadt bpf = fopen(bootpfile, "r"); 297*ae99bc57Sderaadt if (!bpf) { 298*ae99bc57Sderaadt fprintf(stderr, "No %s\n", bootpfile); 299*ae99bc57Sderaadt exit(1); 300*ae99bc57Sderaadt } 301*ae99bc57Sderaadt while (fscanf(bpf, "%s", hostname) > 0 && !match) { 302*ae99bc57Sderaadt if (*hostname != '#') { /* comment */ 303*ae99bc57Sderaadt if (!strcmp(hostname, askname)) { 304*ae99bc57Sderaadt match = 1; 305*ae99bc57Sderaadt } else { 306*ae99bc57Sderaadt he = gethostbyname(hostname); 307*ae99bc57Sderaadt if (he && !strcmp(he->h_name, askname)) 308*ae99bc57Sderaadt match = 1; 309*ae99bc57Sderaadt } 310*ae99bc57Sderaadt } 311*ae99bc57Sderaadt /* skip to next entry */ 312*ae99bc57Sderaadt if (match) 313*ae99bc57Sderaadt break; 314*ae99bc57Sderaadt pch = ch = getc(bpf); 315*ae99bc57Sderaadt while (!(ch == '\n' && pch != '\\') && ch != EOF) { 316*ae99bc57Sderaadt pch = ch; 317*ae99bc57Sderaadt ch = getc(bpf); 318*ae99bc57Sderaadt } 319*ae99bc57Sderaadt } 320*ae99bc57Sderaadt 321*ae99bc57Sderaadt /* if match is true we read the rest of the line to get the info of 322*ae99bc57Sderaadt * the file */ 323*ae99bc57Sderaadt 324*ae99bc57Sderaadt if (match) { 325*ae99bc57Sderaadt fid_len = strlen(fileid); 326*ae99bc57Sderaadt while (!res && (fscanf(bpf, "%s", info)) > 0) { /* read a string */ 327*ae99bc57Sderaadt ch = getc(bpf); /* and a character */ 328*ae99bc57Sderaadt if (*info != '#') { /* Comment ? */ 329*ae99bc57Sderaadt if (!strncmp(info, fileid, fid_len) && 330*ae99bc57Sderaadt *(info + fid_len) == '=') { 331*ae99bc57Sderaadt where = info + fid_len + 1; 332*ae99bc57Sderaadt if (isprint(*where)) { 333*ae99bc57Sderaadt strcpy(buffer, where); 334*ae99bc57Sderaadt res = 1; 335*ae99bc57Sderaadt break; 336*ae99bc57Sderaadt } 337*ae99bc57Sderaadt } else { 338*ae99bc57Sderaadt while (isspace(ch) && ch != '\n') 339*ae99bc57Sderaadt ch = getc(bpf); 340*ae99bc57Sderaadt if (ch == '\n') { 341*ae99bc57Sderaadt res = -1; 342*ae99bc57Sderaadt break; 343*ae99bc57Sderaadt } 344*ae99bc57Sderaadt if (ch == '\\') { 345*ae99bc57Sderaadt ch = getc(bpf); 346*ae99bc57Sderaadt if (ch == '\n') 347*ae99bc57Sderaadt continue; 348*ae99bc57Sderaadt ungetc(ch, bpf); 349*ae99bc57Sderaadt ungetc('\\', bpf); 350*ae99bc57Sderaadt } else 351*ae99bc57Sderaadt ungetc(ch, bpf); 352*ae99bc57Sderaadt } 353*ae99bc57Sderaadt } else 354*ae99bc57Sderaadt break; 355*ae99bc57Sderaadt } 356*ae99bc57Sderaadt } 357*ae99bc57Sderaadt if (fclose(bpf)) { 358*ae99bc57Sderaadt fprintf(stderr, "Could not close %s\n", bootpfile); 359*ae99bc57Sderaadt } 360*ae99bc57Sderaadt if (res == -1) 361*ae99bc57Sderaadt buffer[0] = '\0'; /* host found, file not */ 362*ae99bc57Sderaadt return (match); 363*ae99bc57Sderaadt } 364*ae99bc57Sderaadt 365*ae99bc57Sderaadt 366*ae99bc57Sderaadt /* 367*ae99bc57Sderaadt * checkhost puts the hostname found in the database file in 368*ae99bc57Sderaadt * the hostname-variable and returns 1, if askname is a valid 369*ae99bc57Sderaadt * name for a host in the database 370*ae99bc57Sderaadt */ 371*ae99bc57Sderaadt checkhost(askname, hostname) 372*ae99bc57Sderaadt char *askname; 373*ae99bc57Sderaadt char *hostname; 374*ae99bc57Sderaadt { 375*ae99bc57Sderaadt int ch, pch; 376*ae99bc57Sderaadt FILE *bpf; 377*ae99bc57Sderaadt int res = 0; 378*ae99bc57Sderaadt 379*ae99bc57Sderaadt bpf = fopen(bootpfile, "r"); 380*ae99bc57Sderaadt if (!bpf) { 381*ae99bc57Sderaadt fprintf(stderr, "No %s\n", bootpfile); 382*ae99bc57Sderaadt exit(1); 383*ae99bc57Sderaadt } 384*ae99bc57Sderaadt while (fscanf(bpf, "%s", hostname) > 0) { 385*ae99bc57Sderaadt if (!strcmp(hostname, askname)) { 386*ae99bc57Sderaadt /* return true for match of hostname */ 387*ae99bc57Sderaadt res = 1; 388*ae99bc57Sderaadt break; 389*ae99bc57Sderaadt } else { 390*ae99bc57Sderaadt /* check the alias list */ 391*ae99bc57Sderaadt he = NULL; 392*ae99bc57Sderaadt he = gethostbyname(hostname); 393*ae99bc57Sderaadt if (he && !strcmp(askname, he->h_name)) { 394*ae99bc57Sderaadt res = 1; 395*ae99bc57Sderaadt break; 396*ae99bc57Sderaadt } 397*ae99bc57Sderaadt } 398*ae99bc57Sderaadt /* skip to next entry */ 399*ae99bc57Sderaadt pch = ch = getc(bpf); 400*ae99bc57Sderaadt while (!(ch == '\n' && pch != '\\') && ch != EOF) { 401*ae99bc57Sderaadt pch = ch; 402*ae99bc57Sderaadt ch = getc(bpf); 403*ae99bc57Sderaadt } 404*ae99bc57Sderaadt } 405*ae99bc57Sderaadt fclose(bpf); 406*ae99bc57Sderaadt return (res); 407*ae99bc57Sderaadt } 408