Home | History | Annotate | Download | only in lpsched
      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