xref: /illumos-gate/usr/src/cmd/lp/cmd/lpsched/disp1.c (revision e4fb8a5f)
17c478bd9Sstevel@tonic-gate /*
27c478bd9Sstevel@tonic-gate  * CDDL HEADER START
37c478bd9Sstevel@tonic-gate  *
47c478bd9Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
545916cd2Sjpk  * Common Development and Distribution License (the "License").
645916cd2Sjpk  * You may not use this file except in compliance with the License.
77c478bd9Sstevel@tonic-gate  *
87c478bd9Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
97c478bd9Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
107c478bd9Sstevel@tonic-gate  * See the License for the specific language governing permissions
117c478bd9Sstevel@tonic-gate  * and limitations under the License.
127c478bd9Sstevel@tonic-gate  *
137c478bd9Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
147c478bd9Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
157c478bd9Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
167c478bd9Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
177c478bd9Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
187c478bd9Sstevel@tonic-gate  *
197c478bd9Sstevel@tonic-gate  * CDDL HEADER END
207c478bd9Sstevel@tonic-gate  */
217c478bd9Sstevel@tonic-gate /*
22bb698c4dSsonam gupta - Sun Microsystems - Bangalore India  * Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved.
2348bbca81SDaniel Hoffman  * Copyright (c) 2016 by Delphix. All rights reserved.
247c478bd9Sstevel@tonic-gate  */
257c478bd9Sstevel@tonic-gate 
26f928ce67Sceastha /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
27f928ce67Sceastha /*	  All Rights Reserved  	*/
28f928ce67Sceastha 
297c478bd9Sstevel@tonic-gate #include "dispatch.h"
307c478bd9Sstevel@tonic-gate #include <sys/types.h>
317c478bd9Sstevel@tonic-gate #include <sys/stat.h>
327c478bd9Sstevel@tonic-gate #include <syslog.h>
337c478bd9Sstevel@tonic-gate 
34f928ce67Sceastha static char	*reqpath(char *, char **);
35f928ce67Sceastha static int	mv_file(RSTATUS *, char *);
367c478bd9Sstevel@tonic-gate 
377c478bd9Sstevel@tonic-gate 
387c478bd9Sstevel@tonic-gate RSTATUS			*NewRequest;
397c478bd9Sstevel@tonic-gate 
4018188661Ssonam gupta - Sun Microsystems - Bangalore India /*
4118188661Ssonam gupta - Sun Microsystems - Bangalore India  * s_alloc_files()
4218188661Ssonam gupta - Sun Microsystems - Bangalore India  */
437c478bd9Sstevel@tonic-gate 
4418188661Ssonam gupta - Sun Microsystems - Bangalore India void
s_alloc_files(char * m,MESG * md)4518188661Ssonam gupta - Sun Microsystems - Bangalore India s_alloc_files(char *m, MESG *md)	/* funcdef */
467c478bd9Sstevel@tonic-gate {
4718188661Ssonam gupta - Sun Microsystems - Bangalore India 	char		*file_prefix;
4818188661Ssonam gupta - Sun Microsystems - Bangalore India 	ushort_t	count;
4918188661Ssonam gupta - Sun Microsystems - Bangalore India 	mode_t		old_msk;
507c478bd9Sstevel@tonic-gate 
517c478bd9Sstevel@tonic-gate 
5218188661Ssonam gupta - Sun Microsystems - Bangalore India 	/*
5318188661Ssonam gupta - Sun Microsystems - Bangalore India 	 * Bugid 4140311
5418188661Ssonam gupta - Sun Microsystems - Bangalore India 	 * Set umask to 0 before creating files.
5518188661Ssonam gupta - Sun Microsystems - Bangalore India 	 */
5618188661Ssonam gupta - Sun Microsystems - Bangalore India 	old_msk = umask((mode_t)0);
577c478bd9Sstevel@tonic-gate 
5818188661Ssonam gupta - Sun Microsystems - Bangalore India 	getmessage(m, S_ALLOC_FILES, &count);
5918188661Ssonam gupta - Sun Microsystems - Bangalore India 	syslog(LOG_DEBUG, "s_alloc_files(%d)", count);
607c478bd9Sstevel@tonic-gate 
6118188661Ssonam gupta - Sun Microsystems - Bangalore India 	if ((file_prefix = _alloc_files(count, (char *)0, md->uid, md->gid))) {
6218188661Ssonam gupta - Sun Microsystems - Bangalore India 		mputm(md, R_ALLOC_FILES, MOK, file_prefix);
6318188661Ssonam gupta - Sun Microsystems - Bangalore India 		add_flt_act(md, FLT_FILES, file_prefix, count);
6418188661Ssonam gupta - Sun Microsystems - Bangalore India 	} else if (errno == EEXIST)
6518188661Ssonam gupta - Sun Microsystems - Bangalore India 		mputm(md, R_ALLOC_FILES, MERRDEST, "");
6618188661Ssonam gupta - Sun Microsystems - Bangalore India 	else
6718188661Ssonam gupta - Sun Microsystems - Bangalore India 		mputm(md, R_ALLOC_FILES, MNOMEM, "");
687c478bd9Sstevel@tonic-gate 
6918188661Ssonam gupta - Sun Microsystems - Bangalore India 	(void) umask(old_msk);
707c478bd9Sstevel@tonic-gate 
717c478bd9Sstevel@tonic-gate }
727c478bd9Sstevel@tonic-gate 
7318188661Ssonam gupta - Sun Microsystems - Bangalore India /*
7418188661Ssonam gupta - Sun Microsystems - Bangalore India  * s_print_request()
7518188661Ssonam gupta - Sun Microsystems - Bangalore India  */
767c478bd9Sstevel@tonic-gate 
7718188661Ssonam gupta - Sun Microsystems - Bangalore India void
s_print_request(char * m,MESG * md)7818188661Ssonam gupta - Sun Microsystems - Bangalore India s_print_request(char *m, MESG *md)
797c478bd9Sstevel@tonic-gate {
8018188661Ssonam gupta - Sun Microsystems - Bangalore India 	extern char		*Local_System;
8118188661Ssonam gupta - Sun Microsystems - Bangalore India 	char			*file;
8218188661Ssonam gupta - Sun Microsystems - Bangalore India 	char			*idno;
8318188661Ssonam gupta - Sun Microsystems - Bangalore India 	char			*path;
8418188661Ssonam gupta - Sun Microsystems - Bangalore India 	char			*req_file;
8518188661Ssonam gupta - Sun Microsystems - Bangalore India 	char			*req_id	= 0;
8618188661Ssonam gupta - Sun Microsystems - Bangalore India 	RSTATUS			*rp;
8718188661Ssonam gupta - Sun Microsystems - Bangalore India 	REQUEST			*r;
8818188661Ssonam gupta - Sun Microsystems - Bangalore India 	SECURE			*s;
8918188661Ssonam gupta - Sun Microsystems - Bangalore India 	struct passwd		*pw;
9018188661Ssonam gupta - Sun Microsystems - Bangalore India 	short			err;
9118188661Ssonam gupta - Sun Microsystems - Bangalore India 	short			status;
9218188661Ssonam gupta - Sun Microsystems - Bangalore India 	off_t			size;
9318188661Ssonam gupta - Sun Microsystems - Bangalore India 	uid_t			org_uid;
9418188661Ssonam gupta - Sun Microsystems - Bangalore India 	gid_t			org_gid;
957c478bd9Sstevel@tonic-gate #ifdef LP_USE_PAPI_ATTR
9618188661Ssonam gupta - Sun Microsystems - Bangalore India 	struct stat		tmpBuf;
9718188661Ssonam gupta - Sun Microsystems - Bangalore India 	char 			tmpName[BUFSIZ];
987c478bd9Sstevel@tonic-gate #endif
997c478bd9Sstevel@tonic-gate 
1007c478bd9Sstevel@tonic-gate 
10118188661Ssonam gupta - Sun Microsystems - Bangalore India 	(void) getmessage(m, S_PRINT_REQUEST, &file);
10218188661Ssonam gupta - Sun Microsystems - Bangalore India 	syslog(LOG_DEBUG, "s_print_request(%s)", (file ? file : "NULL"));
1037c478bd9Sstevel@tonic-gate 
10418188661Ssonam gupta - Sun Microsystems - Bangalore India 	/*
10518188661Ssonam gupta - Sun Microsystems - Bangalore India 	 * "NewRequest" points to a request that's not yet in the
10618188661Ssonam gupta - Sun Microsystems - Bangalore India 	 * request list but is to be considered with the rest of the
10718188661Ssonam gupta - Sun Microsystems - Bangalore India 	 * requests (e.g. calculating # of requests awaiting a form).
10818188661Ssonam gupta - Sun Microsystems - Bangalore India 	 */
10918188661Ssonam gupta - Sun Microsystems - Bangalore India 	if ((rp = NewRequest = new_rstatus(NULL, NULL)) == NULL)
11018188661Ssonam gupta - Sun Microsystems - Bangalore India 		status = MNOMEM;
1117c478bd9Sstevel@tonic-gate 
1127c478bd9Sstevel@tonic-gate 	else
1137c478bd9Sstevel@tonic-gate 	{
11418188661Ssonam gupta - Sun Microsystems - Bangalore India 		req_file = reqpath(file, &idno);
11518188661Ssonam gupta - Sun Microsystems - Bangalore India 		path = makepath(Lp_Tmp, req_file, (char *)0);
11618188661Ssonam gupta - Sun Microsystems - Bangalore India 		(void) chownmod(path, Lp_Uid, Lp_Gid, 0644);
11718188661Ssonam gupta - Sun Microsystems - Bangalore India 		Free(path);
11818188661Ssonam gupta - Sun Microsystems - Bangalore India 
11918188661Ssonam gupta - Sun Microsystems - Bangalore India 		if (!(r = Getrequest(req_file)))
12018188661Ssonam gupta - Sun Microsystems - Bangalore India 			status = MNOOPEN;
12118188661Ssonam gupta - Sun Microsystems - Bangalore India 
12218188661Ssonam gupta - Sun Microsystems - Bangalore India 		else
12318188661Ssonam gupta - Sun Microsystems - Bangalore India 		{
12418188661Ssonam gupta - Sun Microsystems - Bangalore India 			rp->req_file = Strdup(req_file);
12518188661Ssonam gupta - Sun Microsystems - Bangalore India 
12618188661Ssonam gupta - Sun Microsystems - Bangalore India 			freerequest(rp->request);
12718188661Ssonam gupta - Sun Microsystems - Bangalore India 			rp->request = r;
12818188661Ssonam gupta - Sun Microsystems - Bangalore India 
12918188661Ssonam gupta - Sun Microsystems - Bangalore India 			rp->request->outcome = 0;
13018188661Ssonam gupta - Sun Microsystems - Bangalore India 			rp->secure->uid = md->uid;
13118188661Ssonam gupta - Sun Microsystems - Bangalore India 			rp->secure->gid = md->gid;
13218188661Ssonam gupta - Sun Microsystems - Bangalore India 			if (md->slabel != NULL)
13318188661Ssonam gupta - Sun Microsystems - Bangalore India 				rp->secure->slabel = Strdup(md->slabel);
13418188661Ssonam gupta - Sun Microsystems - Bangalore India 
13518188661Ssonam gupta - Sun Microsystems - Bangalore India 			pw = getpwuid(md->uid);
13618188661Ssonam gupta - Sun Microsystems - Bangalore India 			endpwent();
13718188661Ssonam gupta - Sun Microsystems - Bangalore India 			if (pw && pw->pw_name && *pw->pw_name)
13818188661Ssonam gupta - Sun Microsystems - Bangalore India 				rp->secure->user = Strdup(pw->pw_name);
13918188661Ssonam gupta - Sun Microsystems - Bangalore India 			else {
14018188661Ssonam gupta - Sun Microsystems - Bangalore India 				rp->secure->user = Strdup(BIGGEST_NUMBER_S);
14118188661Ssonam gupta - Sun Microsystems - Bangalore India 				(void) sprintf(rp->secure->user, "%u",
14218188661Ssonam gupta - Sun Microsystems - Bangalore India 				    md->uid);
14318188661Ssonam gupta - Sun Microsystems - Bangalore India 			}
14418188661Ssonam gupta - Sun Microsystems - Bangalore India 
14518188661Ssonam gupta - Sun Microsystems - Bangalore India 			if ((rp->request->actions & ACT_SPECIAL) == ACT_HOLD)
14618188661Ssonam gupta - Sun Microsystems - Bangalore India 				rp->request->outcome |= RS_HELD;
14718188661Ssonam gupta - Sun Microsystems - Bangalore India 			if ((rp->request->actions & ACT_SPECIAL) == ACT_RESUME)
14818188661Ssonam gupta - Sun Microsystems - Bangalore India 				rp->request->outcome &= ~RS_HELD;
14918188661Ssonam gupta - Sun Microsystems - Bangalore India 			if ((rp->request->actions & ACT_SPECIAL) ==
15018188661Ssonam gupta - Sun Microsystems - Bangalore India 			    ACT_IMMEDIATE) {
15118188661Ssonam gupta - Sun Microsystems - Bangalore India 				if (!md->admin) {
15218188661Ssonam gupta - Sun Microsystems - Bangalore India 					status = MNOPERM;
15318188661Ssonam gupta - Sun Microsystems - Bangalore India 					goto Return;
15418188661Ssonam gupta - Sun Microsystems - Bangalore India 				}
15518188661Ssonam gupta - Sun Microsystems - Bangalore India 				rp->request->outcome |= RS_IMMEDIATE;
15618188661Ssonam gupta - Sun Microsystems - Bangalore India 			}
15718188661Ssonam gupta - Sun Microsystems - Bangalore India 
15818188661Ssonam gupta - Sun Microsystems - Bangalore India 			size = chfiles(rp->request->file_list, Lp_Uid, Lp_Gid);
15918188661Ssonam gupta - Sun Microsystems - Bangalore India 
16018188661Ssonam gupta - Sun Microsystems - Bangalore India 			if (size < 0) {
16118188661Ssonam gupta - Sun Microsystems - Bangalore India 				/*
16218188661Ssonam gupta - Sun Microsystems - Bangalore India 				 * at this point, chfiles() may have
16318188661Ssonam gupta - Sun Microsystems - Bangalore India 				 * failed because the file may live on
16418188661Ssonam gupta - Sun Microsystems - Bangalore India 				 * an NFS mounted filesystem, under
16518188661Ssonam gupta - Sun Microsystems - Bangalore India 				 * a directory of mode 700. such a
16618188661Ssonam gupta - Sun Microsystems - Bangalore India 				 * directory isn't accessible even by
16718188661Ssonam gupta - Sun Microsystems - Bangalore India 				 * root, according to the NFS protocol
16818188661Ssonam gupta - Sun Microsystems - Bangalore India 				 * (i.e. the Stat() in chfiles() failed).
16918188661Ssonam gupta - Sun Microsystems - Bangalore India 				 * this most commonly happens via the
17018188661Ssonam gupta - Sun Microsystems - Bangalore India 				 * automounter, and rlogin. thus we
17118188661Ssonam gupta - Sun Microsystems - Bangalore India 				 * change our euid/egid to that of the
17218188661Ssonam gupta - Sun Microsystems - Bangalore India 				 * user, and try again. if *this* fails,
17318188661Ssonam gupta - Sun Microsystems - Bangalore India 				 * then the file must really be
17418188661Ssonam gupta - Sun Microsystems - Bangalore India 				 * inaccessible.
17518188661Ssonam gupta - Sun Microsystems - Bangalore India 				 */
17618188661Ssonam gupta - Sun Microsystems - Bangalore India 				org_uid = geteuid();
17718188661Ssonam gupta - Sun Microsystems - Bangalore India 				org_gid = getegid();
17818188661Ssonam gupta - Sun Microsystems - Bangalore India 
17918188661Ssonam gupta - Sun Microsystems - Bangalore India 				if (setegid(md->gid) != 0) {
18018188661Ssonam gupta - Sun Microsystems - Bangalore India 					status = MUNKNOWN;
18118188661Ssonam gupta - Sun Microsystems - Bangalore India 					goto Return;
18218188661Ssonam gupta - Sun Microsystems - Bangalore India 				}
18318188661Ssonam gupta - Sun Microsystems - Bangalore India 
18418188661Ssonam gupta - Sun Microsystems - Bangalore India 				if (seteuid(md->uid) != 0) {
18518188661Ssonam gupta - Sun Microsystems - Bangalore India 					setgid(org_gid);
18618188661Ssonam gupta - Sun Microsystems - Bangalore India 					status = MUNKNOWN;
18718188661Ssonam gupta - Sun Microsystems - Bangalore India 					goto Return;
18818188661Ssonam gupta - Sun Microsystems - Bangalore India 				}
18918188661Ssonam gupta - Sun Microsystems - Bangalore India 
19018188661Ssonam gupta - Sun Microsystems - Bangalore India 				size = chfiles(rp->request->file_list,
19118188661Ssonam gupta - Sun Microsystems - Bangalore India 				    Lp_Uid, Lp_Gid);
19218188661Ssonam gupta - Sun Microsystems - Bangalore India 
19318188661Ssonam gupta - Sun Microsystems - Bangalore India 				if (seteuid(org_uid) != 0) {
19418188661Ssonam gupta - Sun Microsystems - Bangalore India 					/* should never happen */
19518188661Ssonam gupta - Sun Microsystems - Bangalore India 					note("s_print_request(): ");
19618188661Ssonam gupta - Sun Microsystems - Bangalore India 					note("seteuid back to uid=%d "
19718188661Ssonam gupta - Sun Microsystems - Bangalore India 					    "failed!!\n", org_uid);
19818188661Ssonam gupta - Sun Microsystems - Bangalore India 					size = -1;
19918188661Ssonam gupta - Sun Microsystems - Bangalore India 				}
20018188661Ssonam gupta - Sun Microsystems - Bangalore India 
20118188661Ssonam gupta - Sun Microsystems - Bangalore India 				if (setegid(org_gid) != 0) {
20218188661Ssonam gupta - Sun Microsystems - Bangalore India 					/* should never happen */
20318188661Ssonam gupta - Sun Microsystems - Bangalore India 					note("s_print_request(): ");
20418188661Ssonam gupta - Sun Microsystems - Bangalore India 					note("setegid back to uid=%d "
20518188661Ssonam gupta - Sun Microsystems - Bangalore India 					    "failed!!\n", org_uid);
20618188661Ssonam gupta - Sun Microsystems - Bangalore India 					size = -1;
20718188661Ssonam gupta - Sun Microsystems - Bangalore India 				}
20818188661Ssonam gupta - Sun Microsystems - Bangalore India 
20918188661Ssonam gupta - Sun Microsystems - Bangalore India 				if (size < 0) {
21018188661Ssonam gupta - Sun Microsystems - Bangalore India 					status = MUNKNOWN;
21118188661Ssonam gupta - Sun Microsystems - Bangalore India 					goto Return;
21218188661Ssonam gupta - Sun Microsystems - Bangalore India 				}
21318188661Ssonam gupta - Sun Microsystems - Bangalore India 			}
21418188661Ssonam gupta - Sun Microsystems - Bangalore India 			if (!(rp->request->outcome & RS_HELD) && size == 0) {
21518188661Ssonam gupta - Sun Microsystems - Bangalore India 				status = MNOPERM;
21618188661Ssonam gupta - Sun Microsystems - Bangalore India 				goto Return;
21718188661Ssonam gupta - Sun Microsystems - Bangalore India 			}
21818188661Ssonam gupta - Sun Microsystems - Bangalore India 			rp->secure->size = size;
21918188661Ssonam gupta - Sun Microsystems - Bangalore India 
22018188661Ssonam gupta - Sun Microsystems - Bangalore India 			(void) time(&rp->secure->date);
22118188661Ssonam gupta - Sun Microsystems - Bangalore India 			rp->secure->req_id = NULL;
22218188661Ssonam gupta - Sun Microsystems - Bangalore India 
22318188661Ssonam gupta - Sun Microsystems - Bangalore India 			if (!rp->request->title) {
22418188661Ssonam gupta - Sun Microsystems - Bangalore India 				if (strlen(*rp->request->file_list) <
22518188661Ssonam gupta - Sun Microsystems - Bangalore India 				    (size_t)24)
22618188661Ssonam gupta - Sun Microsystems - Bangalore India 					rp->request->title =
22718188661Ssonam gupta - Sun Microsystems - Bangalore India 					    Strdup(*rp->request->file_list);
22818188661Ssonam gupta - Sun Microsystems - Bangalore India 				else {
229bb698c4dSsonam gupta - Sun Microsystems - Bangalore India 					char *r;
230bb698c4dSsonam gupta - Sun Microsystems - Bangalore India 					if (r = strrchr(
231bb698c4dSsonam gupta - Sun Microsystems - Bangalore India 					    *rp->request->file_list, '/'))
232bb698c4dSsonam gupta - Sun Microsystems - Bangalore India 						r++;
233bb698c4dSsonam gupta - Sun Microsystems - Bangalore India 					else
234bb698c4dSsonam gupta - Sun Microsystems - Bangalore India 						r = *rp->request->file_list;
235bb698c4dSsonam gupta - Sun Microsystems - Bangalore India 
23618188661Ssonam gupta - Sun Microsystems - Bangalore India 					rp->request->title = malloc(25);
23718188661Ssonam gupta - Sun Microsystems - Bangalore India 					sprintf(rp->request->title,
238bb698c4dSsonam gupta - Sun Microsystems - Bangalore India 					    "%-.24s", r);
23918188661Ssonam gupta - Sun Microsystems - Bangalore India 				}
24018188661Ssonam gupta - Sun Microsystems - Bangalore India 			}
24118188661Ssonam gupta - Sun Microsystems - Bangalore India 
24218188661Ssonam gupta - Sun Microsystems - Bangalore India 			if ((err = validate_request(rp, &req_id, 0)) != MOK)
24318188661Ssonam gupta - Sun Microsystems - Bangalore India 				status = err;
24418188661Ssonam gupta - Sun Microsystems - Bangalore India 			else {
24518188661Ssonam gupta - Sun Microsystems - Bangalore India 				/*
24618188661Ssonam gupta - Sun Microsystems - Bangalore India 				 * "req_id" will be supplied if this is from a
24718188661Ssonam gupta - Sun Microsystems - Bangalore India 				 * remote system.
24818188661Ssonam gupta - Sun Microsystems - Bangalore India 				 */
24918188661Ssonam gupta - Sun Microsystems - Bangalore India 				if (rp->secure->req_id == NULL) {
25018188661Ssonam gupta - Sun Microsystems - Bangalore India 					req_id = makestr(req_id, "-",
25118188661Ssonam gupta - Sun Microsystems - Bangalore India 					    idno, (char *)0);
25218188661Ssonam gupta - Sun Microsystems - Bangalore India 					rp->secure->req_id = req_id;
25318188661Ssonam gupta - Sun Microsystems - Bangalore India 				} else
25418188661Ssonam gupta - Sun Microsystems - Bangalore India 					req_id = rp->secure->req_id;
25518188661Ssonam gupta - Sun Microsystems - Bangalore India 
25618188661Ssonam gupta - Sun Microsystems - Bangalore India #ifdef LP_USE_PAPI_ATTR
25718188661Ssonam gupta - Sun Microsystems - Bangalore India 				/*
25818188661Ssonam gupta - Sun Microsystems - Bangalore India 				 * Check if the PAPI job attribute file
25918188661Ssonam gupta - Sun Microsystems - Bangalore India 				 * exists, if it does change the
26018188661Ssonam gupta - Sun Microsystems - Bangalore India 				 * permissions and ownership of the file.
26118188661Ssonam gupta - Sun Microsystems - Bangalore India 				 * This file is created when print jobs
26218188661Ssonam gupta - Sun Microsystems - Bangalore India 				 * are submitted via the PAPI interface,
26318188661Ssonam gupta - Sun Microsystems - Bangalore India 				 * the file pathname of this file is
26418188661Ssonam gupta - Sun Microsystems - Bangalore India 				 * passed to the slow-filters and printer
26518188661Ssonam gupta - Sun Microsystems - Bangalore India 				 * interface script as an environment
26618188661Ssonam gupta - Sun Microsystems - Bangalore India 				 * variable when they are executed
26718188661Ssonam gupta - Sun Microsystems - Bangalore India 				 */
26818188661Ssonam gupta - Sun Microsystems - Bangalore India 				snprintf(tmpName, sizeof (tmpName),
26918188661Ssonam gupta - Sun Microsystems - Bangalore India 				    "%s-%s", idno, LP_PAPIATTRNAME);
27018188661Ssonam gupta - Sun Microsystems - Bangalore India 				path = makepath(Lp_Temp, tmpName, (char *)0);
27118188661Ssonam gupta - Sun Microsystems - Bangalore India 
27218188661Ssonam gupta - Sun Microsystems - Bangalore India 				if (stat(path, &tmpBuf) == 0) {
27318188661Ssonam gupta - Sun Microsystems - Bangalore India 					syslog(LOG_DEBUG,
27418188661Ssonam gupta - Sun Microsystems - Bangalore India 					    "s_print_request: "\
27518188661Ssonam gupta - Sun Microsystems - Bangalore India 					    "attribute file ='%s'", path);
27618188661Ssonam gupta - Sun Microsystems - Bangalore India 
27718188661Ssonam gupta - Sun Microsystems - Bangalore India 					/*
27818188661Ssonam gupta - Sun Microsystems - Bangalore India 					 * IPP job attribute file exists
27918188661Ssonam gupta - Sun Microsystems - Bangalore India 					 * for this job so change
28018188661Ssonam gupta - Sun Microsystems - Bangalore India 					 * permissions and ownership of
28118188661Ssonam gupta - Sun Microsystems - Bangalore India 					 * the file
28218188661Ssonam gupta - Sun Microsystems - Bangalore India 					 */
28318188661Ssonam gupta - Sun Microsystems - Bangalore India 					(void) chownmod(path, Lp_Uid,
28418188661Ssonam gupta - Sun Microsystems - Bangalore India 					    Lp_Gid, 0644);
28518188661Ssonam gupta - Sun Microsystems - Bangalore India 					Free(path);
28618188661Ssonam gupta - Sun Microsystems - Bangalore India 				}
28718188661Ssonam gupta - Sun Microsystems - Bangalore India 				else
28818188661Ssonam gupta - Sun Microsystems - Bangalore India 				{
28918188661Ssonam gupta - Sun Microsystems - Bangalore India 					syslog(LOG_DEBUG,
29018188661Ssonam gupta - Sun Microsystems - Bangalore India 					    "s_print_request: "\
29118188661Ssonam gupta - Sun Microsystems - Bangalore India 					    "no attribute file");
29218188661Ssonam gupta - Sun Microsystems - Bangalore India 				}
29318188661Ssonam gupta - Sun Microsystems - Bangalore India #endif
29418188661Ssonam gupta - Sun Microsystems - Bangalore India 
29518188661Ssonam gupta - Sun Microsystems - Bangalore India 				/*
29618188661Ssonam gupta - Sun Microsystems - Bangalore India 				 * fix for bugid 1103890.
29718188661Ssonam gupta - Sun Microsystems - Bangalore India 				 * use Putsecure instead.
29818188661Ssonam gupta - Sun Microsystems - Bangalore India 				 */
29918188661Ssonam gupta - Sun Microsystems - Bangalore India 				if ((Putsecure(req_file, rp->secure) == -1) ||
30018188661Ssonam gupta - Sun Microsystems - Bangalore India 				    (putrequest(req_file, rp->request) == -1))
30118188661Ssonam gupta - Sun Microsystems - Bangalore India 					status = MNOMEM;
30218188661Ssonam gupta - Sun Microsystems - Bangalore India 				else
30318188661Ssonam gupta - Sun Microsystems - Bangalore India 				{
30418188661Ssonam gupta - Sun Microsystems - Bangalore India 					status = MOK;
30518188661Ssonam gupta - Sun Microsystems - Bangalore India 
30618188661Ssonam gupta - Sun Microsystems - Bangalore India 					insertr(rp);
30718188661Ssonam gupta - Sun Microsystems - Bangalore India 					NewRequest = 0;
30818188661Ssonam gupta - Sun Microsystems - Bangalore India 
30918188661Ssonam gupta - Sun Microsystems - Bangalore India 					if (rp->slow)
31018188661Ssonam gupta - Sun Microsystems - Bangalore India 						schedule(EV_SLOWF, rp);
31118188661Ssonam gupta - Sun Microsystems - Bangalore India 					else
31218188661Ssonam gupta - Sun Microsystems - Bangalore India 						schedule(EV_INTERF,
31318188661Ssonam gupta - Sun Microsystems - Bangalore India 						    rp->printer);
31418188661Ssonam gupta - Sun Microsystems - Bangalore India 
31518188661Ssonam gupta - Sun Microsystems - Bangalore India 					del_flt_act(md, FLT_FILES);
31618188661Ssonam gupta - Sun Microsystems - Bangalore India 				}
31718188661Ssonam gupta - Sun Microsystems - Bangalore India 			}
31818188661Ssonam gupta - Sun Microsystems - Bangalore India 		}
31918188661Ssonam gupta - Sun Microsystems - Bangalore India 	}
32018188661Ssonam gupta - Sun Microsystems - Bangalore India 
32118188661Ssonam gupta - Sun Microsystems - Bangalore India Return:
32218188661Ssonam gupta - Sun Microsystems - Bangalore India 	NewRequest = 0;
32318188661Ssonam gupta - Sun Microsystems - Bangalore India 	Free(req_file);
32418188661Ssonam gupta - Sun Microsystems - Bangalore India 	Free(idno);
32518188661Ssonam gupta - Sun Microsystems - Bangalore India 	if (status != MOK && rp) {
32618188661Ssonam gupta - Sun Microsystems - Bangalore India 		rmfiles(rp, 0);
32718188661Ssonam gupta - Sun Microsystems - Bangalore India 		free_rstatus(rp);
32818188661Ssonam gupta - Sun Microsystems - Bangalore India 	}
32918188661Ssonam gupta - Sun Microsystems - Bangalore India 	mputm(md, R_PRINT_REQUEST, status, NB(req_id), chkprinter_result);
33018188661Ssonam gupta - Sun Microsystems - Bangalore India }
33118188661Ssonam gupta - Sun Microsystems - Bangalore India 
33218188661Ssonam gupta - Sun Microsystems - Bangalore India /*
33318188661Ssonam gupta - Sun Microsystems - Bangalore India  * s_start_change_request()
33418188661Ssonam gupta - Sun Microsystems - Bangalore India  */
33518188661Ssonam gupta - Sun Microsystems - Bangalore India 
33618188661Ssonam gupta - Sun Microsystems - Bangalore India void
s_start_change_request(char * m,MESG * md)33718188661Ssonam gupta - Sun Microsystems - Bangalore India s_start_change_request(char *m, MESG *md)
33818188661Ssonam gupta - Sun Microsystems - Bangalore India {
33918188661Ssonam gupta - Sun Microsystems - Bangalore India 	char		*req_id;
34018188661Ssonam gupta - Sun Microsystems - Bangalore India 	char		*req_file	= "";
34118188661Ssonam gupta - Sun Microsystems - Bangalore India 	short		status;
34218188661Ssonam gupta - Sun Microsystems - Bangalore India 	RSTATUS		*rp;
34318188661Ssonam gupta - Sun Microsystems - Bangalore India 	char		*path;
34418188661Ssonam gupta - Sun Microsystems - Bangalore India 	char		tmpName[BUFSIZ];
34518188661Ssonam gupta - Sun Microsystems - Bangalore India 	struct stat	tmpBuf;
34618188661Ssonam gupta - Sun Microsystems - Bangalore India 
34718188661Ssonam gupta - Sun Microsystems - Bangalore India 	(void) getmessage(m, S_START_CHANGE_REQUEST, &req_id);
34818188661Ssonam gupta - Sun Microsystems - Bangalore India 	syslog(LOG_DEBUG, "s_start_change_request(%s)",
34918188661Ssonam gupta - Sun Microsystems - Bangalore India 	    (req_id ? req_id : "NULL"));
35018188661Ssonam gupta - Sun Microsystems - Bangalore India 
35118188661Ssonam gupta - Sun Microsystems - Bangalore India 	if (!(rp = request_by_id(req_id)))
35218188661Ssonam gupta - Sun Microsystems - Bangalore India 		status = MUNKNOWN;
35318188661Ssonam gupta - Sun Microsystems - Bangalore India 	else if ((md->admin == 0) && (is_system_labeled()) &&
35418188661Ssonam gupta - Sun Microsystems - Bangalore India 	    (md->slabel != NULL) && (rp->secure->slabel != NULL) &&
35518188661Ssonam gupta - Sun Microsystems - Bangalore India 	    (!STREQU(md->slabel, rp->secure->slabel)))
35618188661Ssonam gupta - Sun Microsystems - Bangalore India 		status = MUNKNOWN;
35718188661Ssonam gupta - Sun Microsystems - Bangalore India 	else if (rp->request->outcome & RS_DONE)
35818188661Ssonam gupta - Sun Microsystems - Bangalore India 		status = M2LATE;
35918188661Ssonam gupta - Sun Microsystems - Bangalore India 	else if (!md->admin && md->uid != rp->secure->uid)
36018188661Ssonam gupta - Sun Microsystems - Bangalore India 		status = MNOPERM;
36118188661Ssonam gupta - Sun Microsystems - Bangalore India 	else if (rp->request->outcome & RS_CHANGING)
36218188661Ssonam gupta - Sun Microsystems - Bangalore India 		status = MNOOPEN;
36318188661Ssonam gupta - Sun Microsystems - Bangalore India 	else if (rp->request->outcome & RS_NOTIFYING)
36418188661Ssonam gupta - Sun Microsystems - Bangalore India 		status = MBUSY;
36518188661Ssonam gupta - Sun Microsystems - Bangalore India 	else {
36618188661Ssonam gupta - Sun Microsystems - Bangalore India 		status = MOK;
36718188661Ssonam gupta - Sun Microsystems - Bangalore India 
36818188661Ssonam gupta - Sun Microsystems - Bangalore India 		if (rp->request->outcome & RS_FILTERING &&
36918188661Ssonam gupta - Sun Microsystems - Bangalore India 		    !(rp->request->outcome & RS_STOPPED)) {
37018188661Ssonam gupta - Sun Microsystems - Bangalore India 			rp->request->outcome |= (RS_REFILTER|RS_STOPPED);
37118188661Ssonam gupta - Sun Microsystems - Bangalore India 			terminate(rp->exec);
37218188661Ssonam gupta - Sun Microsystems - Bangalore India 		}
37318188661Ssonam gupta - Sun Microsystems - Bangalore India 
37418188661Ssonam gupta - Sun Microsystems - Bangalore India 		if (rp->request->outcome & RS_PRINTING &&
37518188661Ssonam gupta - Sun Microsystems - Bangalore India 		    !(rp->request->outcome & RS_STOPPED)) {
37618188661Ssonam gupta - Sun Microsystems - Bangalore India 			rp->request->outcome |= RS_STOPPED;
37718188661Ssonam gupta - Sun Microsystems - Bangalore India 			terminate(rp->printer->exec);
3787c478bd9Sstevel@tonic-gate 		}
3797c478bd9Sstevel@tonic-gate 
38018188661Ssonam gupta - Sun Microsystems - Bangalore India 		rp->request->outcome |= RS_CHANGING;
38118188661Ssonam gupta - Sun Microsystems - Bangalore India 
3827c478bd9Sstevel@tonic-gate 		/*
38318188661Ssonam gupta - Sun Microsystems - Bangalore India 		 * Change the ownership of the request file to be "md->uid".
38418188661Ssonam gupta - Sun Microsystems - Bangalore India 		 * Either this is identical to "rp->secure->uid", or it is
38518188661Ssonam gupta - Sun Microsystems - Bangalore India 		 * "Lp_Uid" or it is root. The idea is that the
38618188661Ssonam gupta - Sun Microsystems - Bangalore India 		 * person at the other end needs access, and that may not
38718188661Ssonam gupta - Sun Microsystems - Bangalore India 		 * be who queued the request.
3887c478bd9Sstevel@tonic-gate 		 */
38918188661Ssonam gupta - Sun Microsystems - Bangalore India 
39018188661Ssonam gupta - Sun Microsystems - Bangalore India 		path = makepath(Lp_Tmp, rp->req_file, (char *)0);
39118188661Ssonam gupta - Sun Microsystems - Bangalore India 		(void) Chown(path, md->uid, rp->secure->gid);
39218188661Ssonam gupta - Sun Microsystems - Bangalore India 		Free(path);
3937c478bd9Sstevel@tonic-gate 
3947c478bd9Sstevel@tonic-gate #ifdef LP_USE_PAPI_ATTR
39518188661Ssonam gupta - Sun Microsystems - Bangalore India 
3967c478bd9Sstevel@tonic-gate 		/*
3977c478bd9Sstevel@tonic-gate 		 * Check if the PAPI job attribute file exists, if it does
39818188661Ssonam gupta - Sun Microsystems - Bangalore India 		 * change the ownership of the file to be "md->uid".
39918188661Ssonam gupta - Sun Microsystems - Bangalore India 		 * Either this is identical to "rp->secure->uid", or it is
40018188661Ssonam gupta - Sun Microsystems - Bangalore India 		 * "Lp_Uid" or it is root. The idea is that the
40118188661Ssonam gupta - Sun Microsystems - Bangalore India 		 * person at the other end needs access, and that may not
40218188661Ssonam gupta - Sun Microsystems - Bangalore India 		 * be who queued the request.
4037c478bd9Sstevel@tonic-gate 		 */
40418188661Ssonam gupta - Sun Microsystems - Bangalore India 
4057c478bd9Sstevel@tonic-gate 		snprintf(tmpName, sizeof (tmpName),
40618188661Ssonam gupta - Sun Microsystems - Bangalore India 		    "%s-%s", strtok(strdup(rp->req_file), "-"),
40718188661Ssonam gupta - Sun Microsystems - Bangalore India 		    LP_PAPIATTRNAME);
4087c478bd9Sstevel@tonic-gate 
40918188661Ssonam gupta - Sun Microsystems - Bangalore India 		path = makepath(Lp_Tmp, tmpName, (char *)0);
41018188661Ssonam gupta - Sun Microsystems - Bangalore India 
41118188661Ssonam gupta - Sun Microsystems - Bangalore India 		if (stat(path, &tmpBuf) == 0) {
4127c478bd9Sstevel@tonic-gate 			syslog(LOG_DEBUG,
41318188661Ssonam gupta - Sun Microsystems - Bangalore India 			    "s_start_change_request: attribute file ='%s'",
41418188661Ssonam gupta - Sun Microsystems - Bangalore India 			    path);
4157c478bd9Sstevel@tonic-gate 
4167c478bd9Sstevel@tonic-gate 			/*
4177c478bd9Sstevel@tonic-gate 			 * IPP job attribute file exists for this job so
4187c478bd9Sstevel@tonic-gate 			 * change permissions and ownership of the file
4197c478bd9Sstevel@tonic-gate 			 */
42018188661Ssonam gupta - Sun Microsystems - Bangalore India 			(void) Chown(path, md->uid, rp->secure->gid);
4217c478bd9Sstevel@tonic-gate 			Free(path);
4227c478bd9Sstevel@tonic-gate 		}
4237c478bd9Sstevel@tonic-gate 		else
4247c478bd9Sstevel@tonic-gate 		{
42518188661Ssonam gupta - Sun Microsystems - Bangalore India 			syslog(LOG_DEBUG,
42618188661Ssonam gupta - Sun Microsystems - Bangalore India 			    "s_start_change_request: no attribute file");
4277c478bd9Sstevel@tonic-gate 		}
4287c478bd9Sstevel@tonic-gate #endif
4297c478bd9Sstevel@tonic-gate 
43018188661Ssonam gupta - Sun Microsystems - Bangalore India 		add_flt_act(md, FLT_CHANGE, rp);
43118188661Ssonam gupta - Sun Microsystems - Bangalore India 		req_file = rp->req_file;
4327c478bd9Sstevel@tonic-gate 
4337c478bd9Sstevel@tonic-gate 	}
4347c478bd9Sstevel@tonic-gate 
43518188661Ssonam gupta - Sun Microsystems - Bangalore India 	mputm(md, R_START_CHANGE_REQUEST, status, req_file);
4367c478bd9Sstevel@tonic-gate }
4377c478bd9Sstevel@tonic-gate 
43818188661Ssonam gupta - Sun Microsystems - Bangalore India /*
43918188661Ssonam gupta - Sun Microsystems - Bangalore India  * s_end_change_request()
44018188661Ssonam gupta - Sun Microsystems - Bangalore India  */
4417c478bd9Sstevel@tonic-gate 
44218188661Ssonam gupta - Sun Microsystems - Bangalore India void
s_end_change_request(char * m,MESG * md)44318188661Ssonam gupta - Sun Microsystems - Bangalore India s_end_change_request(char *m, MESG *md)
4447c478bd9Sstevel@tonic-gate {
44518188661Ssonam gupta - Sun Microsystems - Bangalore India 	char		*req_id;
44618188661Ssonam gupta - Sun Microsystems - Bangalore India 	RSTATUS		*rp;
44718188661Ssonam gupta - Sun Microsystems - Bangalore India 	off_t		size;
44818188661Ssonam gupta - Sun Microsystems - Bangalore India 	off_t		osize;
44918188661Ssonam gupta - Sun Microsystems - Bangalore India 	short		err;
45018188661Ssonam gupta - Sun Microsystems - Bangalore India 	short		status;
45118188661Ssonam gupta - Sun Microsystems - Bangalore India 	REQUEST		*r = 0;
45218188661Ssonam gupta - Sun Microsystems - Bangalore India 	REQUEST		oldr;
45318188661Ssonam gupta - Sun Microsystems - Bangalore India 	int		call_schedule = 0;
45418188661Ssonam gupta - Sun Microsystems - Bangalore India 	int		move_ok	= 0;
45518188661Ssonam gupta - Sun Microsystems - Bangalore India 	char		*path;
45618188661Ssonam gupta - Sun Microsystems - Bangalore India 	char		tmpName[BUFSIZ];
45718188661Ssonam gupta - Sun Microsystems - Bangalore India 	struct stat	tmpBuf;
45818188661Ssonam gupta - Sun Microsystems - Bangalore India 
45918188661Ssonam gupta - Sun Microsystems - Bangalore India 	(void) getmessage(m, S_END_CHANGE_REQUEST, &req_id);
46018188661Ssonam gupta - Sun Microsystems - Bangalore India 	syslog(LOG_DEBUG, "s_end_change_request(%s)",
46118188661Ssonam gupta - Sun Microsystems - Bangalore India 	    (req_id ? req_id : "NULL"));
46218188661Ssonam gupta - Sun Microsystems - Bangalore India 
46318188661Ssonam gupta - Sun Microsystems - Bangalore India 	if (!(rp = request_by_id(req_id)))
46418188661Ssonam gupta - Sun Microsystems - Bangalore India 		status = MUNKNOWN;
46518188661Ssonam gupta - Sun Microsystems - Bangalore India 	else if ((md->admin == 0) && (is_system_labeled()) &&
46645916cd2Sjpk 	    (md->slabel != NULL) && (rp->secure->slabel != NULL) &&
46745916cd2Sjpk 	    (!STREQU(md->slabel, rp->secure->slabel)))
46818188661Ssonam gupta - Sun Microsystems - Bangalore India 		status = MUNKNOWN;
46918188661Ssonam gupta - Sun Microsystems - Bangalore India 	else if (!(rp->request->outcome & RS_CHANGING))
47018188661Ssonam gupta - Sun Microsystems - Bangalore India 		status = MNOSTART;
47118188661Ssonam gupta - Sun Microsystems - Bangalore India 	else {
47218188661Ssonam gupta - Sun Microsystems - Bangalore India 		path = makepath(Lp_Tmp, rp->req_file, (char *)0);
47318188661Ssonam gupta - Sun Microsystems - Bangalore India 		(void) chownmod(path, Lp_Uid, Lp_Gid, 0644);
47418188661Ssonam gupta - Sun Microsystems - Bangalore India 		Free(path);
4755a00db9dSsonam gupta - Sun Microsystems - Bangalore India 
4765a00db9dSsonam gupta - Sun Microsystems - Bangalore India #ifdef LP_USE_PAPI_ATTR
4775a00db9dSsonam gupta - Sun Microsystems - Bangalore India 
4785a00db9dSsonam gupta - Sun Microsystems - Bangalore India 		/*
47918188661Ssonam gupta - Sun Microsystems - Bangalore India 		 * Check if the PAPI job attribute file exists,
48018188661Ssonam gupta - Sun Microsystems - Bangalore India 		 * if it does change the permission and the ownership
48118188661Ssonam gupta - Sun Microsystems - Bangalore India 		 * of the file to be "Lp_Uid".
4825a00db9dSsonam gupta - Sun Microsystems - Bangalore India 		 */
4837c478bd9Sstevel@tonic-gate 
48418188661Ssonam gupta - Sun Microsystems - Bangalore India 		snprintf(tmpName, sizeof (tmpName),
48518188661Ssonam gupta - Sun Microsystems - Bangalore India 		    "%s-%s", strtok(strdup(rp->req_file), "-"),
48618188661Ssonam gupta - Sun Microsystems - Bangalore India 		    LP_PAPIATTRNAME);
4877c478bd9Sstevel@tonic-gate 
48818188661Ssonam gupta - Sun Microsystems - Bangalore India 		path = makepath(Lp_Tmp, tmpName, (char *)0);
4897c478bd9Sstevel@tonic-gate 
49018188661Ssonam gupta - Sun Microsystems - Bangalore India 		if (stat(path, &tmpBuf) == 0) {
49118188661Ssonam gupta - Sun Microsystems - Bangalore India 			syslog(LOG_DEBUG,
49218188661Ssonam gupta - Sun Microsystems - Bangalore India 			    "s_end_change_request: attribute file ='%s'",
49318188661Ssonam gupta - Sun Microsystems - Bangalore India 			    path);
4945a00db9dSsonam gupta - Sun Microsystems - Bangalore India 
49518188661Ssonam gupta - Sun Microsystems - Bangalore India 			/*
49618188661Ssonam gupta - Sun Microsystems - Bangalore India 			 * IPP job attribute file exists for this job so
49718188661Ssonam gupta - Sun Microsystems - Bangalore India 			 * change permissions and ownership of the file
49818188661Ssonam gupta - Sun Microsystems - Bangalore India 			 */
49918188661Ssonam gupta - Sun Microsystems - Bangalore India 			(void) chownmod(path, Lp_Uid, Lp_Gid, 0644);
50018188661Ssonam gupta - Sun Microsystems - Bangalore India 			Free(path);
50118188661Ssonam gupta - Sun Microsystems - Bangalore India 		}
50218188661Ssonam gupta - Sun Microsystems - Bangalore India 		else
50318188661Ssonam gupta - Sun Microsystems - Bangalore India 		{
50418188661Ssonam gupta - Sun Microsystems - Bangalore India 			syslog(LOG_DEBUG,
50518188661Ssonam gupta - Sun Microsystems - Bangalore India 			    "s_end_change_request: no attribute file");
50618188661Ssonam gupta - Sun Microsystems - Bangalore India 		}
50718188661Ssonam gupta - Sun Microsystems - Bangalore India #endif
50818188661Ssonam gupta - Sun Microsystems - Bangalore India 		rp->request->outcome &= ~(RS_CHANGING);
50918188661Ssonam gupta - Sun Microsystems - Bangalore India 		del_flt_act(md, FLT_CHANGE);
51018188661Ssonam gupta - Sun Microsystems - Bangalore India 		/*
51118188661Ssonam gupta - Sun Microsystems - Bangalore India 		 * The RS_CHANGING bit may have been the only thing
51218188661Ssonam gupta - Sun Microsystems - Bangalore India 		 * preventing this request from filtering or printing,
51318188661Ssonam gupta - Sun Microsystems - Bangalore India 		 * so regardless of what happens below,
51418188661Ssonam gupta - Sun Microsystems - Bangalore India 		 * we must check to see if the request can proceed.
51518188661Ssonam gupta - Sun Microsystems - Bangalore India 		 */
51618188661Ssonam gupta - Sun Microsystems - Bangalore India 		call_schedule = 1;
5175a00db9dSsonam gupta - Sun Microsystems - Bangalore India 
51818188661Ssonam gupta - Sun Microsystems - Bangalore India 		if (!(r = Getrequest(rp->req_file)))
51918188661Ssonam gupta - Sun Microsystems - Bangalore India 			status = MNOOPEN;
52018188661Ssonam gupta - Sun Microsystems - Bangalore India 		else {
52118188661Ssonam gupta - Sun Microsystems - Bangalore India 			oldr = *(rp->request);
52218188661Ssonam gupta - Sun Microsystems - Bangalore India 			*(rp->request) = *r;
5235a00db9dSsonam gupta - Sun Microsystems - Bangalore India 
52418188661Ssonam gupta - Sun Microsystems - Bangalore India 			move_ok =
52518188661Ssonam gupta - Sun Microsystems - Bangalore India 			    STREQU(oldr.destination, r->destination);
5265a00db9dSsonam gupta - Sun Microsystems - Bangalore India 
52718188661Ssonam gupta - Sun Microsystems - Bangalore India 			/*
52818188661Ssonam gupta - Sun Microsystems - Bangalore India 			 * Preserve the current request status!
52918188661Ssonam gupta - Sun Microsystems - Bangalore India 			 */
53018188661Ssonam gupta - Sun Microsystems - Bangalore India 			rp->request->outcome = oldr.outcome;
5315a00db9dSsonam gupta - Sun Microsystems - Bangalore India 
53218188661Ssonam gupta - Sun Microsystems - Bangalore India 			/*
53318188661Ssonam gupta - Sun Microsystems - Bangalore India 			 * Here's an example of the dangers one meets
53418188661Ssonam gupta - Sun Microsystems - Bangalore India 			 * when public flags are used for private
53518188661Ssonam gupta - Sun Microsystems - Bangalore India 			 * purposes. ".actions" (indeed, anything in the
53618188661Ssonam gupta - Sun Microsystems - Bangalore India 			 * REQUEST structure) is set by the person
53718188661Ssonam gupta - Sun Microsystems - Bangalore India 			 * changing the job. However, lpsched uses
53818188661Ssonam gupta - Sun Microsystems - Bangalore India 			 * ".actions" as place to indicate that a job
53918188661Ssonam gupta - Sun Microsystems - Bangalore India 			 * came from a remote system and we must send
54018188661Ssonam gupta - Sun Microsystems - Bangalore India 			 * back job completion--this is a strictly
54118188661Ssonam gupta - Sun Microsystems - Bangalore India 			 * private flag that we must preserve.
54218188661Ssonam gupta - Sun Microsystems - Bangalore India 			 */
54318188661Ssonam gupta - Sun Microsystems - Bangalore India 			rp->request->actions |=
54418188661Ssonam gupta - Sun Microsystems - Bangalore India 			    (oldr.actions & ACT_NOTIFY);
54518188661Ssonam gupta - Sun Microsystems - Bangalore India 
54618188661Ssonam gupta - Sun Microsystems - Bangalore India 			if ((rp->request->actions & ACT_SPECIAL) ==
54718188661Ssonam gupta - Sun Microsystems - Bangalore India 			    ACT_HOLD) {
54818188661Ssonam gupta - Sun Microsystems - Bangalore India 				rp->request->outcome |= RS_HELD;
54918188661Ssonam gupta - Sun Microsystems - Bangalore India 				/*
55018188661Ssonam gupta - Sun Microsystems - Bangalore India 				 * To be here means either the user owns
55148bbca81SDaniel Hoffman 				 * the request or they are the
55218188661Ssonam gupta - Sun Microsystems - Bangalore India 				 * administrator. Since we don't want to
55318188661Ssonam gupta - Sun Microsystems - Bangalore India 				 * set the RS_ADMINHELD flag if the user
55418188661Ssonam gupta - Sun Microsystems - Bangalore India 				 * is the administrator, the following
55518188661Ssonam gupta - Sun Microsystems - Bangalore India 				 * compare will work.
55618188661Ssonam gupta - Sun Microsystems - Bangalore India 				 */
55718188661Ssonam gupta - Sun Microsystems - Bangalore India 				if (md->uid != rp->secure->uid)
55818188661Ssonam gupta - Sun Microsystems - Bangalore India 					rp->request->outcome |=
55918188661Ssonam gupta - Sun Microsystems - Bangalore India 					    RS_ADMINHELD;
56018188661Ssonam gupta - Sun Microsystems - Bangalore India 			}
5617c478bd9Sstevel@tonic-gate 
56218188661Ssonam gupta - Sun Microsystems - Bangalore India 			if ((rp->request->actions & ACT_SPECIAL) ==
56318188661Ssonam gupta - Sun Microsystems - Bangalore India 			    ACT_RESUME) {
56418188661Ssonam gupta - Sun Microsystems - Bangalore India 				if ((rp->request->outcome & RS_ADMINHELD) &&
56518188661Ssonam gupta - Sun Microsystems - Bangalore India 				    !md->admin) {
56618188661Ssonam gupta - Sun Microsystems - Bangalore India 					status = MNOPERM;
56718188661Ssonam gupta - Sun Microsystems - Bangalore India 					goto Return;
56818188661Ssonam gupta - Sun Microsystems - Bangalore India 				}
56918188661Ssonam gupta - Sun Microsystems - Bangalore India 				rp->request->outcome &=
57018188661Ssonam gupta - Sun Microsystems - Bangalore India 				    ~(RS_ADMINHELD|RS_HELD);
57118188661Ssonam gupta - Sun Microsystems - Bangalore India 			}
5727c478bd9Sstevel@tonic-gate 
57318188661Ssonam gupta - Sun Microsystems - Bangalore India 			if ((rp->request->actions & ACT_SPECIAL)
57418188661Ssonam gupta - Sun Microsystems - Bangalore India 			    == ACT_IMMEDIATE) {
57518188661Ssonam gupta - Sun Microsystems - Bangalore India 				if (!md->admin) {
57618188661Ssonam gupta - Sun Microsystems - Bangalore India 					status = MNOPERM;
57718188661Ssonam gupta - Sun Microsystems - Bangalore India 					goto Return;
57818188661Ssonam gupta - Sun Microsystems - Bangalore India 				}
57918188661Ssonam gupta - Sun Microsystems - Bangalore India 				rp->request->outcome |= RS_IMMEDIATE;
58018188661Ssonam gupta - Sun Microsystems - Bangalore India 			}
5817c478bd9Sstevel@tonic-gate 
58218188661Ssonam gupta - Sun Microsystems - Bangalore India 			size = chfiles(rp->request->file_list, Lp_Uid,
58318188661Ssonam gupta - Sun Microsystems - Bangalore India 			    Lp_Gid);
58418188661Ssonam gupta - Sun Microsystems - Bangalore India 			if (size < 0) {
58518188661Ssonam gupta - Sun Microsystems - Bangalore India 				status = MUNKNOWN;
58618188661Ssonam gupta - Sun Microsystems - Bangalore India 				goto Return;
58718188661Ssonam gupta - Sun Microsystems - Bangalore India 			}
58818188661Ssonam gupta - Sun Microsystems - Bangalore India 			if (!(rp->request->outcome & RS_HELD) &&
58918188661Ssonam gupta - Sun Microsystems - Bangalore India 			    size == 0) {
59018188661Ssonam gupta - Sun Microsystems - Bangalore India 				status = MNOPERM;
59118188661Ssonam gupta - Sun Microsystems - Bangalore India 				goto Return;
59218188661Ssonam gupta - Sun Microsystems - Bangalore India 			}
5937c478bd9Sstevel@tonic-gate 
59418188661Ssonam gupta - Sun Microsystems - Bangalore India 			osize = rp->secure->size;
59518188661Ssonam gupta - Sun Microsystems - Bangalore India 			rp->secure->size = size;
59618188661Ssonam gupta - Sun Microsystems - Bangalore India 
59718188661Ssonam gupta - Sun Microsystems - Bangalore India 			if (move_ok == 0) {
59818188661Ssonam gupta - Sun Microsystems - Bangalore India 				char *dest = strdup(r->destination);
59918188661Ssonam gupta - Sun Microsystems - Bangalore India 				if ((status = mv_file(rp, dest)) == MOK)
60018188661Ssonam gupta - Sun Microsystems - Bangalore India 					rp->secure->size = osize;
60118188661Ssonam gupta - Sun Microsystems - Bangalore India 				free(dest);
60218188661Ssonam gupta - Sun Microsystems - Bangalore India 			} else if ((err = validate_request(rp, (char **)0,
60318188661Ssonam gupta - Sun Microsystems - Bangalore India 			    move_ok)) != MOK) {
60418188661Ssonam gupta - Sun Microsystems - Bangalore India 				status = err;
60518188661Ssonam gupta - Sun Microsystems - Bangalore India 				rp->secure->size = osize;
60618188661Ssonam gupta - Sun Microsystems - Bangalore India 			} else {
60718188661Ssonam gupta - Sun Microsystems - Bangalore India 				status = MOK;
60818188661Ssonam gupta - Sun Microsystems - Bangalore India 
60918188661Ssonam gupta - Sun Microsystems - Bangalore India 				if ((rp->request->outcome & RS_IMMEDIATE) ||
61018188661Ssonam gupta - Sun Microsystems - Bangalore India 				    (rp->request->priority != oldr.priority)) {
61118188661Ssonam gupta - Sun Microsystems - Bangalore India 					remover(rp);
61218188661Ssonam gupta - Sun Microsystems - Bangalore India 					insertr(rp);
61318188661Ssonam gupta - Sun Microsystems - Bangalore India 				}
61418188661Ssonam gupta - Sun Microsystems - Bangalore India 
61518188661Ssonam gupta - Sun Microsystems - Bangalore India 				freerequest(&oldr);
61618188661Ssonam gupta - Sun Microsystems - Bangalore India 				(void) putrequest(rp->req_file, rp->request);
61718188661Ssonam gupta - Sun Microsystems - Bangalore India 				/*
61818188661Ssonam gupta - Sun Microsystems - Bangalore India 				 * fix for bugid 1103890.
61918188661Ssonam gupta - Sun Microsystems - Bangalore India 				 * use Putsecure instead.
62018188661Ssonam gupta - Sun Microsystems - Bangalore India 				 */
62118188661Ssonam gupta - Sun Microsystems - Bangalore India 				(void) Putsecure(rp->req_file, rp->secure);
62218188661Ssonam gupta - Sun Microsystems - Bangalore India 			}
6237c478bd9Sstevel@tonic-gate 		}
6247c478bd9Sstevel@tonic-gate 	}
6257c478bd9Sstevel@tonic-gate 
6267c478bd9Sstevel@tonic-gate Return:
62718188661Ssonam gupta - Sun Microsystems - Bangalore India 	if (status != MOK && rp) {
62818188661Ssonam gupta - Sun Microsystems - Bangalore India 		if (r) {
62918188661Ssonam gupta - Sun Microsystems - Bangalore India 			freerequest(r);
63018188661Ssonam gupta - Sun Microsystems - Bangalore India 			*(rp->request) = oldr;
63118188661Ssonam gupta - Sun Microsystems - Bangalore India 		}
63218188661Ssonam gupta - Sun Microsystems - Bangalore India 		if (status != MNOSTART)
63318188661Ssonam gupta - Sun Microsystems - Bangalore India 			(void) putrequest(rp->req_file, rp->request);
6347c478bd9Sstevel@tonic-gate 	}
6357c478bd9Sstevel@tonic-gate 
63618188661Ssonam gupta - Sun Microsystems - Bangalore India 	if (call_schedule)
63718188661Ssonam gupta - Sun Microsystems - Bangalore India 		maybe_schedule(rp);
6387c478bd9Sstevel@tonic-gate 
63918188661Ssonam gupta - Sun Microsystems - Bangalore India 	mputm(md, R_END_CHANGE_REQUEST, status, chkprinter_result);
6407c478bd9Sstevel@tonic-gate }
6417c478bd9Sstevel@tonic-gate 
64218188661Ssonam gupta - Sun Microsystems - Bangalore India /*
64318188661Ssonam gupta - Sun Microsystems - Bangalore India  * _cancel()
64418188661Ssonam gupta - Sun Microsystems - Bangalore India  *	user may be (host!user)
64518188661Ssonam gupta - Sun Microsystems - Bangalore India  */
6467c478bd9Sstevel@tonic-gate 
6477c478bd9Sstevel@tonic-gate static char *
_cancel(MESG * md,char * dest,char * user,char * req_id)6487c478bd9Sstevel@tonic-gate _cancel(MESG *md, char *dest, char *user, char *req_id)
6497c478bd9Sstevel@tonic-gate {
65018188661Ssonam gupta - Sun Microsystems - Bangalore India 	static RSTATUS	*rp;
65118188661Ssonam gupta - Sun Microsystems - Bangalore India 	static char		*s_dest;
65218188661Ssonam gupta - Sun Microsystems - Bangalore India 	static char		*s_user;
65318188661Ssonam gupta - Sun Microsystems - Bangalore India 	static char		*s_req_id;
65418188661Ssonam gupta - Sun Microsystems - Bangalore India 	static int		current;
65518188661Ssonam gupta - Sun Microsystems - Bangalore India 	RSTATUS		*crp;
65618188661Ssonam gupta - Sun Microsystems - Bangalore India 	char		*creq_id;
65718188661Ssonam gupta - Sun Microsystems - Bangalore India 
65818188661Ssonam gupta - Sun Microsystems - Bangalore India 	syslog(LOG_DEBUG, "_cancel(%s, %s, %s)", (dest ? dest : "NULL"),
65918188661Ssonam gupta - Sun Microsystems - Bangalore India 	    (user ? user : "NULL"), (req_id ? req_id : "NULL"));
66018188661Ssonam gupta - Sun Microsystems - Bangalore India 
66118188661Ssonam gupta - Sun Microsystems - Bangalore India 	if (dest || user || req_id) {
66218188661Ssonam gupta - Sun Microsystems - Bangalore India 		s_dest = dest;
66318188661Ssonam gupta - Sun Microsystems - Bangalore India 		if (STREQU(user, "!"))
66418188661Ssonam gupta - Sun Microsystems - Bangalore India 			s_user = strdup("all!all");
66518188661Ssonam gupta - Sun Microsystems - Bangalore India 		else
66618188661Ssonam gupta - Sun Microsystems - Bangalore India 			s_user = user;
66718188661Ssonam gupta - Sun Microsystems - Bangalore India 		s_req_id = req_id;
66818188661Ssonam gupta - Sun Microsystems - Bangalore India 		rp = Request_List;
66918188661Ssonam gupta - Sun Microsystems - Bangalore India 		current = 0;
67018188661Ssonam gupta - Sun Microsystems - Bangalore India 		if (STREQU(s_req_id, CURRENT_REQ)) {
67118188661Ssonam gupta - Sun Microsystems - Bangalore India 			current = 1;
67218188661Ssonam gupta - Sun Microsystems - Bangalore India 			s_req_id = NULL;
67318188661Ssonam gupta - Sun Microsystems - Bangalore India 		}
6747c478bd9Sstevel@tonic-gate 	}
6757c478bd9Sstevel@tonic-gate 
67618188661Ssonam gupta - Sun Microsystems - Bangalore India 	while (rp != NULL) {
67718188661Ssonam gupta - Sun Microsystems - Bangalore India 		crp = rp;
67818188661Ssonam gupta - Sun Microsystems - Bangalore India 		rp = rp->next;
6797c478bd9Sstevel@tonic-gate 
68018188661Ssonam gupta - Sun Microsystems - Bangalore India 		if (*s_dest && !STREQU(s_dest, crp->request->destination))
68118188661Ssonam gupta - Sun Microsystems - Bangalore India 			continue;
68218188661Ssonam gupta - Sun Microsystems - Bangalore India 
68318188661Ssonam gupta - Sun Microsystems - Bangalore India 		if (current && !(crp->request->outcome & RS_PRINTING))
68418188661Ssonam gupta - Sun Microsystems - Bangalore India 			continue;
6857c478bd9Sstevel@tonic-gate 
68618188661Ssonam gupta - Sun Microsystems - Bangalore India 		if (s_req_id && *s_req_id &&
68718188661Ssonam gupta - Sun Microsystems - Bangalore India 		    !STREQU(s_req_id, crp->secure->req_id))
68818188661Ssonam gupta - Sun Microsystems - Bangalore India 			continue;
6897c478bd9Sstevel@tonic-gate 
69018188661Ssonam gupta - Sun Microsystems - Bangalore India 		if (*s_user && !bangequ(s_user, crp->secure->user))
69118188661Ssonam gupta - Sun Microsystems - Bangalore India 			continue;
6927c478bd9Sstevel@tonic-gate 
69318188661Ssonam gupta - Sun Microsystems - Bangalore India 		if (!md->admin && md->uid != crp->secure->uid) {
69418188661Ssonam gupta - Sun Microsystems - Bangalore India 			errno = MNOPERM;
69518188661Ssonam gupta - Sun Microsystems - Bangalore India 			return (Strdup(crp->secure->req_id));
69618188661Ssonam gupta - Sun Microsystems - Bangalore India 		}
6977c478bd9Sstevel@tonic-gate 
69818188661Ssonam gupta - Sun Microsystems - Bangalore India 		/*
69918188661Ssonam gupta - Sun Microsystems - Bangalore India 		 * For Trusted Extensions, we need to check the
70018188661Ssonam gupta - Sun Microsystems - Bangalore India 		 * sensitivity label of the
70118188661Ssonam gupta - Sun Microsystems - Bangalore India 		 * connection and job before we try to cancel it.
70218188661Ssonam gupta - Sun Microsystems - Bangalore India 		 */
70318188661Ssonam gupta - Sun Microsystems - Bangalore India 		if ((md->admin == 0) && (is_system_labeled()) &&
70418188661Ssonam gupta - Sun Microsystems - Bangalore India 		    (md->slabel != NULL) && (crp->secure->slabel != NULL) &&
70518188661Ssonam gupta - Sun Microsystems - Bangalore India 		    (!STREQU(md->slabel, crp->secure->slabel)))
70618188661Ssonam gupta - Sun Microsystems - Bangalore India 			continue;
70745916cd2Sjpk 
70818188661Ssonam gupta - Sun Microsystems - Bangalore India 		crp->reason = MOK;
70918188661Ssonam gupta - Sun Microsystems - Bangalore India 		creq_id = Strdup(crp->secure->req_id);
7107c478bd9Sstevel@tonic-gate 
71118188661Ssonam gupta - Sun Microsystems - Bangalore India 		syslog(LOG_DEBUG, "cancel reqid (%s) uid: %d, secureuid: %d",
71218188661Ssonam gupta - Sun Microsystems - Bangalore India 		    creq_id, md->uid, crp->secure->uid);
7137c478bd9Sstevel@tonic-gate 
71418188661Ssonam gupta - Sun Microsystems - Bangalore India 		if (cancel(crp, (md->uid != crp->secure->uid)))
71518188661Ssonam gupta - Sun Microsystems - Bangalore India 			errno = MOK;
71618188661Ssonam gupta - Sun Microsystems - Bangalore India 		else
71718188661Ssonam gupta - Sun Microsystems - Bangalore India 			errno = M2LATE;
71818188661Ssonam gupta - Sun Microsystems - Bangalore India 		return (creq_id);
71918188661Ssonam gupta - Sun Microsystems - Bangalore India 	}
7207c478bd9Sstevel@tonic-gate 
72118188661Ssonam gupta - Sun Microsystems - Bangalore India 	errno = MUNKNOWN;
72218188661Ssonam gupta - Sun Microsystems - Bangalore India 	return (NULL);
7237c478bd9Sstevel@tonic-gate }
7247c478bd9Sstevel@tonic-gate 
72518188661Ssonam gupta - Sun Microsystems - Bangalore India /*
72618188661Ssonam gupta - Sun Microsystems - Bangalore India  * s_cancel_request()
72718188661Ssonam gupta - Sun Microsystems - Bangalore India  */
7287c478bd9Sstevel@tonic-gate 
72918188661Ssonam gupta - Sun Microsystems - Bangalore India void
s_cancel_request(char * m,MESG * md)73018188661Ssonam gupta - Sun Microsystems - Bangalore India s_cancel_request(char *m, MESG *md)
7317c478bd9Sstevel@tonic-gate {
7327c478bd9Sstevel@tonic-gate 	char	*req_id, *rid;
7337c478bd9Sstevel@tonic-gate 	short	status;
7347c478bd9Sstevel@tonic-gate 
7357c478bd9Sstevel@tonic-gate 	(void) getmessage(m, S_CANCEL_REQUEST, &req_id);
7367c478bd9Sstevel@tonic-gate 	syslog(LOG_DEBUG, "s_cancel_request(%s)", (req_id ? req_id : "NULL"));
7377c478bd9Sstevel@tonic-gate 
7387c478bd9Sstevel@tonic-gate 	if ((rid = _cancel(md, "", "", req_id)) != NULL)
7397c478bd9Sstevel@tonic-gate 		Free(rid);
7407c478bd9Sstevel@tonic-gate 	status = (short)errno;
74118188661Ssonam gupta - Sun Microsystems - Bangalore India 
7427c478bd9Sstevel@tonic-gate 	mputm(md, R_CANCEL_REQUEST, status);
7437c478bd9Sstevel@tonic-gate }
7447c478bd9Sstevel@tonic-gate 
74518188661Ssonam gupta - Sun Microsystems - Bangalore India /*
74618188661Ssonam gupta - Sun Microsystems - Bangalore India  * s_cancel()
74718188661Ssonam gupta - Sun Microsystems - Bangalore India  */
7487c478bd9Sstevel@tonic-gate 
74918188661Ssonam gupta - Sun Microsystems - Bangalore India void
s_cancel(char * m,MESG * md)75018188661Ssonam gupta - Sun Microsystems - Bangalore India s_cancel(char *m, MESG *md)
7517c478bd9Sstevel@tonic-gate {
75218188661Ssonam gupta - Sun Microsystems - Bangalore India 	char	*req_id;
75318188661Ssonam gupta - Sun Microsystems - Bangalore India 	char	*user;
75418188661Ssonam gupta - Sun Microsystems - Bangalore India 	char	*destination;
75518188661Ssonam gupta - Sun Microsystems - Bangalore India 	char	*rid;
75618188661Ssonam gupta - Sun Microsystems - Bangalore India 	char	*nrid;
75718188661Ssonam gupta - Sun Microsystems - Bangalore India 	int		nerrno;
75818188661Ssonam gupta - Sun Microsystems - Bangalore India 	int		oerrno;
75918188661Ssonam gupta - Sun Microsystems - Bangalore India 
76018188661Ssonam gupta - Sun Microsystems - Bangalore India 	(void) getmessage(m, S_CANCEL, &destination, &user, &req_id);
76118188661Ssonam gupta - Sun Microsystems - Bangalore India 	syslog(LOG_DEBUG, "s_cancel(%s, %s, %s)",
76218188661Ssonam gupta - Sun Microsystems - Bangalore India 	    (destination ? destination : "NULL"), (user ? user : "NULL"),
76318188661Ssonam gupta - Sun Microsystems - Bangalore India 	    (req_id ? req_id : "NULL"));
76418188661Ssonam gupta - Sun Microsystems - Bangalore India 
76518188661Ssonam gupta - Sun Microsystems - Bangalore India 	if (STREQU(destination, NAME_ALL))
76618188661Ssonam gupta - Sun Microsystems - Bangalore India 		destination = "";
76718188661Ssonam gupta - Sun Microsystems - Bangalore India 	if (STREQU(req_id, NAME_ALL))
76818188661Ssonam gupta - Sun Microsystems - Bangalore India 		req_id = "";
76918188661Ssonam gupta - Sun Microsystems - Bangalore India 
77018188661Ssonam gupta - Sun Microsystems - Bangalore India 	if (rid = _cancel(md, destination, user, req_id)) {
77118188661Ssonam gupta - Sun Microsystems - Bangalore India 		oerrno = errno;
77218188661Ssonam gupta - Sun Microsystems - Bangalore India 
77318188661Ssonam gupta - Sun Microsystems - Bangalore India 		while ((nrid = _cancel(md, NULL, NULL, NULL)) != NULL) {
77418188661Ssonam gupta - Sun Microsystems - Bangalore India 			nerrno = errno;
77518188661Ssonam gupta - Sun Microsystems - Bangalore India 			mputm(md, R_CANCEL, MOKMORE, oerrno, rid);
77618188661Ssonam gupta - Sun Microsystems - Bangalore India 			Free(rid);
77718188661Ssonam gupta - Sun Microsystems - Bangalore India 			rid = nrid;
77818188661Ssonam gupta - Sun Microsystems - Bangalore India 			oerrno = nerrno;
77918188661Ssonam gupta - Sun Microsystems - Bangalore India 		}
78018188661Ssonam gupta - Sun Microsystems - Bangalore India 		mputm(md, R_CANCEL, MOK, oerrno, rid);
78118188661Ssonam gupta - Sun Microsystems - Bangalore India 		Free(rid);
78218188661Ssonam gupta - Sun Microsystems - Bangalore India 		return;
7837c478bd9Sstevel@tonic-gate 	}
7847c478bd9Sstevel@tonic-gate 
78518188661Ssonam gupta - Sun Microsystems - Bangalore India 	mputm(md, R_CANCEL, MOK, MUNKNOWN, "");
7867c478bd9Sstevel@tonic-gate }
7877c478bd9Sstevel@tonic-gate 
7887c478bd9Sstevel@tonic-gate /*
7897c478bd9Sstevel@tonic-gate  * s_inquire_request_rank()
7907c478bd9Sstevel@tonic-gate  */
7917c478bd9Sstevel@tonic-gate 
79218188661Ssonam gupta - Sun Microsystems - Bangalore India void
s_inquire_request_rank(char * m,MESG * md)79318188661Ssonam gupta - Sun Microsystems - Bangalore India s_inquire_request_rank(char *m, MESG *md)
7947c478bd9Sstevel@tonic-gate {
7957c478bd9Sstevel@tonic-gate 	char		*form;
7967c478bd9Sstevel@tonic-gate 	char		*dest;
7977c478bd9Sstevel@tonic-gate 	char		*pwheel;
7987c478bd9Sstevel@tonic-gate 	char		*user;
7997c478bd9Sstevel@tonic-gate 	char		*req_id;
8007c478bd9Sstevel@tonic-gate 	RSTATUS		*rp;
8017c478bd9Sstevel@tonic-gate 	RSTATUS		*found = NULL;
8027c478bd9Sstevel@tonic-gate 	int		found_rank = 0;
8037c478bd9Sstevel@tonic-gate 	short		prop;
8047c478bd9Sstevel@tonic-gate 	char		files[BUFSIZ];
8050a44ef6dSjacobs 	int 		i;
8067c478bd9Sstevel@tonic-gate 
8077c478bd9Sstevel@tonic-gate 	(void) getmessage(m, S_INQUIRE_REQUEST_RANK, &prop, &form, &dest,
80818188661Ssonam gupta - Sun Microsystems - Bangalore India 	    &req_id, &user, &pwheel);
8097c478bd9Sstevel@tonic-gate 	syslog(LOG_DEBUG, "s_inquire_request_rank(%d, %s, %s, %s, %s, %s)",
81018188661Ssonam gupta - Sun Microsystems - Bangalore India 	    prop, (form ? form : "NULL"), (dest ? dest : "NULL"),
81118188661Ssonam gupta - Sun Microsystems - Bangalore India 	    (req_id ? req_id : "NULL"), (user ? user : "NULL"),
81218188661Ssonam gupta - Sun Microsystems - Bangalore India 	    (pwheel ? pwheel : "NULL"));
8137c478bd9Sstevel@tonic-gate 
8140a44ef6dSjacobs 	for (i = 0; PStatus != NULL && PStatus[i] != NULL; i++)
8150a44ef6dSjacobs 		PStatus[i]->nrequests = 0;
8167c478bd9Sstevel@tonic-gate 
8177c478bd9Sstevel@tonic-gate 	for (rp = Request_List; rp != NULL; rp = rp->next) {
8187c478bd9Sstevel@tonic-gate 		if (rp->printer && !(rp->request->outcome & RS_DONE))
8197c478bd9Sstevel@tonic-gate 			rp->printer->nrequests++;
8207c478bd9Sstevel@tonic-gate 
8217c478bd9Sstevel@tonic-gate 		if (*form && !SAME(form, rp->request->form))
8227c478bd9Sstevel@tonic-gate 			continue;
8237c478bd9Sstevel@tonic-gate 
8247c478bd9Sstevel@tonic-gate 		if (*dest && !STREQU(dest, rp->request->destination)) {
8257c478bd9Sstevel@tonic-gate 			if (!rp->printer)
8267c478bd9Sstevel@tonic-gate 				continue;
8277c478bd9Sstevel@tonic-gate 			if (!STREQU(dest, rp->printer->printer->name))
8287c478bd9Sstevel@tonic-gate 				continue;
8297c478bd9Sstevel@tonic-gate 		}
83018188661Ssonam gupta - Sun Microsystems - Bangalore India 
8317c478bd9Sstevel@tonic-gate 		if (*req_id && !STREQU(req_id, rp->secure->req_id))
8327c478bd9Sstevel@tonic-gate 			continue;
8337c478bd9Sstevel@tonic-gate 
8347c478bd9Sstevel@tonic-gate 		if (*user && !bangequ(user, rp->secure->user))
8357c478bd9Sstevel@tonic-gate 			continue;
8367c478bd9Sstevel@tonic-gate 
8377c478bd9Sstevel@tonic-gate 		if (*pwheel && !SAME(pwheel, rp->pwheel_name))
8387c478bd9Sstevel@tonic-gate 			continue;
83945916cd2Sjpk 		/*
84045916cd2Sjpk 		 * For Trusted Extensions, we need to check the sensitivity
84145916cd2Sjpk 		 * label of the connection and job before we return it to the
84245916cd2Sjpk 		 * client.
84345916cd2Sjpk 		 */
84445916cd2Sjpk 		if ((md->admin <= 0) && (is_system_labeled()) &&
84545916cd2Sjpk 		    (md->slabel != NULL) && (rp->secure->slabel != NULL) &&
84645916cd2Sjpk 		    (!STREQU(md->slabel, rp->secure->slabel)))
84745916cd2Sjpk 			continue;
8487c478bd9Sstevel@tonic-gate 
8497c478bd9Sstevel@tonic-gate 		if (found) {
85018188661Ssonam gupta - Sun Microsystems - Bangalore India 			GetRequestFiles(found->request, files, sizeof (files));
8517c478bd9Sstevel@tonic-gate 			mputm(md, R_INQUIRE_REQUEST_RANK,
85218188661Ssonam gupta - Sun Microsystems - Bangalore India 			    MOKMORE,
85318188661Ssonam gupta - Sun Microsystems - Bangalore India 			    found->secure->req_id,
85418188661Ssonam gupta - Sun Microsystems - Bangalore India 			    found->request->user,
85518188661Ssonam gupta - Sun Microsystems - Bangalore India 			    /* bgolden 091996, bug 1257405 */
85618188661Ssonam gupta - Sun Microsystems - Bangalore India 			    found->secure->slabel,
85718188661Ssonam gupta - Sun Microsystems - Bangalore India 			    found->secure->size,
85818188661Ssonam gupta - Sun Microsystems - Bangalore India 			    found->secure->date,
85918188661Ssonam gupta - Sun Microsystems - Bangalore India 			    found->request->outcome,
86018188661Ssonam gupta - Sun Microsystems - Bangalore India 			    found->printer->printer->name,
86118188661Ssonam gupta - Sun Microsystems - Bangalore India 			    (found->form? found->form->form->name : ""),
86218188661Ssonam gupta - Sun Microsystems - Bangalore India 			    NB(found->pwheel_name),
86318188661Ssonam gupta - Sun Microsystems - Bangalore India 			    found_rank,
86418188661Ssonam gupta - Sun Microsystems - Bangalore India 			    files);
8657c478bd9Sstevel@tonic-gate 		}
8667c478bd9Sstevel@tonic-gate 		found = rp;
8677c478bd9Sstevel@tonic-gate 		found_rank = found->printer->nrequests;
8687c478bd9Sstevel@tonic-gate 	}
8697c478bd9Sstevel@tonic-gate 
8707c478bd9Sstevel@tonic-gate 	if (found) {
87118188661Ssonam gupta - Sun Microsystems - Bangalore India 		GetRequestFiles(found->request, files, sizeof (files));
8727c478bd9Sstevel@tonic-gate 		mputm(md, R_INQUIRE_REQUEST_RANK,
87318188661Ssonam gupta - Sun Microsystems - Bangalore India 		    MOK,
87418188661Ssonam gupta - Sun Microsystems - Bangalore India 		    found->secure->req_id,
87518188661Ssonam gupta - Sun Microsystems - Bangalore India 		    found->request->user, /* bgolden 091996, bug 1257405 */
87618188661Ssonam gupta - Sun Microsystems - Bangalore India 		    found->secure->slabel,
87718188661Ssonam gupta - Sun Microsystems - Bangalore India 		    found->secure->size,
87818188661Ssonam gupta - Sun Microsystems - Bangalore India 		    found->secure->date,
87918188661Ssonam gupta - Sun Microsystems - Bangalore India 		    found->request->outcome,
88018188661Ssonam gupta - Sun Microsystems - Bangalore India 		    found->printer->printer->name,
88118188661Ssonam gupta - Sun Microsystems - Bangalore India 		    (found->form? found->form->form->name : ""),
88218188661Ssonam gupta - Sun Microsystems - Bangalore India 		    NB(found->pwheel_name),
88318188661Ssonam gupta - Sun Microsystems - Bangalore India 		    found_rank,
88418188661Ssonam gupta - Sun Microsystems - Bangalore India 		    files);
8857c478bd9Sstevel@tonic-gate 	} else
88645916cd2Sjpk 		mputm(md, R_INQUIRE_REQUEST_RANK, MNOINFO, "", "", "", 0L, 0L,
88718188661Ssonam gupta - Sun Microsystems - Bangalore India 		    0, "", "", "", 0, "");
8887c478bd9Sstevel@tonic-gate }
8897c478bd9Sstevel@tonic-gate 
8907c478bd9Sstevel@tonic-gate static int
mv_file(RSTATUS * rp,char * dest)8917c478bd9Sstevel@tonic-gate mv_file(RSTATUS *rp, char *dest)
8927c478bd9Sstevel@tonic-gate {
8937c478bd9Sstevel@tonic-gate 	int	stat;
8947c478bd9Sstevel@tonic-gate 	char	*olddest;
8957c478bd9Sstevel@tonic-gate 	EXEC	*oldexec;
8967c478bd9Sstevel@tonic-gate 	SECURE * securep;
8977c478bd9Sstevel@tonic-gate 	RSTATUS * prs;
89818188661Ssonam gupta - Sun Microsystems - Bangalore India 	char *reqno;
8997c478bd9Sstevel@tonic-gate 
9007c478bd9Sstevel@tonic-gate 	oldexec = rp->printer->exec;
9017c478bd9Sstevel@tonic-gate 	olddest = rp->request->destination;
9027c478bd9Sstevel@tonic-gate 	rp->request->destination = Strdup(dest);
9037c478bd9Sstevel@tonic-gate 	if ((stat = validate_request(rp, (char **)0, 1)) == MOK) {
9047c478bd9Sstevel@tonic-gate 		Free(olddest);
9057c478bd9Sstevel@tonic-gate 
9067c478bd9Sstevel@tonic-gate 		if (rp->request->outcome & RS_FILTERED) {
9077c478bd9Sstevel@tonic-gate 			int cnt = 0;
9087c478bd9Sstevel@tonic-gate 			char *reqno;
9097c478bd9Sstevel@tonic-gate 			char **listp;
9107c478bd9Sstevel@tonic-gate 			char tmp_nam[MAXPATHLEN];
9117c478bd9Sstevel@tonic-gate 
9127c478bd9Sstevel@tonic-gate 			reqno = getreqno(rp->secure->req_id);
9137c478bd9Sstevel@tonic-gate 			for (listp = rp->request->file_list; *listp; listp++) {
9147c478bd9Sstevel@tonic-gate 				cnt++;
9157c478bd9Sstevel@tonic-gate 				snprintf(tmp_nam, sizeof (tmp_nam),
91618188661Ssonam gupta - Sun Microsystems - Bangalore India 				    "%s/F%s-%d", Lp_Temp, reqno, cnt);
9177c478bd9Sstevel@tonic-gate 				unlink(tmp_nam);
9187c478bd9Sstevel@tonic-gate 
9197c478bd9Sstevel@tonic-gate 			}
9207c478bd9Sstevel@tonic-gate 			rp->request->outcome &= ~RS_FILTERED;
9217c478bd9Sstevel@tonic-gate 		}
9227c478bd9Sstevel@tonic-gate 
9237c478bd9Sstevel@tonic-gate 		/* update /var/spool/lp/tmp/<host>/nnn-0 */
9247c478bd9Sstevel@tonic-gate 		if (putrequest(rp->req_file, rp->request) < 0) {
9257c478bd9Sstevel@tonic-gate 			note("putrequest failed\n");
9267c478bd9Sstevel@tonic-gate 			return (MNOMEM);
9277c478bd9Sstevel@tonic-gate 		}
9287c478bd9Sstevel@tonic-gate 
9297c478bd9Sstevel@tonic-gate 		/* update /var/spool/lp/requests/<host>/nnn-0 */
9307c478bd9Sstevel@tonic-gate 		if ((securep = Getsecure(rp->req_file))) {
9317c478bd9Sstevel@tonic-gate 			reqno = strdup(getreqno(securep->req_id));
9327c478bd9Sstevel@tonic-gate 			(void) free(securep->req_id);
9337c478bd9Sstevel@tonic-gate 			if ((securep->req_id = calloc(strlen(dest) + 1 +
93418188661Ssonam gupta - Sun Microsystems - Bangalore India 			    strlen(reqno) +1, sizeof (char))) == NULL)
9357c478bd9Sstevel@tonic-gate 				return (MNOMEM);
9367c478bd9Sstevel@tonic-gate 			(void) sprintf(securep->req_id, "%s-%s", dest, reqno);
9377c478bd9Sstevel@tonic-gate 			/* remove the old request file; save new one */
9387c478bd9Sstevel@tonic-gate 			(void) rmsecure(rp->secure->req_id);
9397c478bd9Sstevel@tonic-gate 			if (Putsecure(rp->req_file, securep) < 0) {
9407c478bd9Sstevel@tonic-gate 				/* Putsecure includes note/errmessage */
9417c478bd9Sstevel@tonic-gate 				return (MNOMEM);
9427c478bd9Sstevel@tonic-gate 			}
9437c478bd9Sstevel@tonic-gate 		} else {
9447c478bd9Sstevel@tonic-gate 			note("Getsecure failed\n");
9457c478bd9Sstevel@tonic-gate 			return (MNOMEM);
9467c478bd9Sstevel@tonic-gate 		}
9477c478bd9Sstevel@tonic-gate 
9487c478bd9Sstevel@tonic-gate 		/* update internal jobs list: Request_list */
9497c478bd9Sstevel@tonic-gate 		if (prs = request_by_id(rp->secure->req_id)) {
9507c478bd9Sstevel@tonic-gate 			free(prs->secure->req_id);
9517c478bd9Sstevel@tonic-gate 			prs->secure->req_id = strdup(securep->req_id);
9527c478bd9Sstevel@tonic-gate 
9537c478bd9Sstevel@tonic-gate 			/*
9547c478bd9Sstevel@tonic-gate 			 * We calloc'd securep->reqid earlier, now we free it
9557c478bd9Sstevel@tonic-gate 			 * here because we no longer call 'freesecure' from
9567c478bd9Sstevel@tonic-gate 			 * Putsecure() if we use a static structure
9577c478bd9Sstevel@tonic-gate 			 */
9587c478bd9Sstevel@tonic-gate 
9597c478bd9Sstevel@tonic-gate 			free(securep->req_id);
9607c478bd9Sstevel@tonic-gate 		} else {
9617c478bd9Sstevel@tonic-gate 			note("request_by_id failed\n");
9627c478bd9Sstevel@tonic-gate 			return (MUNKNOWN);
9637c478bd9Sstevel@tonic-gate 		}
9647c478bd9Sstevel@tonic-gate 
9657c478bd9Sstevel@tonic-gate 		/*
9667c478bd9Sstevel@tonic-gate 		 * If the request was being filtered or was printing,
9677c478bd9Sstevel@tonic-gate 		 * it would have been stopped in "validate_request()",
9687c478bd9Sstevel@tonic-gate 		 * but only if it has to be refiltered. Thus, the
9697c478bd9Sstevel@tonic-gate 		 * filtering has been stopped if it has to be stopped,
9707c478bd9Sstevel@tonic-gate 		 * but the printing may still be going.
9717c478bd9Sstevel@tonic-gate 		 */
9727c478bd9Sstevel@tonic-gate 		if (rp->request->outcome & RS_PRINTING &&
9737c478bd9Sstevel@tonic-gate 		    !(rp->request->outcome & RS_STOPPED)) {
9747c478bd9Sstevel@tonic-gate 			rp->request->outcome |= RS_STOPPED;
97518188661Ssonam gupta - Sun Microsystems - Bangalore India 			terminate(oldexec);
97618188661Ssonam gupta - Sun Microsystems - Bangalore India 		}
9777c478bd9Sstevel@tonic-gate 
9787c478bd9Sstevel@tonic-gate 		maybe_schedule(rp);
9797c478bd9Sstevel@tonic-gate 		return (MOK);
9807c478bd9Sstevel@tonic-gate 	}
9817c478bd9Sstevel@tonic-gate 
9827c478bd9Sstevel@tonic-gate 	Free(rp->request->destination);
9837c478bd9Sstevel@tonic-gate 	rp->request->destination = olddest;
9847c478bd9Sstevel@tonic-gate 	return (stat);
9857c478bd9Sstevel@tonic-gate }
9867c478bd9Sstevel@tonic-gate 
9877c478bd9Sstevel@tonic-gate /*
9887c478bd9Sstevel@tonic-gate  * s_move_request()
9897c478bd9Sstevel@tonic-gate  */
9907c478bd9Sstevel@tonic-gate 
99118188661Ssonam gupta - Sun Microsystems - Bangalore India void
s_move_request(char * m,MESG * md)99218188661Ssonam gupta - Sun Microsystems - Bangalore India s_move_request(char *m, MESG *md)
9937c478bd9Sstevel@tonic-gate {
9947c478bd9Sstevel@tonic-gate 	RSTATUS	*rp;
9957c478bd9Sstevel@tonic-gate 	short	err;
9967c478bd9Sstevel@tonic-gate 	char	*req_id;
9977c478bd9Sstevel@tonic-gate 	char	*dest;
9987c478bd9Sstevel@tonic-gate 
9997c478bd9Sstevel@tonic-gate 	(void) getmessage(m, S_MOVE_REQUEST, &req_id, &dest);
10007c478bd9Sstevel@tonic-gate 	syslog(LOG_DEBUG, "s_move_request(%s, %s)", (req_id ? req_id : "NULL"),
100118188661Ssonam gupta - Sun Microsystems - Bangalore India 	    (dest ? dest : "NULL"));
10027c478bd9Sstevel@tonic-gate 
10037c478bd9Sstevel@tonic-gate 
10040a44ef6dSjacobs 	if (!(search_pstatus(dest)) && !(search_cstatus(dest))) {
10057c478bd9Sstevel@tonic-gate 		mputm(md, R_MOVE_REQUEST, MNODEST, 0L);
10067c478bd9Sstevel@tonic-gate 		return;
10077c478bd9Sstevel@tonic-gate 	}
10087c478bd9Sstevel@tonic-gate 
10097c478bd9Sstevel@tonic-gate 	if ((rp = request_by_id(req_id))) {
10107c478bd9Sstevel@tonic-gate 		if (STREQU(rp->request->destination, dest)) {
10117c478bd9Sstevel@tonic-gate 			mputm(md, R_MOVE_REQUEST, MOK, 0L);
10127c478bd9Sstevel@tonic-gate 			return;
10137c478bd9Sstevel@tonic-gate 		}
10147c478bd9Sstevel@tonic-gate 		if (rp->request->outcome & (RS_DONE|RS_NOTIFYING)) {
10157c478bd9Sstevel@tonic-gate 			mputm(md, R_MOVE_REQUEST, M2LATE, 0L);
10167c478bd9Sstevel@tonic-gate 			return;
10177c478bd9Sstevel@tonic-gate 		}
10187c478bd9Sstevel@tonic-gate 		if (rp->request->outcome & RS_CHANGING)	{
10197c478bd9Sstevel@tonic-gate 			mputm(md, R_MOVE_REQUEST, MBUSY, 0L);
10207c478bd9Sstevel@tonic-gate 			return;
10217c478bd9Sstevel@tonic-gate 		}
10227c478bd9Sstevel@tonic-gate 		if ((err = mv_file(rp, dest)) == MOK) {
10237c478bd9Sstevel@tonic-gate 			mputm(md, R_MOVE_REQUEST, MOK, 0L);
10247c478bd9Sstevel@tonic-gate 			return;
10257c478bd9Sstevel@tonic-gate 		}
10267c478bd9Sstevel@tonic-gate 		mputm(md, R_MOVE_REQUEST, err, chkprinter_result);
10277c478bd9Sstevel@tonic-gate 		return;
10287c478bd9Sstevel@tonic-gate 	}
10297c478bd9Sstevel@tonic-gate 	mputm(md, R_MOVE_REQUEST, MUNKNOWN, 0L);
10307c478bd9Sstevel@tonic-gate }
10317c478bd9Sstevel@tonic-gate 
103218188661Ssonam gupta - Sun Microsystems - Bangalore India /*
103318188661Ssonam gupta - Sun Microsystems - Bangalore India  * s_move_dest()
103418188661Ssonam gupta - Sun Microsystems - Bangalore India  */
10357c478bd9Sstevel@tonic-gate 
103618188661Ssonam gupta - Sun Microsystems - Bangalore India void
s_move_dest(char * m,MESG * md)103718188661Ssonam gupta - Sun Microsystems - Bangalore India s_move_dest(char *m, MESG *md)
10387c478bd9Sstevel@tonic-gate {
103918188661Ssonam gupta - Sun Microsystems - Bangalore India 	char		*dest;
104018188661Ssonam gupta - Sun Microsystems - Bangalore India 	char		*fromdest;
104118188661Ssonam gupta - Sun Microsystems - Bangalore India 	RSTATUS		*rp;
104218188661Ssonam gupta - Sun Microsystems - Bangalore India 	char		*found = (char *)0;
104318188661Ssonam gupta - Sun Microsystems - Bangalore India 	short		num_ok = 0;
104418188661Ssonam gupta - Sun Microsystems - Bangalore India 
104518188661Ssonam gupta - Sun Microsystems - Bangalore India 	(void) getmessage(m, S_MOVE_DEST, &fromdest, &dest);
104618188661Ssonam gupta - Sun Microsystems - Bangalore India 	syslog(LOG_DEBUG, "s_move_dest(%s, %s)", (fromdest ? fromdest : "NULL"),
104718188661Ssonam gupta - Sun Microsystems - Bangalore India 	    (dest ? dest : "NULL"));
104818188661Ssonam gupta - Sun Microsystems - Bangalore India 
104918188661Ssonam gupta - Sun Microsystems - Bangalore India 	if (!search_pstatus(fromdest) && !search_cstatus(fromdest)) {
105018188661Ssonam gupta - Sun Microsystems - Bangalore India 		mputm(md, R_MOVE_DEST, MNODEST, fromdest, 0);
105118188661Ssonam gupta - Sun Microsystems - Bangalore India 		return;
10527c478bd9Sstevel@tonic-gate 	}
10537c478bd9Sstevel@tonic-gate 
105418188661Ssonam gupta - Sun Microsystems - Bangalore India 	if (!(search_pstatus(dest)) && !(search_cstatus(dest))) {
105518188661Ssonam gupta - Sun Microsystems - Bangalore India 		mputm(md, R_MOVE_DEST, MNODEST, dest, 0);
105618188661Ssonam gupta - Sun Microsystems - Bangalore India 		return;
105718188661Ssonam gupta - Sun Microsystems - Bangalore India 	}
10587c478bd9Sstevel@tonic-gate 
105918188661Ssonam gupta - Sun Microsystems - Bangalore India 	if (STREQU(dest, fromdest)) {
106018188661Ssonam gupta - Sun Microsystems - Bangalore India 		mputm(md, R_MOVE_DEST, MOK, "", 0);
106118188661Ssonam gupta - Sun Microsystems - Bangalore India 		return;
106218188661Ssonam gupta - Sun Microsystems - Bangalore India 	}
10637c478bd9Sstevel@tonic-gate 
106418188661Ssonam gupta - Sun Microsystems - Bangalore India 	for (rp = Request_List; rp != NULL; rp = rp->next) {
106518188661Ssonam gupta - Sun Microsystems - Bangalore India 		if ((STREQU(rp->request->destination, fromdest)) &&
106618188661Ssonam gupta - Sun Microsystems - Bangalore India 		    (!(rp->request->outcome &
106718188661Ssonam gupta - Sun Microsystems - Bangalore India 		    (RS_DONE|RS_CHANGING|RS_NOTIFYING)))) {
106818188661Ssonam gupta - Sun Microsystems - Bangalore India 			if (mv_file(rp, dest) == MOK) {
106918188661Ssonam gupta - Sun Microsystems - Bangalore India 				num_ok++;
107018188661Ssonam gupta - Sun Microsystems - Bangalore India 				continue;
107118188661Ssonam gupta - Sun Microsystems - Bangalore India 			}
107218188661Ssonam gupta - Sun Microsystems - Bangalore India 		}
107318188661Ssonam gupta - Sun Microsystems - Bangalore India 
107418188661Ssonam gupta - Sun Microsystems - Bangalore India 		if (found)
107518188661Ssonam gupta - Sun Microsystems - Bangalore India 			mputm(md, R_MOVE_DEST, MMORERR, found, 0);
107618188661Ssonam gupta - Sun Microsystems - Bangalore India 
107718188661Ssonam gupta - Sun Microsystems - Bangalore India 		found = rp->secure->req_id;
107818188661Ssonam gupta - Sun Microsystems - Bangalore India 	}
107918188661Ssonam gupta - Sun Microsystems - Bangalore India 
108018188661Ssonam gupta - Sun Microsystems - Bangalore India 	if (found)
108118188661Ssonam gupta - Sun Microsystems - Bangalore India 		mputm(md, R_MOVE_DEST, MERRDEST, found, num_ok);
108218188661Ssonam gupta - Sun Microsystems - Bangalore India 	else
108318188661Ssonam gupta - Sun Microsystems - Bangalore India 		mputm(md, R_MOVE_DEST, MOK, "", num_ok);
10847c478bd9Sstevel@tonic-gate }
10857c478bd9Sstevel@tonic-gate 
108618188661Ssonam gupta - Sun Microsystems - Bangalore India /*
108718188661Ssonam gupta - Sun Microsystems - Bangalore India  * reqpath
108818188661Ssonam gupta - Sun Microsystems - Bangalore India  */
10897c478bd9Sstevel@tonic-gate 
10907c478bd9Sstevel@tonic-gate static char *
reqpath(char * file,char ** idnumber)10917c478bd9Sstevel@tonic-gate reqpath(char *file, char **idnumber)
10927c478bd9Sstevel@tonic-gate {
109318188661Ssonam gupta - Sun Microsystems - Bangalore India 	char	*path;
109418188661Ssonam gupta - Sun Microsystems - Bangalore India 	char	*cp;
109518188661Ssonam gupta - Sun Microsystems - Bangalore India 	char	*cp2;
109618188661Ssonam gupta - Sun Microsystems - Bangalore India 
109718188661Ssonam gupta - Sun Microsystems - Bangalore India 	/*
109818188661Ssonam gupta - Sun Microsystems - Bangalore India 	 *	/var/spool/lp/tmp/machine/123-0
109918188661Ssonam gupta - Sun Microsystems - Bangalore India 	 *	/var/spool/lp/temp/123-0
110018188661Ssonam gupta - Sun Microsystems - Bangalore India 	 *	/usr/spool/lp/temp/123-0
110118188661Ssonam gupta - Sun Microsystems - Bangalore India 	 *	/usr/spool/lp/tmp/machine/123-0
110218188661Ssonam gupta - Sun Microsystems - Bangalore India 	 *	123-0
110318188661Ssonam gupta - Sun Microsystems - Bangalore India 	 *	machine/123-0
110418188661Ssonam gupta - Sun Microsystems - Bangalore India 	 *
110518188661Ssonam gupta - Sun Microsystems - Bangalore India 	 *	/var/spool/lp/tmp/machine/123-0 + 123
110618188661Ssonam gupta - Sun Microsystems - Bangalore India 	 */
110718188661Ssonam gupta - Sun Microsystems - Bangalore India 	if (*file == '/') {
110818188661Ssonam gupta - Sun Microsystems - Bangalore India 		/*CONSTCOND*/
110918188661Ssonam gupta - Sun Microsystems - Bangalore India 		if (STRNEQU(file, Lp_Spooldir, strlen(Lp_Spooldir)))
111018188661Ssonam gupta - Sun Microsystems - Bangalore India 			cp = file + strlen(Lp_Spooldir) + 1;
111118188661Ssonam gupta - Sun Microsystems - Bangalore India 		else {
111218188661Ssonam gupta - Sun Microsystems - Bangalore India 			if (STRNEQU(file, "/usr/spool/lp", 13))
111318188661Ssonam gupta - Sun Microsystems - Bangalore India 				cp = file + strlen("/usr/spool/lp") + 1;
111418188661Ssonam gupta - Sun Microsystems - Bangalore India 			else {
111518188661Ssonam gupta - Sun Microsystems - Bangalore India 				*idnumber = NULL;
111618188661Ssonam gupta - Sun Microsystems - Bangalore India 				return (NULL);
111718188661Ssonam gupta - Sun Microsystems - Bangalore India 			}
111818188661Ssonam gupta - Sun Microsystems - Bangalore India 		}
111918188661Ssonam gupta - Sun Microsystems - Bangalore India 
112018188661Ssonam gupta - Sun Microsystems - Bangalore India 		if (STRNEQU(cp, "temp", 4)) {
112118188661Ssonam gupta - Sun Microsystems - Bangalore India 			cp += 5;
112218188661Ssonam gupta - Sun Microsystems - Bangalore India 			path = makepath(Local_System, cp, NULL);
112318188661Ssonam gupta - Sun Microsystems - Bangalore India 		}
112418188661Ssonam gupta - Sun Microsystems - Bangalore India 		else
112518188661Ssonam gupta - Sun Microsystems - Bangalore India 			path = Strdup(cp);
112618188661Ssonam gupta - Sun Microsystems - Bangalore India 	}
11277c478bd9Sstevel@tonic-gate 	else
11287c478bd9Sstevel@tonic-gate 	{
112918188661Ssonam gupta - Sun Microsystems - Bangalore India 		if (strchr(file, '/'))
113018188661Ssonam gupta - Sun Microsystems - Bangalore India 			path = makepath(file, NULL);
113118188661Ssonam gupta - Sun Microsystems - Bangalore India 		else
113218188661Ssonam gupta - Sun Microsystems - Bangalore India 			path = makepath(Local_System, file, NULL);
11337c478bd9Sstevel@tonic-gate 	}
113418188661Ssonam gupta - Sun Microsystems - Bangalore India 
113518188661Ssonam gupta - Sun Microsystems - Bangalore India 	cp = strrchr(path, '/');
113618188661Ssonam gupta - Sun Microsystems - Bangalore India 	cp++;
113718188661Ssonam gupta - Sun Microsystems - Bangalore India 	if ((cp2 = strrchr(cp, '-')) == NULL)
113818188661Ssonam gupta - Sun Microsystems - Bangalore India 		*idnumber = Strdup(cp);
11397c478bd9Sstevel@tonic-gate 	else
114018188661Ssonam gupta - Sun Microsystems - Bangalore India 	{
114118188661Ssonam gupta - Sun Microsystems - Bangalore India 		*cp2 = '\0';
114218188661Ssonam gupta - Sun Microsystems - Bangalore India 		*idnumber = Strdup(cp);
114318188661Ssonam gupta - Sun Microsystems - Bangalore India 		*cp2 = '-';
114418188661Ssonam gupta - Sun Microsystems - Bangalore India 	}
114518188661Ssonam gupta - Sun Microsystems - Bangalore India 
114618188661Ssonam gupta - Sun Microsystems - Bangalore India 	return (path);
11477c478bd9Sstevel@tonic-gate }
114845916cd2Sjpk 
114945916cd2Sjpk /*
1150da6c28aaSamw  * The client is sending a peer connection to retrieve label information
115145916cd2Sjpk  * from.  This is used in the event that the client is an intermediary for
115245916cd2Sjpk  * the actual requestor in a Trusted environment.
115345916cd2Sjpk  */
115418188661Ssonam gupta - Sun Microsystems - Bangalore India void
s_pass_peer_connection(char * m,MESG * md)115518188661Ssonam gupta - Sun Microsystems - Bangalore India s_pass_peer_connection(char *m, MESG *md)
115645916cd2Sjpk {
115745916cd2Sjpk 	short	status = MTRANSMITERR;
115845916cd2Sjpk 	char	*dest;
115945916cd2Sjpk 	struct strrecvfd recv_fd;
116045916cd2Sjpk 
116145916cd2Sjpk 	(void) getmessage(m, S_PASS_PEER_CONNECTION);
116245916cd2Sjpk 	syslog(LOG_DEBUG, "s_pass_peer_connection()");
116345916cd2Sjpk 
1164*e4fb8a5fSToomas Soome 	memset(&recv_fd, 0, sizeof (recv_fd));
116545916cd2Sjpk 	if (ioctl(md->readfd, I_RECVFD, &recv_fd) == 0) {
116645916cd2Sjpk 		int fd = recv_fd.fd;
116745916cd2Sjpk 
116845916cd2Sjpk 		if (get_peer_label(fd, &md->slabel) == 0) {
116945916cd2Sjpk 			if (md->admin == 1)
117045916cd2Sjpk 				md->admin = -1; /* turn off query privilege */
117145916cd2Sjpk 			status = MOK;
117245916cd2Sjpk 		}
117345916cd2Sjpk 
117445916cd2Sjpk 		close(fd);
117545916cd2Sjpk 	}
117645916cd2Sjpk 
117745916cd2Sjpk 	mputm(md, R_PASS_PEER_CONNECTION, status);
117845916cd2Sjpk }
1179