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 3125 jacobs /* 23 3125 jacobs * Copyright 2006 Sun Microsystems, Inc. All rights reserved. 24 3125 jacobs * Use is subject to license terms. 25 3125 jacobs */ 26 3125 jacobs 27 0 stevel /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ 28 0 stevel /* All Rights Reserved */ 29 0 stevel 30 0 stevel #pragma ident "%Z%%M% %I% %E% SMI" 31 0 stevel 32 0 stevel #include "stdlib.h" 33 0 stevel #include "string.h" 34 0 stevel #include "unistd.h" 35 0 stevel #include <syslog.h> 36 0 stevel 37 0 stevel #include "lpsched.h" 38 0 stevel 39 0 stevel #define NCMP(X,Y) (STRNEQU((X), (Y), sizeof(Y)-1)) 40 0 stevel 41 0 stevel static void load_pstatus ( void ); 42 0 stevel static void load_fault_status ( void ); 43 0 stevel static void load_cstatus ( void ); 44 0 stevel static void put_multi_line ( int , char * ); 45 0 stevel static PFSTATUS * parseFormList ( char *,short *); 46 0 stevel static void markFormsMounted( PSTATUS *); 47 0 stevel 48 0 stevel 49 0 stevel #define FAULT_MESSAGE_FILE "faultMessage" 50 0 stevel static char *pstatus = 0, 51 0 stevel *cstatus = 0; 52 0 stevel 53 0 stevel /** 54 0 stevel ** load_status() - LOAD PRINTER/CLASS STATUS FILES 55 0 stevel **/ 56 0 stevel 57 0 stevel void 58 0 stevel load_status(void) 59 0 stevel { 60 0 stevel load_pstatus (); 61 0 stevel 62 0 stevel load_cstatus (); 63 0 stevel load_fault_status (); 64 0 stevel return; 65 0 stevel } 66 0 stevel 67 0 stevel /** 68 0 stevel ** load_pstatus() - LOAD PRITNER STATUS FILE 69 0 stevel **/ 70 0 stevel 71 0 stevel static void 72 0 stevel load_pstatus(void) 73 0 stevel { 74 0 stevel PSTATUS *pps; 75 0 stevel 76 0 stevel char *rej_reason, 77 0 stevel *dis_reason, 78 0 stevel *pwheel_name, 79 0 stevel buf[BUFSIZ], 80 0 stevel *name, 81 0 stevel *p; 82 0 stevel 83 0 stevel time_t rej_date, 84 0 stevel dis_date; 85 0 stevel 86 0 stevel short status; 87 0 stevel 88 0 stevel PFSTATUS *ppfs; 89 0 stevel 90 0 stevel PWSTATUS *ppws; 91 0 stevel 92 0 stevel int i, 93 0 stevel len, 94 0 stevel total; 95 0 stevel 96 0 stevel time_t now; 97 0 stevel 98 0 stevel int fd; 99 0 stevel 100 0 stevel register int f; 101 0 stevel short numForms; 102 0 stevel 103 0 stevel 104 0 stevel (void) time(&now); 105 0 stevel 106 0 stevel if (!pstatus) 107 0 stevel pstatus = makepath(Lp_System, PSTATUSFILE, (char *)0); 108 0 stevel if ((fd = open_locked(pstatus, "r", 0)) >= 0) { 109 0 stevel char *tmp = pstatus; /* not NULL */ 110 0 stevel 111 0 stevel while (tmp != NULL) { 112 0 stevel status = 0; 113 0 stevel total = 0; 114 0 stevel name = 0; 115 0 stevel rej_reason = 0; 116 0 stevel dis_reason = 0; 117 0 stevel ppfs = 0; 118 0 stevel 119 0 stevel errno = 0; 120 0 stevel for (f = 0; 121 0 stevel (f < PST_MAX) && (tmp = fdgets(buf, BUFSIZ, fd)); 122 0 stevel f++) { 123 0 stevel if (p = strrchr(buf, '\n')) 124 0 stevel *p = '\0'; 125 0 stevel 126 0 stevel switch (f) { 127 0 stevel case PST_BRK: 128 0 stevel break; 129 0 stevel 130 0 stevel case PST_NAME: 131 0 stevel name = Strdup(buf); 132 0 stevel break; 133 0 stevel 134 0 stevel case PST_STATUS: 135 0 stevel if (NCMP(buf, NAME_DISABLED)) 136 0 stevel status |= PS_DISABLED; 137 0 stevel p = strchr(buf, ' '); 138 0 stevel if (!p || !*(++p)) 139 0 stevel break; 140 0 stevel if (NCMP(p, NAME_REJECTING)) 141 0 stevel status |= PS_REJECTED; 142 0 stevel break; 143 0 stevel 144 0 stevel case PST_DATE: 145 0 stevel dis_date = (time_t)atol(buf); 146 0 stevel p = strchr(buf, ' '); 147 0 stevel if (!p || !*(++p)) 148 0 stevel break; 149 0 stevel rej_date = (time_t)atol(p); 150 0 stevel break; 151 0 stevel 152 0 stevel case PST_DISREAS: 153 0 stevel len = strlen(buf); 154 0 stevel if (buf[len - 1] == '\\') { 155 0 stevel buf[len - 1] = '\n'; 156 0 stevel f--; 157 0 stevel } 158 0 stevel if (dis_reason) { 159 0 stevel total += len; 160 0 stevel dis_reason = Realloc( 161 0 stevel dis_reason, 162 0 stevel total+1 163 0 stevel ); 164 0 stevel strcat (dis_reason, buf); 165 0 stevel } else { 166 0 stevel dis_reason = Strdup(buf); 167 0 stevel total = len; 168 0 stevel } 169 0 stevel break; 170 0 stevel 171 0 stevel case PST_REJREAS: 172 0 stevel len = strlen(buf); 173 0 stevel if (buf[len - 1] == '\\') { 174 0 stevel buf[len - 1] = '\n'; 175 0 stevel f--; 176 0 stevel } 177 0 stevel if (rej_reason) { 178 0 stevel total += len; 179 0 stevel rej_reason = Realloc( 180 0 stevel rej_reason, 181 0 stevel total+1 182 0 stevel ); 183 0 stevel strcat (rej_reason, buf); 184 0 stevel } else { 185 0 stevel rej_reason = Strdup(buf); 186 0 stevel total = len; 187 0 stevel } 188 0 stevel break; 189 0 stevel 190 0 stevel case PST_PWHEEL: 191 0 stevel if (*buf) { 192 3125 jacobs ppws = search_pwstatus(buf); 193 0 stevel pwheel_name = Strdup(buf); 194 0 stevel } else { 195 0 stevel ppws = 0; 196 0 stevel pwheel_name = 0; 197 0 stevel } 198 0 stevel break; 199 0 stevel 200 0 stevel case PST_FORM: 201 0 stevel ppfs = parseFormList (buf,&numForms); 202 0 stevel break; 203 0 stevel } 204 0 stevel } 205 0 stevel 206 0 stevel if ((errno != 0) || f && f != PST_MAX) { 207 0 stevel close(fd); 208 0 stevel note("Had trouble reading file %s", pstatus); 209 0 stevel return; 210 0 stevel } 211 0 stevel 212 0 stevel if ((tmp != NULL) && name && 213 3125 jacobs (pps = search_pstatus(name))) { 214 0 stevel pps->rej_date = rej_date; 215 0 stevel pps->status |= status; 216 0 stevel pps->forms = ppfs; 217 0 stevel if (ppfs) markFormsMounted(pps); 218 0 stevel pps->numForms = numForms; 219 0 stevel pps->pwheel_name = pwheel_name; 220 0 stevel if ((pps->pwheel = ppws) != NULL) 221 0 stevel ppws->mounted++; 222 0 stevel pps->rej_reason = rej_reason; 223 0 stevel load_str(&pps->fault_reason, CUZ_PRINTING_OK); 224 0 stevel if (pps->printer->login) { 225 0 stevel pps->dis_date = now; 226 0 stevel pps->dis_reason = 227 0 stevel Strdup(CUZ_LOGIN_PRINTER); 228 0 stevel } else { 229 0 stevel pps->dis_date = dis_date; 230 0 stevel pps->dis_reason = dis_reason; 231 0 stevel } 232 0 stevel 233 0 stevel } else { 234 0 stevel if (ppfs) 235 0 stevel Free(ppfs); 236 0 stevel if (dis_reason) 237 0 stevel Free (dis_reason); 238 0 stevel if (rej_reason) 239 0 stevel Free (rej_reason); 240 0 stevel } 241 0 stevel if (name) 242 0 stevel Free (name); 243 0 stevel } 244 0 stevel } 245 0 stevel 246 0 stevel if (fd >= 0) { 247 0 stevel if (errno != 0) { 248 0 stevel close(fd); 249 0 stevel note("Had trouble reading file %s", pstatus); 250 0 stevel return; 251 0 stevel } 252 0 stevel close(fd); 253 0 stevel } 254 0 stevel 255 3125 jacobs for (i = 0; PStatus != NULL && PStatus[i] != NULL; i++) 256 3125 jacobs if (PStatus[i]->printer->name && !PStatus[i]->rej_reason) { 257 3125 jacobs PStatus[i]->dis_reason = Strdup(CUZ_NEW_PRINTER); 258 3125 jacobs PStatus[i]->rej_reason = Strdup(CUZ_NEW_DEST); 259 3125 jacobs PStatus[i]->fault_reason = Strdup(CUZ_PRINTING_OK); 260 3125 jacobs PStatus[i]->dis_date = now; 261 3125 jacobs PStatus[i]->rej_date = now; 262 3125 jacobs PStatus[i]->status |= PS_DISABLED | PS_REJECTED; 263 0 stevel } 264 0 stevel 265 0 stevel return; 266 0 stevel } 267 0 stevel 268 0 stevel /** 269 0 stevel ** load_fault_status() - LOAD PRITNER Fault STATUS FILE 270 0 stevel **/ 271 0 stevel 272 0 stevel static void 273 0 stevel load_fault_status(void) 274 0 stevel { 275 0 stevel char *fault_reason = NULL, 276 0 stevel buf[BUFSIZ], 277 0 stevel *fault_status, 278 0 stevel *printerName, 279 0 stevel *p; 280 0 stevel 281 0 stevel int i, 282 0 stevel len, 283 0 stevel total; 284 0 stevel 285 0 stevel 286 0 stevel int fd; 287 0 stevel 288 3125 jacobs for (i = 0; PStatus != NULL && PStatus[i] != NULL; i++) { 289 3125 jacobs PSTATUS *pps = PStatus[i]; 290 3125 jacobs 291 3125 jacobs printerName = pps->printer->name; 292 0 stevel if (printerName) { 293 0 stevel fault_status = makepath(Lp_A_Printers, printerName, 294 0 stevel FAULT_MESSAGE_FILE , (char *) 0); 295 0 stevel fault_reason = NULL; 296 0 stevel total = 0; 297 0 stevel 298 0 stevel if ((fd = open_locked(fault_status, "r", 0)) >= 0) { 299 0 stevel while (fdgets(buf, BUFSIZ, fd)) { 300 0 stevel len = strlen(buf); 301 0 stevel if (fault_reason) { 302 0 stevel total += len; 303 0 stevel fault_reason = 304 0 stevel Realloc(fault_reason, 305 0 stevel total+1); 306 0 stevel strcat (fault_reason, buf); 307 0 stevel } else { 308 0 stevel fault_reason = Strdup(buf); 309 0 stevel total = len; 310 0 stevel } 311 0 stevel } 312 0 stevel 313 0 stevel if (fault_reason && 314 3125 jacobs (pps = search_pstatus(printerName))) { 315 0 stevel p = fault_reason + strlen(fault_reason) 316 0 stevel - 1; 317 0 stevel if (*p == '\n') 318 0 stevel *p = 0; 319 0 stevel load_str(&pps->fault_reason, 320 0 stevel fault_reason); 321 0 stevel } 322 0 stevel if (fault_reason) 323 0 stevel Free(fault_reason); 324 0 stevel 325 0 stevel close(fd); 326 0 stevel } 327 0 stevel Free(fault_status); 328 0 stevel } 329 0 stevel } 330 0 stevel } 331 0 stevel 332 0 stevel 333 0 stevel /** 334 0 stevel ** load_cstatus() - LOAD CLASS STATUS FILE 335 0 stevel **/ 336 0 stevel 337 0 stevel static void 338 0 stevel load_cstatus(void) 339 0 stevel { 340 0 stevel CSTATUS *pcs; 341 0 stevel char *rej_reason, 342 0 stevel buf[BUFSIZ], 343 0 stevel *name, 344 0 stevel *p; 345 0 stevel time_t rej_date; 346 0 stevel short status; 347 0 stevel int i, 348 0 stevel len, 349 0 stevel total; 350 0 stevel time_t now; 351 0 stevel int fd; 352 0 stevel register int f; 353 0 stevel 354 0 stevel 355 0 stevel (void) time(&now); 356 0 stevel 357 0 stevel if (!cstatus) 358 0 stevel cstatus = makepath(Lp_System, CSTATUSFILE, (char *)0); 359 0 stevel 360 0 stevel if ((fd = open_locked(cstatus, "r", 0)) >= 0) { 361 0 stevel char *tmp = cstatus; /* not NULL */ 362 0 stevel 363 0 stevel errno = 0; 364 0 stevel while (tmp != NULL) { 365 0 stevel status = 0; 366 0 stevel 367 0 stevel total = 0; 368 0 stevel name = 0; 369 0 stevel 370 0 stevel rej_reason = 0; 371 0 stevel for (f = 0; 372 0 stevel (f < CST_MAX) && (tmp = fdgets(buf, BUFSIZ, fd)); 373 0 stevel f++) { 374 0 stevel if (p = strrchr(buf, '\n')) 375 0 stevel *p = '\0'; 376 0 stevel switch (f) { 377 0 stevel case CST_BRK: 378 0 stevel break; 379 0 stevel 380 0 stevel case CST_NAME: 381 0 stevel name = Strdup(buf); 382 0 stevel break; 383 0 stevel 384 0 stevel case CST_STATUS: 385 0 stevel if (NCMP(buf, NAME_REJECTING)) 386 0 stevel status |= PS_REJECTED; 387 0 stevel break; 388 0 stevel 389 0 stevel case CST_DATE: 390 0 stevel rej_date = (time_t)atol(buf); 391 0 stevel break; 392 0 stevel 393 0 stevel case CST_REJREAS: 394 0 stevel len = strlen(buf); 395 0 stevel if (buf[len - 1] == '\\') { 396 0 stevel buf[len - 1] = '\n'; 397 0 stevel f--; 398 0 stevel } 399 0 stevel if (rej_reason) { 400 0 stevel total += len; 401 0 stevel rej_reason = Realloc( 402 0 stevel rej_reason, 403 0 stevel total+1 404 0 stevel ); 405 0 stevel strcat (rej_reason, buf); 406 0 stevel } else { 407 0 stevel rej_reason = Strdup(buf); 408 0 stevel total = len; 409 0 stevel } 410 0 stevel break; 411 0 stevel } 412 0 stevel } 413 0 stevel 414 0 stevel if ((errno != 0) || f && f != CST_MAX) { 415 0 stevel close(fd); 416 0 stevel note("Had trouble reading file %s", cstatus); 417 0 stevel return; 418 0 stevel } 419 0 stevel 420 0 stevel if ((tmp != NULL) && name && 421 3125 jacobs (pcs = search_cstatus(name))) { 422 0 stevel pcs->rej_reason = rej_reason; 423 0 stevel pcs->rej_date = rej_date; 424 0 stevel pcs->status |= status; 425 0 stevel 426 0 stevel } else 427 0 stevel if (rej_reason) 428 0 stevel Free (rej_reason); 429 0 stevel 430 0 stevel if (name) 431 0 stevel Free (name); 432 0 stevel } 433 0 stevel } 434 0 stevel 435 0 stevel if (fd >= 0) { 436 0 stevel if (errno != 0) { 437 0 stevel close(fd); 438 0 stevel note("Had trouble reading file %s", cstatus); 439 0 stevel return; 440 0 stevel } 441 0 stevel close(fd); 442 0 stevel } 443 0 stevel 444 3125 jacobs for (i = 0; CStatus != NULL && CStatus[i] != NULL; i++) 445 3125 jacobs if (CStatus[i]->class->name && !CStatus[i]->rej_reason) { 446 3125 jacobs CStatus[i]->status |= CS_REJECTED; 447 3125 jacobs CStatus[i]->rej_reason = Strdup(CUZ_NEW_DEST); 448 3125 jacobs CStatus[i]->rej_date = now; 449 0 stevel } 450 0 stevel 451 0 stevel return; 452 0 stevel } 453 0 stevel 454 0 stevel /** 455 0 stevel ** showForms() 456 0 stevel **/ 457 0 stevel char * 458 0 stevel showForms(PSTATUS *pps) 459 0 stevel { 460 0 stevel int i; 461 0 stevel char *formList = NULL; 462 0 stevel char buf[100]; 463 0 stevel FSTATUS *pfs; 464 0 stevel PFSTATUS *ppfs; 465 0 stevel short numForms; 466 0 stevel 467 0 stevel numForms = pps->numForms; 468 0 stevel ppfs = pps->forms; 469 0 stevel if (ppfs) { 470 0 stevel for (i = 0; i < numForms; i++) { 471 0 stevel pfs = ppfs[i].form; 472 0 stevel snprintf(buf, sizeof (buf), "%s%c", 473 3125 jacobs (pfs ? pfs->form->name : ""), 474 3125 jacobs ((i + 1 < numForms) ? *LP_SEP : '\0')); 475 0 stevel 476 0 stevel if (addstring(&formList,buf)) { /* allocation failed */ 477 0 stevel if (formList) { 478 0 stevel Free(formList); 479 0 stevel formList = NULL; 480 0 stevel } 481 0 stevel return(NULL); 482 0 stevel } 483 0 stevel } 484 0 stevel } 485 0 stevel return(formList); 486 0 stevel } 487 0 stevel 488 0 stevel /** 489 0 stevel ** markFormsMounted() 490 0 stevel **/ 491 0 stevel 492 0 stevel void 493 0 stevel markFormsMounted(PSTATUS *pps) 494 0 stevel { 495 0 stevel int i; 496 0 stevel int numTrays; 497 0 stevel PFSTATUS *ppfs; 498 0 stevel FSTATUS *pfs; 499 0 stevel 500 0 stevel 501 0 stevel ppfs = pps->forms; 502 0 stevel if (ppfs) { 503 0 stevel numTrays = pps->numForms; 504 0 stevel for (i = 0; i < numTrays; i++) { 505 0 stevel pfs = ppfs[i].form; 506 0 stevel if (pfs) 507 0 stevel pfs->mounted++; 508 0 stevel } 509 0 stevel } 510 0 stevel } 511 0 stevel 512 0 stevel /** 513 0 stevel ** parseFormList() 514 0 stevel **/ 515 0 stevel 516 0 stevel static PFSTATUS * 517 0 stevel parseFormList(char *formList, short *num) 518 0 stevel { 519 0 stevel int i; 520 0 stevel FSTATUS *pfs; 521 0 stevel PFSTATUS *ppfs; 522 0 stevel short numForms=0; 523 0 stevel char *endPtr,*ptr; 524 0 stevel 525 0 stevel 526 0 stevel ptr = strchr(formList,*LP_SEP); 527 0 stevel while (ptr) { 528 0 stevel numForms++; 529 0 stevel ptr = strchr(ptr+1,*LP_SEP); 530 0 stevel } 531 0 stevel if ((numForms == 0) && (*formList)) 532 0 stevel numForms = 1; 533 0 stevel 534 0 stevel if (numForms && 535 0 stevel (ppfs = (PFSTATUS *) Calloc(numForms, sizeof(PFSTATUS)))) { 536 0 stevel endPtr = strchr(formList,*LP_SEP); 537 0 stevel if (!endPtr) 538 0 stevel endPtr = formList + strlen(formList); 539 0 stevel 540 0 stevel ptr = formList; 541 0 stevel for (i = 0; endPtr && (i < numForms); i++) { 542 0 stevel *endPtr = 0; 543 3125 jacobs ppfs[i].form = pfs = search_fstatus(ptr); 544 3125 jacobs ppfs[i].isAvailable = (pfs ? 1 : 0); 545 0 stevel ptr = endPtr+1; 546 0 stevel endPtr = strchr(ptr,*LP_SEP); 547 0 stevel } 548 0 stevel *num = numForms; 549 0 stevel } else { 550 0 stevel ppfs = NULL; 551 0 stevel *num = 0; 552 0 stevel } 553 0 stevel return(ppfs); 554 0 stevel } 555 0 stevel 556 0 stevel /** 557 0 stevel ** dump_pstatus() - DUMP PRINTER STATUS FILE 558 0 stevel **/ 559 0 stevel 560 0 stevel void 561 0 stevel dump_pstatus(void) 562 0 stevel { 563 0 stevel PSTATUS *ppsend; 564 0 stevel int fd; 565 0 stevel register PSTATUS *pps; 566 0 stevel register int f; 567 3125 jacobs int i; 568 0 stevel 569 0 stevel if (!pstatus) 570 0 stevel pstatus = makepath(Lp_System, PSTATUSFILE, (char *)0); 571 0 stevel if ((fd = open_locked(pstatus, "w", MODE_READ)) < 0) { 572 0 stevel note ("Can't open file \"%s\" (%s).\n", pstatus, PERROR); 573 0 stevel return; 574 0 stevel } 575 0 stevel 576 3125 jacobs for (i = 0; PStatus != NULL && PStatus[i] != NULL; i++) { 577 3125 jacobs PSTATUS *pps = PStatus[i]; 578 3125 jacobs 579 0 stevel if (pps->printer->name) 580 0 stevel for (f = 0; f < PST_MAX; f++) switch (f) { 581 0 stevel case PST_BRK: 582 0 stevel (void)fdprintf(fd, "+%s\n", STATUS_BREAK); 583 0 stevel break; 584 0 stevel case PST_NAME: 585 0 stevel (void)fdprintf(fd, "%s\n", 586 0 stevel NB(pps->printer->name)); 587 0 stevel break; 588 0 stevel case PST_STATUS: 589 0 stevel (void)fdprintf(fd, "%s %s\n", 590 0 stevel (pps->status & PS_DISABLED ? 591 0 stevel NAME_DISABLED : NAME_ENABLED), 592 0 stevel (pps->status & PS_REJECTED ? 593 0 stevel NAME_REJECTING : NAME_ACCEPTING)); 594 0 stevel break; 595 0 stevel case PST_DATE: 596 0 stevel (void)fdprintf(fd, "%ld %ld\n", pps->dis_date, 597 0 stevel pps->rej_date); 598 0 stevel break; 599 0 stevel case PST_DISREAS: 600 0 stevel put_multi_line(fd, pps->dis_reason); 601 0 stevel break; 602 0 stevel case PST_REJREAS: 603 0 stevel put_multi_line(fd, pps->rej_reason); 604 0 stevel break; 605 0 stevel case PST_PWHEEL: 606 0 stevel (void)fdprintf(fd, "%s\n", 607 0 stevel NB(pps->pwheel_name)); 608 0 stevel break; 609 0 stevel case PST_FORM: { 610 0 stevel char *list; 611 0 stevel list = showForms(pps); 612 0 stevel (void)fdprintf(fd, "%s\n", (list ? list : "")); 613 0 stevel if (list) 614 0 stevel Free(list); 615 0 stevel break; 616 0 stevel } 617 0 stevel } 618 3125 jacobs } 619 0 stevel close(fd); 620 0 stevel 621 0 stevel return; 622 0 stevel } 623 0 stevel 624 0 stevel /** 625 0 stevel ** dump_fault_status() - DUMP PRINTER FAULT STATUS FILE 626 0 stevel **/ 627 0 stevel 628 0 stevel void 629 0 stevel dump_fault_status(PSTATUS *pps) 630 0 stevel { 631 0 stevel int fd; 632 0 stevel char *fault_status, *printerName; 633 0 stevel 634 0 stevel printerName = pps->printer->name; 635 0 stevel fault_status = makepath(Lp_A_Printers, printerName, FAULT_MESSAGE_FILE, 636 0 stevel (char *) 0); 637 0 stevel if ((fd = open_locked(fault_status, "w", MODE_READ)) < 0) { 638 3125 jacobs syslog(LOG_DEBUG, "Can't open file %s (%m)", fault_status); 639 0 stevel } else { 640 0 stevel fdprintf(fd, "%s\n", pps->fault_reason); 641 0 stevel close(fd); 642 0 stevel } 643 0 stevel 644 0 stevel Free(fault_status); 645 0 stevel return; 646 0 stevel } 647 0 stevel 648 0 stevel 649 0 stevel /** 650 0 stevel ** dump_cstatus() - DUMP CLASS STATUS FILE 651 0 stevel **/ 652 0 stevel 653 0 stevel void 654 0 stevel dump_cstatus(void) 655 0 stevel { 656 0 stevel int fd; 657 0 stevel register int f; 658 3125 jacobs int i; 659 0 stevel 660 0 stevel 661 0 stevel if (!cstatus) 662 0 stevel cstatus = makepath(Lp_System, CSTATUSFILE, (char *)0); 663 0 stevel if ((fd = open_locked(cstatus, "w", MODE_READ)) < 0) { 664 3125 jacobs syslog(LOG_DEBUG, "Can't open file %s (%m)", cstatus); 665 0 stevel return; 666 0 stevel } 667 0 stevel 668 3125 jacobs for (i = 0; CStatus != NULL && CStatus[i] != NULL; i++) { 669 3125 jacobs CSTATUS *pcs = CStatus[i]; 670 3125 jacobs 671 0 stevel if (pcs->class->name) 672 0 stevel for (f = 0; f < CST_MAX; f++) switch (f) { 673 0 stevel case CST_BRK: 674 0 stevel (void)fdprintf(fd, "%s\n", STATUS_BREAK); 675 0 stevel break; 676 0 stevel case CST_NAME: 677 0 stevel (void)fdprintf(fd, "%s\n", 678 0 stevel NB(pcs->class->name)); 679 0 stevel break; 680 0 stevel case CST_STATUS: 681 0 stevel (void)fdprintf(fd, "%s\n", 682 0 stevel (pcs->status & CS_REJECTED ? 683 0 stevel NAME_REJECTING : NAME_ACCEPTING) 684 0 stevel ); 685 0 stevel break; 686 0 stevel case CST_DATE: 687 0 stevel (void)fdprintf(fd, "%ld\n", pcs->rej_date); 688 0 stevel break; 689 0 stevel case CST_REJREAS: 690 0 stevel put_multi_line(fd, pcs->rej_reason); 691 0 stevel break; 692 0 stevel } 693 3125 jacobs } 694 0 stevel close(fd); 695 0 stevel 696 0 stevel return; 697 0 stevel } 698 0 stevel 699 0 stevel /** 700 0 stevel ** put_multi_line() - PRINT OUT MULTI-LINE TEXT 701 0 stevel **/ 702 0 stevel 703 0 stevel static void 704 0 stevel put_multi_line(int fd, char *buf) 705 0 stevel { 706 0 stevel register char *cp, 707 0 stevel *p; 708 0 stevel 709 0 stevel if (!buf) { 710 0 stevel (void)fdprintf(fd, "\n"); 711 0 stevel return; 712 0 stevel } 713 0 stevel 714 0 stevel for (p = buf; (cp = strchr(p, '\n')); ) { 715 0 stevel *cp++ = 0; 716 0 stevel (void)fdprintf(fd, "%s\\\n", p); 717 0 stevel p = cp; 718 0 stevel } 719 0 stevel (void)fdprintf(fd, "%s\n", p); 720 0 stevel return; 721 0 stevel } 722