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   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