1 1.17 joerg /* $NetBSD: pcnfsd_misc.c,v 1.17 2020/04/22 23:46:02 joerg Exp $ */ 2 1.2 gwr 3 1.1 jtc /* RE_SID: @(%)/usr/dosnfs/shades_SCCS/unix/pcnfsd/v2/src/SCCS/s.pcnfsd_misc.c 1.5 92/01/24 19:59:13 SMI */ 4 1.1 jtc /* 5 1.1 jtc **===================================================================== 6 1.1 jtc ** Copyright (c) 1986,1987,1988,1989,1990,1991 by Sun Microsystems, Inc. 7 1.1 jtc ** @(#)pcnfsd_misc.c 1.5 1/24/92 8 1.1 jtc **===================================================================== 9 1.1 jtc */ 10 1.1 jtc /* 11 1.1 jtc **===================================================================== 12 1.1 jtc ** I N C L U D E F I L E S E C T I O N * 13 1.1 jtc ** * 14 1.1 jtc ** If your port requires different include files, add a suitable * 15 1.1 jtc ** #define in the customization section, and make the inclusion or * 16 1.1 jtc ** exclusion of the files conditional on this. * 17 1.1 jtc **===================================================================== 18 1.1 jtc */ 19 1.1 jtc 20 1.1 jtc #include <sys/file.h> 21 1.3 lukem #include <sys/ioctl.h> 22 1.3 lukem #include <sys/socket.h> 23 1.3 lukem #include <sys/stat.h> 24 1.1 jtc #include <sys/time.h> 25 1.3 lukem #include <sys/wait.h> 26 1.3 lukem 27 1.3 lukem #include <netinet/in.h> 28 1.3 lukem #include <arpa/inet.h> 29 1.3 lukem 30 1.3 lukem #include <ctype.h> 31 1.3 lukem #include <errno.h> 32 1.1 jtc #include <netdb.h> 33 1.3 lukem #include <pwd.h> 34 1.3 lukem #include <signal.h> 35 1.3 lukem #include <stdio.h> 36 1.3 lukem #include <stdlib.h> 37 1.1 jtc #include <string.h> 38 1.3 lukem #include <unistd.h> 39 1.6 christos #include <util.h> 40 1.15 christos #ifdef SUPPORT_UTMPX 41 1.15 christos #include <utmpx.h> 42 1.15 christos #endif 43 1.1 jtc 44 1.1 jtc #ifdef ISC_2_0 45 1.1 jtc #include <sys/fcntl.h> 46 1.1 jtc #endif 47 1.1 jtc 48 1.1 jtc #ifdef SHADOW_SUPPORT 49 1.1 jtc #include <shadow.h> 50 1.1 jtc #endif 51 1.1 jtc 52 1.1 jtc #ifdef WTMP 53 1.3 lukem int wtmp_enabled = 1; 54 1.1 jtc #endif 55 1.1 jtc 56 1.3 lukem #include "common.h" 57 1.3 lukem #include "pcnfsd.h" 58 1.3 lukem #include "extern.h" 59 1.1 jtc 60 1.1 jtc /* 61 1.1 jtc **--------------------------------------------------------------------- 62 1.3 lukem ** Other #define's 63 1.1 jtc **--------------------------------------------------------------------- 64 1.1 jtc */ 65 1.1 jtc 66 1.1 jtc #define zchar 0x5b 67 1.1 jtc 68 1.16 sevan char *mapfont(char, char, char); 69 1.16 sevan void myhandler(int); 70 1.16 sevan void start_watchdog(int); 71 1.16 sevan void stop_watchdog(void); 72 1.1 jtc 73 1.1 jtc /* 74 1.1 jtc **===================================================================== 75 1.3 lukem ** C O D E S E C T I O N * 76 1.3 lukem **===================================================================== 77 1.1 jtc */ 78 1.1 jtc /* 79 1.1 jtc **--------------------------------------------------------------------- 80 1.3 lukem ** Support procedures 81 1.1 jtc **--------------------------------------------------------------------- 82 1.1 jtc */ 83 1.1 jtc 84 1.1 jtc 85 1.1 jtc void 86 1.16 sevan scramble(char *s1, char *s2) 87 1.1 jtc { 88 1.3 lukem while (*s1) { 89 1.3 lukem *s2++ = (*s1 ^ zchar) & 0x7f; 90 1.3 lukem s1++; 91 1.3 lukem } 92 1.1 jtc *s2 = 0; 93 1.1 jtc } 94 1.1 jtc 95 1.1 jtc 96 1.1 jtc 97 1.3 lukem struct passwd * 98 1.16 sevan get_password(char *usrnam) 99 1.1 jtc { 100 1.3 lukem struct passwd *p; 101 1.3 lukem static struct passwd localp; 102 1.5 mycroft __aconst char *pswd, *ushell; 103 1.1 jtc 104 1.1 jtc 105 1.1 jtc #ifdef SHADOW_SUPPORT 106 1.3 lukem struct spwd *sp; 107 1.3 lukem int shadowfile; 108 1.1 jtc #endif 109 1.1 jtc 110 1.1 jtc #ifdef SHADOW_SUPPORT 111 1.3 lukem /* 112 1.3 lukem **-------------------------------------------------------------- 113 1.3 lukem ** Check the existence of SHADOW. If it is there, then we are 114 1.3 lukem ** running a two-password-file system. 115 1.3 lukem **-------------------------------------------------------------- 116 1.3 lukem */ 117 1.1 jtc if (access(SHADOW, 0)) 118 1.3 lukem shadowfile = 0; /* SHADOW is not there */ 119 1.1 jtc else 120 1.3 lukem shadowfile = 1; 121 1.1 jtc 122 1.1 jtc setpwent(); 123 1.1 jtc if (shadowfile) 124 1.3 lukem (void) setspent(); /* Setting the shadow password file */ 125 1.13 plunky if ((p = getpwnam(usrnam)) == NULL || 126 1.13 plunky (shadowfile && (sp = getspnam(usrnam)) == NULL)) 127 1.13 plunky return (NULL); 128 1.3 lukem 129 1.3 lukem if (shadowfile) { 130 1.3 lukem pswd = sp->sp_pwdp; 131 1.3 lukem (void) endspent(); 132 1.3 lukem } else 133 1.3 lukem pswd = p->pw_passwd; 134 1.1 jtc 135 1.1 jtc #else 136 1.1 jtc p = getpwnam(usrnam); 137 1.13 plunky if (p == NULL) 138 1.13 plunky return (NULL); 139 1.1 jtc pswd = p->pw_passwd; 140 1.1 jtc #endif 141 1.1 jtc 142 1.1 jtc #ifdef ISC_2_0 143 1.3 lukem /* *----------------------------------------------------------- * We 144 1.3 lukem * may have an 'x' in which case look in /etc/shadow .. 145 1.3 lukem * *----------------------------------------------------------- */ 146 1.3 lukem if (((strlen(pswd)) == 1) && pswd[0] == 'x') { 147 1.3 lukem struct spwd *shadow = getspnam(usrnam); 148 1.3 lukem 149 1.3 lukem if (!shadow) 150 1.13 plunky return (NULL); 151 1.3 lukem pswd = shadow->sp_pwdp; 152 1.3 lukem } 153 1.1 jtc #endif 154 1.1 jtc localp = *p; 155 1.1 jtc localp.pw_passwd = pswd; 156 1.1 jtc #ifdef USE_GETUSERSHELL 157 1.1 jtc 158 1.1 jtc setusershell(); 159 1.3 lukem while (ushell = getusershell()) { 160 1.3 lukem if (!strcmp(ushell, localp.pw_shell)) { 161 1.1 jtc ok = 1; 162 1.1 jtc break; 163 1.1 jtc } 164 1.1 jtc } 165 1.1 jtc endusershell(); 166 1.3 lukem if (!ok) 167 1.13 plunky return (NULL); 168 1.1 jtc #else 169 1.1 jtc /* 170 1.3 lukem * the best we can do is to ensure that the shell ends in "sh" 171 1.3 lukem */ 172 1.1 jtc ushell = localp.pw_shell; 173 1.3 lukem if (strlen(ushell) < 2) 174 1.13 plunky return (NULL); 175 1.1 jtc ushell += strlen(ushell) - 2; 176 1.3 lukem if (strcmp(ushell, "sh")) 177 1.13 plunky return (NULL); 178 1.1 jtc 179 1.1 jtc #endif 180 1.1 jtc return (&localp); 181 1.1 jtc } 182 1.1 jtc 183 1.3 lukem 184 1.3 lukem 185 1.1 jtc /* 186 1.1 jtc **--------------------------------------------------------------------- 187 1.3 lukem ** Print support procedures 188 1.1 jtc **--------------------------------------------------------------------- 189 1.1 jtc */ 190 1.1 jtc 191 1.3 lukem 192 1.3 lukem char * 193 1.12 drochner mapfont(char f, char i, char b) 194 1.1 jtc { 195 1.3 lukem static char fontname[64]; 196 1.1 jtc 197 1.1 jtc fontname[0] = 0; /* clear it out */ 198 1.1 jtc 199 1.1 jtc switch (f) { 200 1.1 jtc case 'c': 201 1.10 itojun (void) strlcpy(fontname, "Courier", sizeof(fontname)); 202 1.1 jtc break; 203 1.1 jtc case 'h': 204 1.10 itojun (void) strlcpy(fontname, "Helvetica", sizeof(fontname)); 205 1.1 jtc break; 206 1.1 jtc case 't': 207 1.10 itojun (void) strlcpy(fontname, "Times", sizeof(fontname)); 208 1.1 jtc break; 209 1.1 jtc default: 210 1.10 itojun (void) strlcpy(fontname, "Times-Roman", sizeof(fontname)); 211 1.3 lukem goto finis; 212 1.1 jtc } 213 1.1 jtc if (i != 'o' && b != 'b') { /* no bold or oblique */ 214 1.1 jtc if (f == 't') /* special case Times */ 215 1.10 itojun (void) strlcat(fontname, "-Roman", sizeof(fontname)); 216 1.1 jtc goto finis; 217 1.1 jtc } 218 1.10 itojun (void) strlcat(fontname, "-", sizeof(fontname)); 219 1.1 jtc if (b == 'b') 220 1.10 itojun (void) strlcat(fontname, "Bold", sizeof(fontname)); 221 1.1 jtc if (i == 'o') /* o-blique */ 222 1.10 itojun (void) strlcat(fontname, f == 't' ? "Italic" : "Oblique", 223 1.10 itojun sizeof(fontname)); 224 1.1 jtc 225 1.1 jtc finis: return (&fontname[0]); 226 1.1 jtc } 227 1.1 jtc /* 228 1.3 lukem * run_ps630 performs the Diablo 630 emulation filtering process. ps630 229 1.3 lukem * was broken in certain Sun releases: it would not accept point size or 230 1.3 lukem * font changes. If your version is fixed, undefine the symbol 231 1.3 lukem * PS630_IS_BROKEN and rebuild pc-nfsd. 232 1.3 lukem */ 233 1.1 jtc /* #define PS630_IS_BROKEN 1 */ 234 1.1 jtc 235 1.1 jtc void 236 1.16 sevan run_ps630(char *f, char *opts) 237 1.1 jtc { 238 1.3 lukem char temp_file[256]; 239 1.3 lukem char commbuf[256]; 240 1.3 lukem int i; 241 1.1 jtc 242 1.10 itojun (void) strlcpy(temp_file, f, sizeof(temp_file)); 243 1.10 itojun (void) strlcat(temp_file, "X", sizeof(temp_file)); /* intermediate file name */ 244 1.1 jtc 245 1.1 jtc #ifndef PS630_IS_BROKEN 246 1.10 itojun (void) snprintf(commbuf, sizeof(commbuf), "ps630 -s %c%c -p %s -f ", 247 1.3 lukem opts[2], opts[3], temp_file); 248 1.10 itojun (void) strlcat(commbuf, mapfont(opts[4], opts[5], opts[6]), 249 1.10 itojun sizeof(commbuf)); 250 1.10 itojun (void) strlcat(commbuf, " -F ", sizeof(commbuf)); 251 1.10 itojun (void) strlcat(commbuf, mapfont(opts[7], opts[8], opts[9]), 252 1.10 itojun sizeof(commbuf)); 253 1.10 itojun (void) strlcat(commbuf, " ", sizeof(commbuf)); 254 1.10 itojun (void) strlcat(commbuf, f, sizeof(commbuf)); 255 1.3 lukem #else /* PS630_IS_BROKEN */ 256 1.3 lukem /* 257 1.3 lukem * The pitch and font features of ps630 appear to be broken at 258 1.3 lukem * this time. 259 1.3 lukem */ 260 1.10 itojun (void) snprintf(commbuf, sizeof(commbuf), "ps630 -p %s %s", 261 1.10 itojun temp_file, f); 262 1.3 lukem #endif /* PS630_IS_BROKEN */ 263 1.1 jtc 264 1.1 jtc 265 1.3 lukem if ((i = system(commbuf)) != 0) { 266 1.1 jtc /* 267 1.1 jtc * Under (un)certain conditions, ps630 may return -1 even 268 1.1 jtc * if it worked. Hence the commenting out of this error 269 1.1 jtc * report. 270 1.1 jtc */ 271 1.1 jtc /* (void)fprintf(stderr, "\n\nrun_ps630 rc = %d\n", i) */ ; 272 1.1 jtc /* exit(1); */ 273 1.1 jtc } 274 1.1 jtc if (rename(temp_file, f)) { 275 1.1 jtc perror("run_ps630: rename"); 276 1.1 jtc exit(1); 277 1.1 jtc } 278 1.1 jtc return; 279 1.1 jtc } 280 1.1 jtc 281 1.1 jtc 282 1.1 jtc 283 1.3 lukem 284 1.3 lukem 285 1.1 jtc /* 286 1.1 jtc **--------------------------------------------------------------------- 287 1.3 lukem ** WTMP update support 288 1.1 jtc **--------------------------------------------------------------------- 289 1.1 jtc */ 290 1.1 jtc 291 1.1 jtc 292 1.1 jtc #ifdef WTMP 293 1.1 jtc void 294 1.16 sevan wlogin(char *name, struct svc_req *req) 295 1.1 jtc { 296 1.1 jtc struct sockaddr_in *who; 297 1.1 jtc struct hostent *hp; 298 1.6 christos char *host; 299 1.1 jtc 300 1.3 lukem if (!wtmp_enabled) 301 1.1 jtc return; 302 1.1 jtc 303 1.3 lukem /* Get network address of client. */ 304 1.1 jtc who = &req->rq_xprt->xp_raddr; 305 1.1 jtc 306 1.3 lukem /* Get name of connected client */ 307 1.3 lukem hp = gethostbyaddr((char *) &who->sin_addr, 308 1.3 lukem sizeof(struct in_addr), 309 1.3 lukem who->sin_family); 310 1.1 jtc 311 1.6 christos if (hp) { 312 1.1 jtc host = hp->h_name; 313 1.1 jtc } else { 314 1.1 jtc host = inet_ntoa(who->sin_addr); 315 1.1 jtc } 316 1.1 jtc 317 1.6 christos #ifdef SUPPORT_UTMP 318 1.7 christos logwtmp("PC-NFS", name, host); 319 1.6 christos #endif 320 1.6 christos #ifdef SUPPORT_UTMPX 321 1.8 christos logwtmpx("PC-NFS", name, host, 0, USER_PROCESS); 322 1.6 christos #endif 323 1.1 jtc } 324 1.3 lukem #endif /* WTMP */ 325 1.3 lukem 326 1.3 lukem 327 1.1 jtc /* 328 1.1 jtc **--------------------------------------------------------------------- 329 1.3 lukem ** Run-process-as-user procedures 330 1.1 jtc **--------------------------------------------------------------------- 331 1.1 jtc */ 332 1.1 jtc 333 1.1 jtc 334 1.1 jtc #define READER_FD 0 335 1.1 jtc #define WRITER_FD 1 336 1.1 jtc 337 1.3 lukem static int child_pid; 338 1.1 jtc 339 1.3 lukem static char cached_user[64] = ""; 340 1.3 lukem static uid_t cached_uid; 341 1.3 lukem static gid_t cached_gid; 342 1.3 lukem 343 1.3 lukem static struct sigaction old_action; 344 1.3 lukem static struct sigaction new_action; 345 1.3 lukem static struct itimerval timer; 346 1.1 jtc 347 1.3 lukem int interrupted = 0; 348 1.3 lukem static FILE *pipe_handle; 349 1.1 jtc 350 1.3 lukem void 351 1.16 sevan myhandler(int dummy) 352 1.1 jtc { 353 1.3 lukem interrupted = 1; 354 1.3 lukem fclose(pipe_handle); 355 1.3 lukem kill(child_pid, SIGKILL); 356 1.3 lukem msg_out("rpc.pcnfsd: su_popen timeout - killed child process"); 357 1.1 jtc } 358 1.1 jtc 359 1.3 lukem void 360 1.16 sevan start_watchdog(int n) 361 1.1 jtc { 362 1.3 lukem /* 363 1.3 lukem * Setup SIGALRM handler, force interrupt of ongoing syscall 364 1.3 lukem */ 365 1.1 jtc 366 1.1 jtc new_action.sa_handler = myhandler; 367 1.1 jtc sigemptyset(&(new_action.sa_mask)); 368 1.1 jtc new_action.sa_flags = 0; 369 1.1 jtc #ifdef SA_INTERRUPT 370 1.1 jtc new_action.sa_flags |= SA_INTERRUPT; 371 1.1 jtc #endif 372 1.1 jtc sigaction(SIGALRM, &new_action, &old_action); 373 1.1 jtc 374 1.3 lukem /* 375 1.3 lukem * Set interval timer for n seconds 376 1.3 lukem */ 377 1.1 jtc timer.it_interval.tv_sec = 0; 378 1.1 jtc timer.it_interval.tv_usec = 0; 379 1.1 jtc timer.it_value.tv_sec = n; 380 1.1 jtc timer.it_value.tv_usec = 0; 381 1.1 jtc setitimer(ITIMER_REAL, &timer, NULL); 382 1.1 jtc interrupted = 0; 383 1.1 jtc 384 1.1 jtc } 385 1.1 jtc 386 1.3 lukem void 387 1.3 lukem stop_watchdog() 388 1.1 jtc { 389 1.3 lukem /* 390 1.3 lukem * Cancel timer 391 1.3 lukem */ 392 1.1 jtc 393 1.1 jtc timer.it_interval.tv_sec = 0; 394 1.1 jtc timer.it_interval.tv_usec = 0; 395 1.1 jtc timer.it_value.tv_sec = 0; 396 1.1 jtc timer.it_value.tv_usec = 0; 397 1.1 jtc setitimer(ITIMER_REAL, &timer, NULL); 398 1.1 jtc 399 1.3 lukem /* 400 1.3 lukem * restore old signal handling 401 1.3 lukem */ 402 1.1 jtc sigaction(SIGALRM, &old_action, NULL); 403 1.1 jtc } 404 1.1 jtc 405 1.3 lukem FILE * 406 1.16 sevan su_popen(char *user, char *cmd, int maxtime) 407 1.1 jtc { 408 1.3 lukem int p[2]; 409 1.3 lukem int parent_fd, child_fd, pid; 410 1.1 jtc struct passwd *pw; 411 1.1 jtc 412 1.1 jtc if (strcmp(cached_user, user)) { 413 1.1 jtc pw = getpwnam(user); 414 1.1 jtc if (!pw) 415 1.1 jtc pw = getpwnam("nobody"); 416 1.1 jtc if (pw) { 417 1.1 jtc cached_uid = pw->pw_uid; 418 1.1 jtc cached_gid = pw->pw_gid; 419 1.10 itojun strlcpy(cached_user, user, sizeof(cached_user)); 420 1.1 jtc } else { 421 1.1 jtc cached_uid = (uid_t) (-2); 422 1.1 jtc cached_gid = (gid_t) (-2); 423 1.1 jtc cached_user[0] = '\0'; 424 1.1 jtc } 425 1.1 jtc } 426 1.1 jtc if (pipe(p) < 0) { 427 1.1 jtc msg_out("rpc.pcnfsd: unable to create pipe in su_popen"); 428 1.1 jtc return (NULL); 429 1.1 jtc } 430 1.1 jtc parent_fd = p[READER_FD]; 431 1.1 jtc child_fd = p[WRITER_FD]; 432 1.1 jtc if ((pid = fork()) == 0) { 433 1.3 lukem int i; 434 1.1 jtc 435 1.1 jtc for (i = 0; i < 10; i++) 436 1.1 jtc if (i != child_fd) 437 1.1 jtc (void) close(i); 438 1.1 jtc if (child_fd != 1) { 439 1.1 jtc (void) dup2(child_fd, 1); 440 1.1 jtc (void) close(child_fd); 441 1.1 jtc } 442 1.1 jtc dup2(1, 2); /* let's get stderr as well */ 443 1.1 jtc 444 1.1 jtc (void) setgid(cached_gid); 445 1.1 jtc (void) setuid(cached_uid); 446 1.1 jtc 447 1.14 plunky (void) execl("/bin/sh", "sh", "-c", cmd, (char *) NULL); 448 1.1 jtc _exit(255); 449 1.1 jtc } 450 1.1 jtc if (pid == -1) { 451 1.1 jtc msg_out("rpc.pcnfsd: fork failed"); 452 1.1 jtc close(parent_fd); 453 1.1 jtc close(child_fd); 454 1.1 jtc return (NULL); 455 1.1 jtc } 456 1.1 jtc child_pid = pid; 457 1.1 jtc close(child_fd); 458 1.1 jtc start_watchdog(maxtime); 459 1.1 jtc pipe_handle = fdopen(parent_fd, "r"); 460 1.1 jtc return (pipe_handle); 461 1.1 jtc } 462 1.1 jtc 463 1.1 jtc int 464 1.16 sevan su_pclose(FILE *ptr) 465 1.1 jtc { 466 1.3 lukem int pid, status; 467 1.1 jtc 468 1.1 jtc stop_watchdog(); 469 1.1 jtc 470 1.1 jtc fclose(ptr); 471 1.1 jtc if (child_pid == -1) 472 1.1 jtc return (-1); 473 1.1 jtc while ((pid = wait(&status)) != child_pid && pid != -1); 474 1.1 jtc return (pid == -1 ? -1 : status); 475 1.1 jtc } 476 1.1 jtc 477 1.3 lukem 478 1.3 lukem 479 1.1 jtc /* 480 1.1 jtc ** The following routine reads a file "/etc/pcnfsd.conf" if present, 481 1.1 jtc ** and uses it to replace certain builtin elements, like the 482 1.1 jtc ** name of the print spool directory. The configuration file 483 1.1 jtc ** Is the usual kind: Comments begin with '#', blank lines are ignored, 484 1.1 jtc ** and valid lines are of the form 485 1.1 jtc ** 486 1.1 jtc ** <keyword><whitespace><value> 487 1.1 jtc ** 488 1.1 jtc ** The following keywords are recognized: 489 1.1 jtc ** 490 1.1 jtc ** spooldir 491 1.1 jtc ** printer name alias-for command 492 1.1 jtc ** wtmp yes|no 493 1.1 jtc */ 494 1.11 dholland static void 495 1.11 dholland config_from_file(void) 496 1.1 jtc { 497 1.3 lukem FILE *fd; 498 1.3 lukem char buff[1024]; 499 1.3 lukem char *cp; 500 1.3 lukem char *kw; 501 1.3 lukem char *val; 502 1.3 lukem char *arg1; 503 1.3 lukem char *arg2; 504 1.1 jtc 505 1.3 lukem if ((fd = fopen("/etc/pcnfsd.conf", "r")) == NULL) 506 1.1 jtc return; 507 1.3 lukem while (fgets(buff, 1024, fd)) { 508 1.1 jtc cp = strchr(buff, '\n'); 509 1.1 jtc *cp = '\0'; 510 1.1 jtc cp = strchr(buff, '#'); 511 1.3 lukem if (cp) 512 1.1 jtc *cp = '\0'; 513 1.1 jtc kw = strtok(buff, " \t"); 514 1.3 lukem if (kw == NULL) 515 1.1 jtc continue; 516 1.1 jtc val = strtok(NULL, " \t"); 517 1.3 lukem if (val == NULL) 518 1.1 jtc continue; 519 1.3 lukem if (!strcasecmp(kw, "spooldir")) { 520 1.10 itojun strlcpy(sp_name, val, sizeof(sp_name)); 521 1.1 jtc continue; 522 1.1 jtc } 523 1.1 jtc #ifdef WTMP 524 1.3 lukem if (!strcasecmp(kw, "wtmp")) { 525 1.1 jtc /* assume default is YES, just look for negatives */ 526 1.3 lukem if (!strcasecmp(val, "no") || 527 1.3 lukem !strcasecmp(val, "off") || 528 1.3 lukem !strcasecmp(val, "disable") || 529 1.3 lukem !strcmp(val, "0")) 530 1.9 simonb wtmp_enabled = 0; 531 1.1 jtc continue; 532 1.1 jtc } 533 1.3 lukem #endif 534 1.3 lukem if (!strcasecmp(kw, "printer")) { 535 1.1 jtc arg1 = strtok(NULL, " \t"); 536 1.1 jtc arg2 = strtok(NULL, ""); 537 1.3 lukem (void) add_printer_alias(val, arg1, arg2); 538 1.1 jtc continue; 539 1.1 jtc } 540 1.1 jtc /* 541 1.1 jtc ** Add new cases here 542 1.1 jtc */ 543 1.1 jtc } 544 1.1 jtc fclose(fd); 545 1.1 jtc } 546 1.1 jtc 547 1.11 dholland /* 548 1.11 dholland ** hack for main() - call config_from_file() then the real main 549 1.11 dholland ** in the rpcgen output, which is hacked by CPPFLAGS to be "mymain" 550 1.11 dholland */ 551 1.11 dholland #undef main 552 1.11 dholland 553 1.11 dholland int mymain(int argc, char *argv[]); 554 1.11 dholland 555 1.11 dholland int 556 1.11 dholland main(int argc, char *argv[]) 557 1.11 dholland { 558 1.11 dholland config_from_file(); 559 1.11 dholland return mymain(argc, argv); 560 1.11 dholland } 561 1.1 jtc 562 1.1 jtc /* 563 1.1 jtc ** strembedded - returns true if s1 is embedded (in any case) in s2 564 1.1 jtc */ 565 1.1 jtc 566 1.3 lukem int 567 1.16 sevan strembedded(const char *s1, const char *s2) 568 1.1 jtc { 569 1.3 lukem while (*s2) { 570 1.3 lukem if (!strcasecmp(s1, s2)) 571 1.1 jtc return 1; 572 1.1 jtc s2++; 573 1.1 jtc } 574 1.1 jtc return 0; 575 1.1 jtc } 576