1 0 stevel /* 2 0 stevel * CDDL HEADER START 3 0 stevel * 4 0 stevel * The contents of this file are subject to the terms of the 5 3125 jacobs * Common Development and Distribution License (the "License"). 6 3125 jacobs * You may not use this file except in compliance with the License. 7 0 stevel * 8 0 stevel * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 0 stevel * or http://www.opensolaris.org/os/licensing. 10 0 stevel * See the License for the specific language governing permissions 11 0 stevel * and limitations under the License. 12 0 stevel * 13 0 stevel * When distributing Covered Code, include this CDDL HEADER in each 14 0 stevel * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 0 stevel * If applicable, add the following below this CDDL HEADER, with the 16 0 stevel * fields enclosed by brackets "[]" replaced with your own identifying 17 0 stevel * information: Portions Copyright [yyyy] [name of copyright owner] 18 0 stevel * 19 0 stevel * CDDL HEADER END 20 0 stevel */ 21 3125 jacobs 22 320 ceastha /* 23 3125 jacobs * Copyright 2006 Sun Microsystems, Inc. All rights reserved. 24 320 ceastha * Use is subject to license terms. 25 320 ceastha */ 26 320 ceastha 27 0 stevel /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ 28 0 stevel /* All Rights Reserved */ 29 0 stevel 30 320 ceastha #pragma ident "%Z%%M% %I% %E% SMI" 31 0 stevel 32 0 stevel /* EMACS_MODES: !fill, lnumb, !overwrite, !nodelete, !picture */ 33 0 stevel 34 0 stevel #include "unistd.h" 35 0 stevel #include "sys/types.h" 36 0 stevel #include "sys/stat.h" 37 0 stevel #include "errno.h" 38 0 stevel #include "fcntl.h" 39 0 stevel #include "stdlib.h" 40 0 stevel #include "string.h" 41 0 stevel 42 0 stevel #include "lpsched.h" 43 0 stevel 44 3125 jacobs static int __list_increment = 16; 45 0 stevel 46 3125 jacobs int 47 3125 jacobs list_append(void ***list, void *item) 48 3125 jacobs { 49 3125 jacobs int count; 50 3125 jacobs 51 3125 jacobs if ((list == NULL) || (item == NULL)) { 52 3125 jacobs errno = EINVAL; 53 3125 jacobs return (-1); 54 3125 jacobs } 55 3125 jacobs 56 3125 jacobs if (item != NULL) { 57 3125 jacobs if (*list == NULL) 58 3125 jacobs *list = (void **)calloc(__list_increment, 59 3125 jacobs sizeof (void *)); 60 3125 jacobs 61 3125 jacobs if (*list == NULL) 62 3125 jacobs return (-1); 63 3125 jacobs 64 3125 jacobs for (count = 0; (*list)[count] != NULL; count++); 65 3125 jacobs 66 3125 jacobs if ((count + 1) % __list_increment == 0) { /* expand the list */ void **new_list = NULL; 67 3125 jacobs int new_size = (((count + 1) / __list_increment) + 1) * 68 3125 jacobs __list_increment; 69 3125 jacobs 70 3125 jacobs new_list = (void **)calloc(new_size, sizeof (void *)); 71 3125 jacobs if (new_list == NULL) 72 3125 jacobs return (-1); 73 3125 jacobs 74 3125 jacobs for (count = 0; (*list)[count] != NULL; count++) 75 3125 jacobs new_list[count] = (*list)[count]; 76 3125 jacobs free(*list); 77 3125 jacobs *list = new_list; 78 3125 jacobs } 79 3125 jacobs 80 3125 jacobs (*list)[count] = item; 81 3125 jacobs } 82 3125 jacobs 83 3125 jacobs return (0); 84 3125 jacobs } 85 3125 jacobs 86 3125 jacobs void 87 3125 jacobs list_remove(void ***list, void *item) 88 3125 jacobs { 89 3125 jacobs int i, count; 90 3125 jacobs void **tmp = NULL; 91 3125 jacobs 92 3125 jacobs if ((list == NULL) || (*list == NULL) || (item == NULL)) 93 3125 jacobs return; 94 3125 jacobs 95 3125 jacobs for (count = 0; (*list)[count] != NULL; count++) 96 3125 jacobs ; 97 3125 jacobs 98 3125 jacobs if (count > 0) { 99 3125 jacobs int new_size = (((count + 1) / __list_increment) + 1) * 100 3125 jacobs __list_increment; 101 3125 jacobs 102 3125 jacobs if ((tmp = (void **)calloc(new_size, sizeof (void *))) == NULL) 103 3125 jacobs tmp = *list; 104 3125 jacobs 105 3125 jacobs /* copy up to item */ 106 3125 jacobs for (i = 0; (((*list)[i] != NULL) && ((*list)[i] != item)); i++) 107 3125 jacobs tmp[i] = (*list)[i]; 108 3125 jacobs /* copy after item */ 109 3125 jacobs if ((*list)[i] == item) 110 3125 jacobs for (++i; ((*list)[i] != NULL); i++) 111 3125 jacobs tmp[i-1] = (*list)[i]; 112 3125 jacobs } 113 3125 jacobs 114 3125 jacobs /* replace the list */ 115 3125 jacobs if (tmp != *list) { 116 3125 jacobs free(*list); 117 3125 jacobs *list = tmp; 118 3125 jacobs } 119 3125 jacobs } 120 3125 jacobs 121 3125 jacobs void 122 3125 jacobs free_exec(EXEC *ep) 123 3125 jacobs { 124 3125 jacobs if (ep != NULL) { 125 3125 jacobs free(ep); 126 3125 jacobs list_remove((void ***)&Exec_Table, (void *)ep); 127 3125 jacobs } 128 3125 jacobs } 129 3125 jacobs 130 3125 jacobs EXEC * 131 3125 jacobs new_exec(int type, void *ex) 132 3125 jacobs { 133 3125 jacobs EXEC *result = calloc(1, sizeof (*result)); 134 3125 jacobs 135 3125 jacobs if (result != NULL) { 136 3125 jacobs result->type = type; 137 3125 jacobs switch (type) { 138 3125 jacobs case EX_ALERT: 139 3125 jacobs case EX_INTERF: 140 3125 jacobs case EX_FAULT_MESSAGE: 141 3125 jacobs result->ex.printer = ex; 142 3125 jacobs break; 143 3125 jacobs case EX_FALERT: 144 3125 jacobs result->ex.form = ex; 145 3125 jacobs break; 146 3125 jacobs case EX_PALERT: 147 3125 jacobs result->ex.pwheel = ex; 148 3125 jacobs break; 149 3125 jacobs case EX_SLOWF: 150 3125 jacobs case EX_NOTIFY: 151 3125 jacobs break; 152 3125 jacobs } 153 3125 jacobs list_append((void ***)&Exec_Table, (void *)result); 154 3125 jacobs } 155 3125 jacobs 156 3125 jacobs return (result); 157 3125 jacobs } 158 3125 jacobs 159 3125 jacobs void 160 3125 jacobs free_alert(ALERT *ap) 161 3125 jacobs { 162 3125 jacobs if (ap != NULL) { 163 3125 jacobs if (ap->msgfile != NULL) 164 3125 jacobs free(ap->msgfile); 165 3125 jacobs if (ap->exec != NULL) 166 3125 jacobs free_exec(ap->exec); 167 3125 jacobs free(ap); 168 3125 jacobs } 169 3125 jacobs } 170 3125 jacobs 171 3125 jacobs ALERT * 172 3125 jacobs new_alert(char *fmt, int i) 173 3125 jacobs { 174 3125 jacobs ALERT *result = calloc(1, sizeof (*result)); 175 3125 jacobs 176 3125 jacobs if (result != NULL) { 177 3125 jacobs char buf[15]; 178 3125 jacobs 179 3125 jacobs snprintf(buf, sizeof (buf), fmt, i); 180 3125 jacobs result->msgfile = makepath(Lp_Temp, buf, (char *)0); 181 3125 jacobs (void) Unlink(result->msgfile); 182 3125 jacobs } 183 3125 jacobs 184 3125 jacobs return (result); 185 3125 jacobs } 186 3125 jacobs 187 3125 jacobs void 188 3125 jacobs free_pstatus(PSTATUS *psp) 189 3125 jacobs { 190 3125 jacobs if (psp != NULL) { 191 3125 jacobs if (psp->alert != NULL) 192 3125 jacobs free_alert(psp->alert); 193 3125 jacobs if (psp->exec != NULL) 194 3125 jacobs free_exec(psp->exec); 195 3125 jacobs if (psp->fault_exec != NULL) 196 3125 jacobs free_exec(psp->fault_exec); 197 3125 jacobs if (psp->printer != NULL) 198 3125 jacobs freeprinter(psp->printer); 199 3125 jacobs if (psp->pwheel_name != NULL) 200 3125 jacobs free(psp->pwheel_name); 201 3125 jacobs if (psp->dis_reason != NULL) 202 3125 jacobs free(psp->dis_reason); 203 3125 jacobs if (psp->rej_reason != NULL) 204 3125 jacobs free(psp->rej_reason); 205 3125 jacobs if (psp->users_allowed != NULL) 206 3125 jacobs unload_list(&psp->users_allowed); 207 3125 jacobs if (psp->users_denied != NULL) 208 3125 jacobs unload_list(&psp->users_denied); 209 3125 jacobs if (psp->forms_allowed != NULL) 210 3125 jacobs unload_list(&psp->forms_allowed); 211 3125 jacobs if (psp->forms_denied != NULL) 212 3125 jacobs unload_list(&psp->forms_denied); 213 3125 jacobs if (psp->cpi != NULL) 214 3125 jacobs free(psp->cpi); 215 3125 jacobs if (psp->lpi != NULL) 216 3125 jacobs free(psp->lpi); 217 3125 jacobs if (psp->plen != NULL) 218 3125 jacobs free(psp->plen); 219 3125 jacobs if (psp->pwid != NULL) 220 3125 jacobs free(psp->pwid); 221 3125 jacobs if (psp->fault_reason != NULL) 222 3125 jacobs free(psp->fault_reason); 223 3125 jacobs if (psp->paper_allowed != NULL) 224 3125 jacobs unload_list(&psp->paper_allowed); 225 3125 jacobs free(psp); 226 3125 jacobs } 227 3125 jacobs } 228 3125 jacobs 229 3125 jacobs void 230 3125 jacobs pstatus_add_printer(PSTATUS *ps, PRINTER *p) 231 3125 jacobs { 232 3125 jacobs if ((ps != NULL) && (p != NULL)) { 233 3125 jacobs char **paperDenied = NULL; 234 3125 jacobs 235 3125 jacobs ps->printer = p; 236 3125 jacobs load_userprinter_access(p->name, &(ps->users_allowed), 237 3125 jacobs &(ps->users_denied)); 238 3125 jacobs load_formprinter_access(p->name, &(ps->forms_allowed), 239 3125 jacobs &(ps->forms_denied)); 240 3125 jacobs load_paperprinter_access(p->name, &ps->paper_allowed, 241 3125 jacobs &paperDenied); 242 3125 jacobs freelist(paperDenied); 243 3125 jacobs load_sdn(&(ps->cpi), p->cpi); 244 3125 jacobs load_sdn(&(ps->lpi), p->lpi); 245 3125 jacobs load_sdn(&(ps->plen), p->plen); 246 3125 jacobs load_sdn(&(ps->pwid), p->pwid); 247 3125 jacobs } 248 3125 jacobs } 249 0 stevel 250 0 stevel PSTATUS * 251 3125 jacobs new_pstatus(PRINTER *p) 252 0 stevel { 253 3125 jacobs PSTATUS *result = calloc(1, sizeof (*result)); 254 3125 jacobs 255 3125 jacobs if (result != NULL) { 256 3125 jacobs static int i = 0; 257 3125 jacobs char **paperDenied = NULL; 258 0 stevel 259 3125 jacobs result->alert = new_alert("A-%d", i++); 260 3125 jacobs result->alert->exec = new_exec(EX_ALERT, result); 261 3125 jacobs result->exec = new_exec(EX_INTERF, result); 262 3125 jacobs result->fault_exec = new_exec(EX_FAULT_MESSAGE, result); 263 3125 jacobs 264 3125 jacobs if (p != NULL) 265 3125 jacobs pstatus_add_printer(result, p); 266 3125 jacobs 267 3125 jacobs list_append((void ***)&PStatus, (void *)result); 268 0 stevel } 269 0 stevel 270 3125 jacobs return (result); 271 3125 jacobs } 272 0 stevel 273 3125 jacobs void 274 3125 jacobs free_cstatus(CSTATUS *csp) 275 3125 jacobs { 276 3125 jacobs if (csp != NULL) { 277 3125 jacobs if (csp->rej_reason != NULL) 278 3125 jacobs free(csp->rej_reason); 279 3125 jacobs if (csp->class != NULL) 280 3125 jacobs freeclass(csp->class); 281 3125 jacobs free(csp); 282 3125 jacobs } 283 3125 jacobs } 284 3125 jacobs 285 3125 jacobs CSTATUS * 286 3125 jacobs new_cstatus(CLASS *c) 287 3125 jacobs { 288 3125 jacobs CSTATUS *result = calloc(1, sizeof (*result)); 289 3125 jacobs 290 3125 jacobs if (result != NULL) { 291 3125 jacobs if (c != NULL) 292 3125 jacobs result->class = c; 293 3125 jacobs else 294 3125 jacobs result->class = calloc(1, sizeof (CLASS)); 295 3125 jacobs 296 3125 jacobs list_append((void ***)&CStatus, result); 297 3125 jacobs } 298 3125 jacobs 299 3125 jacobs return (result); 300 3125 jacobs } 301 3125 jacobs 302 3125 jacobs void 303 3125 jacobs free_fstatus(FSTATUS *fsp) 304 3125 jacobs { 305 3125 jacobs if (fsp != NULL) { 306 3125 jacobs if (fsp->form != NULL) 307 3125 jacobs free_form(fsp->form); 308 3125 jacobs if (fsp->alert != NULL) 309 3125 jacobs free_alert(fsp->alert); 310 3125 jacobs if (fsp->users_allowed != NULL) 311 3125 jacobs unload_list(&fsp->users_allowed); 312 3125 jacobs if (fsp->users_denied != NULL) 313 3125 jacobs unload_list(&fsp->users_denied); 314 3125 jacobs if (fsp->cpi != NULL) 315 3125 jacobs free(fsp->cpi); 316 3125 jacobs if (fsp->lpi != NULL) 317 3125 jacobs free(fsp->lpi); 318 3125 jacobs if (fsp->plen != NULL) 319 3125 jacobs free(fsp->plen); 320 3125 jacobs if (fsp->pwid != NULL) 321 3125 jacobs free(fsp->pwid); 322 3125 jacobs free(fsp); 323 3125 jacobs } 324 0 stevel } 325 0 stevel 326 0 stevel FSTATUS * 327 3125 jacobs new_fstatus(_FORM *f) 328 0 stevel { 329 3125 jacobs FSTATUS *result = calloc(1, sizeof (*result)); 330 3125 jacobs 331 3125 jacobs if (result != NULL) { 332 3125 jacobs static int i = 0; 333 0 stevel 334 3125 jacobs if (f != NULL) 335 3125 jacobs result->form = f; 336 3125 jacobs else 337 3125 jacobs result->form = calloc(1, sizeof (_FORM)); 338 3125 jacobs 339 3125 jacobs result->alert = new_alert("F-%d", i++); 340 3125 jacobs result->alert->exec = new_exec(EX_FALERT, result); 341 3125 jacobs result->trigger = result->form->alert.Q; 342 3125 jacobs 343 3125 jacobs if (f != NULL) { 344 3125 jacobs load_userform_access(f->name, &(result->users_allowed), 345 3125 jacobs &(result->users_denied)); 346 3125 jacobs load_sdn (&(result->cpi), f->cpi); 347 3125 jacobs load_sdn (&(result->lpi), f->lpi); 348 3125 jacobs load_sdn (&(result->plen), f->plen); 349 3125 jacobs load_sdn (&(result->pwid), f->pwid); 350 3125 jacobs } 351 3125 jacobs 352 3125 jacobs list_append((void ***)&FStatus, (void *)result); 353 0 stevel } 354 0 stevel 355 3125 jacobs return (result); 356 0 stevel } 357 0 stevel 358 3125 jacobs void 359 3125 jacobs free_pwstatus(PWSTATUS *pwp) 360 0 stevel { 361 3125 jacobs if (pwp != NULL) { 362 3125 jacobs if (pwp->pwheel) 363 3125 jacobs freepwheel(pwp->pwheel); 364 3125 jacobs if (pwp->alert != NULL) 365 3125 jacobs free_alert(pwp->alert); 366 3125 jacobs free(pwp); 367 0 stevel } 368 0 stevel } 369 0 stevel 370 0 stevel PWSTATUS * 371 3125 jacobs new_pwstatus(PWHEEL *p) 372 0 stevel { 373 3125 jacobs PWSTATUS *result = calloc(1, sizeof (*result)); 374 0 stevel 375 3125 jacobs if (result != NULL) { 376 3125 jacobs static int i = 0; 377 3125 jacobs 378 3125 jacobs if (p != NULL) 379 3125 jacobs result->pwheel = p; 380 3125 jacobs else 381 3125 jacobs result->pwheel = calloc(1, sizeof (*result)); 382 3125 jacobs 383 3125 jacobs result->alert = new_alert("P-%d", i++); 384 3125 jacobs result->alert->exec = new_exec(EX_PALERT, result); 385 3125 jacobs result->trigger = result->pwheel->alert.Q; 386 3125 jacobs 387 3125 jacobs list_append((void ***)&PWStatus, (void *)result); 388 0 stevel } 389 0 stevel 390 3125 jacobs return (result); 391 0 stevel } 392 0 stevel 393 3125 jacobs void 394 3125 jacobs free_rstatus(RSTATUS *rsp) 395 3125 jacobs { 396 3125 jacobs if (rsp != NULL) { 397 3125 jacobs remover(rsp); 398 3125 jacobs 399 3125 jacobs if (rsp->request != NULL) 400 3125 jacobs freerequest(rsp->request); 401 3125 jacobs if (rsp->secure != NULL) 402 3125 jacobs freesecure(rsp->secure); 403 3125 jacobs if (rsp->req_file) 404 3125 jacobs Free (rsp->req_file); 405 3125 jacobs if (rsp->slow) 406 3125 jacobs Free (rsp->slow); 407 3125 jacobs if (rsp->fast) 408 3125 jacobs Free (rsp->fast); 409 3125 jacobs if (rsp->pwheel_name) 410 3125 jacobs Free (rsp->pwheel_name); 411 3125 jacobs if (rsp->printer_type) 412 3125 jacobs Free (rsp->printer_type); 413 3125 jacobs if (rsp->output_type) 414 3125 jacobs Free (rsp->output_type); 415 3125 jacobs if (rsp->cpi) 416 3125 jacobs Free (rsp->cpi); 417 3125 jacobs if (rsp->lpi) 418 3125 jacobs Free (rsp->lpi); 419 3125 jacobs if (rsp->plen) 420 3125 jacobs Free (rsp->plen); 421 3125 jacobs if (rsp->pwid) 422 3125 jacobs Free (rsp->pwid); 423 3125 jacobs free(rsp); 424 3125 jacobs } 425 3125 jacobs } 426 3125 jacobs 427 3125 jacobs RSTATUS * 428 3125 jacobs new_rstatus(REQUEST *r, SECURE *s) 429 3125 jacobs { 430 3125 jacobs RSTATUS *result = calloc(1, sizeof (*result)); 431 3125 jacobs 432 3125 jacobs if (result != NULL) { 433 3125 jacobs if ((result->request = r) == NULL) 434 3125 jacobs result->request = calloc(1, sizeof (REQUEST)); 435 3125 jacobs if ((result->secure = s) == NULL) 436 3125 jacobs result->secure = calloc(1, sizeof (SECURE)); 437 3125 jacobs } 438 3125 jacobs 439 3125 jacobs return (result); 440 3125 jacobs } 441 0 stevel 442 0 stevel /** 443 3125 jacobs ** search_pstatus() - SEARCH PRINTER TABLE 444 3125 jacobs ** search_fstatus() - SEARCH FORMS TABLE 445 3125 jacobs ** search_cstatus() - SEARCH CLASS TABLE 446 3125 jacobs ** search_pwstatus() - SEARCH PRINT WHEEL TABLE 447 0 stevel **/ 448 0 stevel 449 0 stevel PSTATUS * 450 3125 jacobs search_pstatus(register char *name) 451 0 stevel { 452 3125 jacobs PSTATUS *ps = NULL; 453 0 stevel 454 3125 jacobs if (name != NULL) { 455 3125 jacobs if (PStatus != NULL) { 456 3125 jacobs int i; 457 0 stevel 458 3125 jacobs for (i = 0; ((PStatus[i] != NULL) && (ps == NULL)); i++) 459 3125 jacobs if (SAME(PStatus[i]->printer->name, name)) 460 3125 jacobs ps = PStatus[i]; 461 3125 jacobs } 462 3125 jacobs } else 463 3125 jacobs ps = new_pstatus(NULL); 464 0 stevel 465 0 stevel return (ps); 466 0 stevel } 467 0 stevel 468 0 stevel 469 0 stevel FSTATUS * 470 3125 jacobs search_fstatus(register char *name) 471 0 stevel { 472 3125 jacobs FSTATUS *ps = NULL; 473 0 stevel 474 3125 jacobs if (name != NULL) { 475 3125 jacobs if (FStatus != NULL) { 476 3125 jacobs int i; 477 0 stevel 478 3125 jacobs for (i = 0; ((FStatus[i] != NULL) && (ps == NULL)); i++) 479 3125 jacobs if (SAME(FStatus[i]->form->name, name)) 480 3125 jacobs ps = FStatus[i]; 481 3125 jacobs } 482 3125 jacobs } else 483 3125 jacobs ps = new_fstatus(NULL); 484 0 stevel 485 0 stevel return (ps); 486 0 stevel } 487 0 stevel 488 0 stevel FSTATUS * 489 0 stevel search_fptable(register char *paper) 490 0 stevel { 491 3125 jacobs FSTATUS *ps = NULL; 492 3125 jacobs int i; 493 0 stevel 494 3125 jacobs if (FStatus != NULL) { 495 3125 jacobs for (i = 0; ((FStatus[i] != NULL) && (ps == NULL)); i++) 496 3125 jacobs if (SAME(FStatus[i]->form->paper, paper)) { 497 3125 jacobs if (ps->form->isDefault) 498 3125 jacobs ps = FStatus[i]; 499 3125 jacobs } 500 3125 jacobs } 501 0 stevel 502 3125 jacobs return (ps); 503 0 stevel } 504 0 stevel 505 0 stevel CSTATUS * 506 3125 jacobs search_cstatus(register char *name) 507 0 stevel { 508 3125 jacobs CSTATUS *ps = NULL; 509 0 stevel 510 3125 jacobs if (name != NULL) { 511 3125 jacobs if (CStatus != NULL) { 512 3125 jacobs int i; 513 0 stevel 514 3125 jacobs for (i = 0; ((CStatus[i] != NULL) && (ps == NULL)); i++) 515 3125 jacobs if (SAME(CStatus[i]->class->name, name)) 516 3125 jacobs ps = CStatus[i]; 517 3125 jacobs } 518 3125 jacobs } else 519 3125 jacobs ps = new_cstatus(NULL); 520 0 stevel 521 0 stevel return (ps); 522 0 stevel } 523 0 stevel 524 0 stevel PWSTATUS * 525 3125 jacobs search_pwstatus(register char *name) 526 0 stevel { 527 3125 jacobs PWSTATUS *ps = NULL; 528 0 stevel 529 3125 jacobs if (name != NULL) { 530 3125 jacobs if (PWStatus != NULL) { 531 3125 jacobs int i; 532 0 stevel 533 3125 jacobs for (i = 0; ((PWStatus[i] != NULL) && (ps == NULL)); i++) 534 3125 jacobs if (SAME(PWStatus[i]->pwheel->name, name)) 535 3125 jacobs ps = PWStatus[i]; 536 3125 jacobs } 537 3125 jacobs } else 538 3125 jacobs ps = new_pwstatus(NULL); 539 0 stevel 540 0 stevel return (ps); 541 0 stevel } 542 0 stevel 543 0 stevel 544 0 stevel /** 545 0 stevel ** load_str() - LOAD STRING WHERE ALLOC'D STRING MAY BE 546 0 stevel ** unload_str() - REMOVE POSSIBLE ALLOC'D STRING 547 0 stevel **/ 548 0 stevel 549 0 stevel void 550 0 stevel load_str(char **pdst, char *src) 551 0 stevel { 552 0 stevel if (*pdst) 553 0 stevel Free (*pdst); 554 0 stevel *pdst = Strdup(src); 555 0 stevel return; 556 0 stevel } 557 0 stevel 558 0 stevel void 559 0 stevel unload_str(char **pdst) 560 0 stevel { 561 0 stevel if (*pdst) 562 0 stevel Free (*pdst); 563 0 stevel *pdst = 0; 564 0 stevel return; 565 0 stevel } 566 0 stevel 567 0 stevel /** 568 0 stevel ** unload_list() - REMOVE POSSIBLE ALLOC'D LIST 569 0 stevel **/ 570 0 stevel 571 0 stevel void 572 0 stevel unload_list(char ***plist) 573 0 stevel { 574 0 stevel if (*plist) 575 0 stevel freelist (*plist); 576 0 stevel *plist = 0; 577 0 stevel return; 578 0 stevel } 579 0 stevel 580 0 stevel /** 581 0 stevel ** load_sdn() - LOAD STRING WITH ASCII VERSION OF SCALED DECIMAL NUMBER 582 0 stevel **/ 583 0 stevel 584 0 stevel void 585 0 stevel load_sdn(char **p, SCALED sdn) 586 0 stevel { 587 0 stevel if (!p) 588 0 stevel return; 589 0 stevel 590 0 stevel if (*p) 591 0 stevel Free (*p); 592 0 stevel *p = 0; 593 0 stevel 594 0 stevel if (sdn.val <= 0 || 999999 < sdn.val) 595 0 stevel return; 596 0 stevel 597 0 stevel *p = Malloc(sizeof("999999.999x")); 598 0 stevel sprintf ( 599 0 stevel *p, 600 0 stevel "%.3f%s", 601 0 stevel sdn.val, 602 0 stevel (sdn.sc == 'c'? "c" : (sdn.sc == 'i'? "i" : "")) 603 0 stevel ); 604 0 stevel 605 0 stevel return; 606 0 stevel } 607 0 stevel 608 0 stevel /** 609 0 stevel ** Getform() - EASIER INTERFACE TO "getform()" 610 0 stevel **/ 611 0 stevel 612 0 stevel _FORM * 613 0 stevel Getform(char *form) 614 0 stevel { 615 3125 jacobs _FORM *_form; 616 0 stevel 617 0 stevel FORM formbuf; 618 0 stevel 619 0 stevel FALERT alertbuf; 620 0 stevel 621 0 stevel int ret; 622 0 stevel 623 0 stevel 624 0 stevel while ( 625 0 stevel (ret = getform(form, &formbuf, &alertbuf, (FILE **)0)) == -1 626 0 stevel && errno == EINTR 627 0 stevel ) 628 0 stevel ; 629 0 stevel if (ret == -1) 630 0 stevel return (0); 631 0 stevel 632 3125 jacobs _form = calloc(1, sizeof (*_form)); 633 3125 jacobs _form->plen = formbuf.plen; 634 3125 jacobs _form->pwid = formbuf.pwid; 635 3125 jacobs _form->lpi = formbuf.lpi; 636 3125 jacobs _form->cpi = formbuf.cpi; 637 3125 jacobs _form->np = formbuf.np; 638 3125 jacobs _form->chset = formbuf.chset; 639 3125 jacobs _form->mandatory = formbuf.mandatory; 640 3125 jacobs _form->rcolor = formbuf.rcolor; 641 3125 jacobs _form->comment = formbuf.comment; 642 3125 jacobs _form->conttype = formbuf.conttype; 643 3125 jacobs _form->name = formbuf.name; 644 3125 jacobs _form->paper = formbuf.paper; 645 3125 jacobs _form->isDefault = formbuf.isDefault; 646 0 stevel 647 3125 jacobs if ((_form->alert.shcmd = alertbuf.shcmd) != NULL) { 648 3125 jacobs _form->alert.Q = alertbuf.Q; 649 3125 jacobs _form->alert.W = alertbuf.W; 650 0 stevel } else { 651 3125 jacobs _form->alert.Q = 0; 652 3125 jacobs _form->alert.W = 0; 653 0 stevel } 654 0 stevel 655 3125 jacobs return (_form); 656 0 stevel } 657 0 stevel 658 0 stevel /** 659 0 stevel ** Getprinter() 660 0 stevel ** Getrequest() 661 0 stevel ** Getuser() 662 0 stevel ** Getclass() 663 0 stevel ** Getpwheel() 664 0 stevel ** Getsecure() 665 0 stevel ** Loadfilters() 666 0 stevel **/ 667 0 stevel 668 0 stevel PRINTER * 669 0 stevel Getprinter(char *name) 670 0 stevel { 671 0 stevel register PRINTER *ret; 672 0 stevel 673 0 stevel while (!(ret = getprinter(name)) && errno == EINTR) 674 0 stevel ; 675 0 stevel return (ret); 676 0 stevel } 677 0 stevel 678 0 stevel REQUEST * 679 0 stevel Getrequest(char *file) 680 0 stevel { 681 0 stevel register REQUEST *ret; 682 0 stevel 683 0 stevel while (!(ret = getrequest(file)) && errno == EINTR) 684 0 stevel ; 685 0 stevel return (ret); 686 0 stevel } 687 0 stevel 688 0 stevel USER * 689 0 stevel Getuser(char *name) 690 0 stevel { 691 0 stevel register USER *ret; 692 0 stevel 693 0 stevel while (!(ret = getuser(name)) && errno == EINTR) 694 0 stevel ; 695 0 stevel return (ret); 696 0 stevel } 697 0 stevel 698 0 stevel CLASS * 699 0 stevel Getclass(char *name) 700 0 stevel { 701 0 stevel register CLASS *ret; 702 0 stevel 703 0 stevel while (!(ret = getclass(name)) && errno == EINTR) 704 0 stevel ; 705 0 stevel return (ret); 706 0 stevel } 707 0 stevel 708 0 stevel PWHEEL * 709 0 stevel Getpwheel(char *name) 710 0 stevel { 711 0 stevel register PWHEEL *ret; 712 0 stevel 713 0 stevel while (!(ret = getpwheel(name)) && errno == EINTR) 714 0 stevel ; 715 0 stevel return (ret); 716 0 stevel } 717 0 stevel 718 0 stevel SECURE * 719 0 stevel Getsecure(char *file) 720 0 stevel { 721 0 stevel register SECURE *ret; 722 0 stevel 723 0 stevel while (!(ret = getsecure(file)) && errno == EINTR) 724 0 stevel ; 725 0 stevel return ((SECURE *) ret); 726 0 stevel } 727 0 stevel 728 0 stevel 729 0 stevel int 730 0 stevel Loadfilters(char *file) 731 0 stevel { 732 0 stevel register int ret; 733 0 stevel 734 0 stevel while ((ret = loadfilters(file)) == -1 && errno == EINTR) 735 0 stevel ; 736 0 stevel return (ret); 737 0 stevel } 738 0 stevel 739 0 stevel /** 740 0 stevel ** free_form() - FREE MEMORY ALLOCATED FOR _FORM STRUCTURE 741 0 stevel **/ 742 0 stevel 743 0 stevel void 744 0 stevel free_form(register _FORM *pf) 745 0 stevel { 746 0 stevel if (!pf) 747 0 stevel return; 748 0 stevel if (pf->chset) 749 0 stevel Free (pf->chset); 750 0 stevel if (pf->rcolor) 751 0 stevel Free (pf->rcolor); 752 0 stevel if (pf->comment) 753 0 stevel Free (pf->comment); 754 0 stevel if (pf->conttype) 755 0 stevel Free (pf->conttype); 756 0 stevel if (pf->name) 757 0 stevel Free (pf->name); 758 0 stevel if (pf->paper) 759 0 stevel Free (pf->paper); 760 0 stevel pf->name = 0; 761 0 stevel if (pf->alert.shcmd) 762 0 stevel Free (pf->alert.shcmd); 763 0 stevel return; 764 0 stevel } 765 0 stevel 766 0 stevel /** 767 0 stevel ** getreqno() - GET NUMBER PART OF REQUEST ID 768 0 stevel **/ 769 0 stevel 770 0 stevel char * 771 0 stevel getreqno(char *req_id) 772 0 stevel { 773 0 stevel register char *cp; 774 0 stevel 775 0 stevel 776 0 stevel if (!(cp = strrchr(req_id, '-'))) 777 0 stevel cp = req_id; 778 0 stevel else 779 0 stevel cp++; 780 0 stevel return (cp); 781 0 stevel } 782 0 stevel 783 0 stevel /* Putsecure(): Insurance for writing out the secure request file. 784 0 stevel * input: char ptr to name of the request file, 785 0 stevel * ptr to the SECURE structure to be written. 786 0 stevel * ouput: 0 if successful, -1 otherwise. 787 0 stevel * 788 0 stevel * Description: 789 0 stevel * The normal call to putsecure() is woefully lacking. 790 0 stevel * The bottom line here is that there 791 0 stevel * is no way to make sure that the file has been written out 792 0 stevel * as expected. This can cause rude behaviour later on. 793 0 stevel * 794 0 stevel * This routine calls putsecure(), and then does a getsecure(). 795 0 stevel * The results are compared to the original structure. If the 796 0 stevel * info obtained by getsecure() doesn't match, we retry a few 797 0 stevel * times before giving up (presumably something is very seriously 798 0 stevel * wrong at that point). 799 0 stevel */ 800 0 stevel 801 0 stevel 802 0 stevel int 803 0 stevel Putsecure(char *file, SECURE *secbufp) 804 0 stevel { 805 0 stevel SECURE *pls; 806 0 stevel int retries = 5; /* # of attempts */ 807 0 stevel int status; /* 0 = success, nonzero otherwise */ 808 0 stevel 809 0 stevel 810 0 stevel while (retries--) { 811 0 stevel status = 1; /* assume the worst, hope for the best */ 812 0 stevel if (putsecure(file, secbufp) == -1) { 813 0 stevel rmsecure(file); 814 0 stevel continue; 815 0 stevel } 816 0 stevel 817 0 stevel if ((pls = getsecure(file)) == (SECURE *) NULL) { 818 0 stevel rmsecure(file); 819 0 stevel status = 2; 820 0 stevel continue; 821 0 stevel } 822 0 stevel 823 0 stevel /* now compare each field */ 824 0 stevel 825 0 stevel /* 826 0 stevel * A comparison is only valid if secbufp and pls point to 827 0 stevel * different locations. In reality getsecure() will have 828 0 stevel * already been called, allocating the same STATIC memory 829 0 stevel * location to both structures making the following compare 830 0 stevel * meaningless. 831 0 stevel * Therefore test for this condition to prevent us from 832 3125 jacobs * calling freesecure which will destroy uid and 833 0 stevel * req_id fields in the strucure 834 0 stevel */ 835 0 stevel 836 0 stevel status = 0; 837 0 stevel if (secbufp != pls) { 838 0 stevel if (strcmp(pls->req_id, secbufp->req_id) != 0) { 839 0 stevel rmsecure(file); 840 0 stevel status = 3; 841 0 stevel continue; 842 0 stevel } 843 0 stevel 844 0 stevel if (pls->uid != secbufp->uid) { 845 0 stevel rmsecure(file); 846 0 stevel status = 4; 847 0 stevel continue; 848 0 stevel } 849 0 stevel 850 0 stevel if (strcmp(pls->user, secbufp->user) != 0) { 851 0 stevel rmsecure(file); 852 0 stevel status = 5; 853 0 stevel continue; 854 0 stevel } 855 0 stevel 856 0 stevel if (pls->gid != secbufp->gid) { 857 0 stevel rmsecure(file); 858 0 stevel status = 6; 859 0 stevel continue; 860 0 stevel } 861 0 stevel 862 0 stevel if (pls->size != secbufp->size) { 863 0 stevel rmsecure(file); 864 0 stevel status = 7; 865 0 stevel continue; 866 0 stevel } 867 0 stevel 868 0 stevel if (pls->date != secbufp->date) { 869 0 stevel rmsecure(file); 870 0 stevel status = 8; 871 0 stevel continue; 872 0 stevel } 873 0 stevel 874 0 stevel freesecure(pls); 875 0 stevel } 876 0 stevel break; 877 0 stevel } 878 0 stevel 879 0 stevel if (status != 0) { 880 0 stevel note("Putsecure failed, status=%d\n", status); 881 0 stevel return -1; 882 0 stevel } 883 0 stevel 884 0 stevel return 0; 885 0 stevel } 886 0 stevel 887 0 stevel void GetRequestFiles(REQUEST *req, char *buffer, int length) 888 0 stevel { 889 0 stevel char buf[BUFSIZ]; 890 0 stevel 891 0 stevel memset(buf, 0, sizeof(buf)); 892 0 stevel 893 0 stevel if (req->title) { 894 0 stevel char *r = req->title; 895 0 stevel char *ptr = buf; 896 0 stevel 897 0 stevel while ( *r && strncmp(r,"\\n",2)) { 898 0 stevel *ptr++ = *r++; 899 0 stevel } 900 0 stevel } else if (req->file_list) 901 0 stevel strlcpy(buf, *req->file_list, sizeof (buf)); 902 0 stevel 903 0 stevel if (*buf == NULL || !strncmp(buf, SPOOLDIR, sizeof(SPOOLDIR)-1)) 904 0 stevel strcpy(buf, "<File name not available>"); 905 0 stevel 906 0 stevel if (strlen(buf) > (size_t) 24) { 907 0 stevel char *r; 908 0 stevel 909 0 stevel if (r = strrchr(buf, '/')) 910 0 stevel r++; 911 0 stevel else 912 0 stevel r = buf; 913 0 stevel 914 0 stevel snprintf(buffer, length, "%-.24s", r); 915 0 stevel } else 916 0 stevel strlcpy(buffer, buf, length); 917 0 stevel return; 918 0 stevel } 919 0 stevel 920 0 stevel 921 0 stevel /** 922 0 stevel ** _Malloc() 923 0 stevel ** _Realloc() 924 0 stevel ** _Calloc() 925 0 stevel ** _Strdup() 926 0 stevel ** _Free() 927 0 stevel **/ 928 0 stevel 929 0 stevel void (*lp_alloc_fail_handler)( void ) = 0; 930 0 stevel 931 0 stevel typedef void *alloc_type; 932 0 stevel 933 0 stevel alloc_type 934 0 stevel _Malloc(size_t size, const char *file, int line) 935 0 stevel { 936 0 stevel alloc_type ret; 937 0 stevel 938 0 stevel ret = malloc(size); 939 0 stevel if (!ret) { 940 0 stevel if (lp_alloc_fail_handler) 941 0 stevel (*lp_alloc_fail_handler)(); 942 0 stevel errno = ENOMEM; 943 0 stevel } 944 0 stevel return (ret); 945 0 stevel } 946 0 stevel 947 0 stevel alloc_type 948 0 stevel _Realloc(void *ptr, size_t size, const char *file, int line) 949 0 stevel { 950 0 stevel alloc_type ret = realloc(ptr, size); 951 0 stevel 952 0 stevel if (!ret) { 953 0 stevel if (lp_alloc_fail_handler) 954 0 stevel (*lp_alloc_fail_handler)(); 955 0 stevel errno = ENOMEM; 956 0 stevel } 957 0 stevel return (ret); 958 0 stevel } 959 0 stevel 960 0 stevel alloc_type 961 0 stevel _Calloc(size_t nelem, size_t elsize, const char *file, int line) 962 0 stevel { 963 0 stevel alloc_type ret = calloc(nelem, elsize); 964 0 stevel 965 0 stevel if (!ret) { 966 0 stevel if (lp_alloc_fail_handler) 967 0 stevel (*lp_alloc_fail_handler)(); 968 0 stevel errno = ENOMEM; 969 0 stevel } 970 0 stevel return (ret); 971 0 stevel } 972 0 stevel 973 0 stevel char * 974 0 stevel _Strdup(const char *s, const char *file, int line) 975 0 stevel { 976 0 stevel char * ret; 977 0 stevel 978 0 stevel if (!s) 979 0 stevel return( (char *) 0); 980 0 stevel 981 0 stevel ret = strdup(s); 982 0 stevel 983 0 stevel if (!ret) { 984 0 stevel if (lp_alloc_fail_handler) 985 0 stevel (*lp_alloc_fail_handler)(); 986 0 stevel errno = ENOMEM; 987 0 stevel } 988 0 stevel return (ret); 989 0 stevel } 990 0 stevel 991 0 stevel void 992 0 stevel _Free(void *ptr, const char *file, int line) 993 0 stevel { 994 0 stevel free (ptr); 995 0 stevel return; 996 0 stevel } 997