6591929 lp prints postscript source from standard input
authorjacobs
Fri, 01 Aug 2008 11:46:18 -0700
changeset 7253 39650c3caeca
parent 7252 1a0a49343380
child 7254 444cb228ad69
6591929 lp prints postscript source from standard input 6720404 libprint contains a bunch of dead code 6723892 lpstat cores with the queues created with the "-s ipp://" or "-s lpd://" options 6724379 Crash when printing use firefox 3 in papiJobStreamOpen 6727979 printing fails due memory corruption in psm-lpsched.so 6729885 many lpd-port processes let remote printing nearly hang 6731181 pmodes complains about /var/cache/cups in sfw build 6732289 print-service(1m) should know when it's launched from the desktop.
deleted_files/usr/src/lib/print/libprint/common/job.c
deleted_files/usr/src/lib/print/libprint/common/job.h
deleted_files/usr/src/lib/print/libprint/common/misc.c
deleted_files/usr/src/lib/print/libprint/common/misc.h
deleted_files/usr/src/lib/print/libprint/common/network.c
deleted_files/usr/src/lib/print/libprint/common/network.h
usr/src/cmd/lp/lib/papi/job.c
usr/src/cmd/lp/model/netpr/Makefile
usr/src/cmd/lp/model/netpr/netpr.c
usr/src/cmd/print/bsd-sysv-commands/common.c
usr/src/cmd/print/bsd-sysv-commands/common.h
usr/src/cmd/print/bsd-sysv-commands/lp.c
usr/src/cmd/print/bsd-sysv-commands/lpr.c
usr/src/cmd/print/lpget/lpget.c
usr/src/cmd/print/lpset/lpset.c
usr/src/cmd/print/selector/print-service
usr/src/lib/print/libpapi-common/common/uri.c
usr/src/lib/print/libpapi-dynamic/common/nss.c
usr/src/lib/print/libpapi-lpd/common/lpd-job.c
usr/src/lib/print/libpapi-lpd/common/lpd-port.c
usr/src/lib/print/libprint/Makefile.com
usr/src/lib/print/libprint/common/job.c
usr/src/lib/print/libprint/common/job.h
usr/src/lib/print/libprint/common/llib-lprint
usr/src/lib/print/libprint/common/mapfile-vers
usr/src/lib/print/libprint/common/misc.c
usr/src/lib/print/libprint/common/misc.h
usr/src/lib/print/libprint/common/network.c
usr/src/lib/print/libprint/common/network.h
usr/src/lib/print/libprint/common/ns.c
usr/src/lib/print/libprint/common/ns_bsd_addr.c
usr/src/lib/print/libprint/common/nss_convert.c
usr/src/lib/print/libprint/common/nss_ldap.c
usr/src/lib/print/libprint/common/nss_write.c
usr/src/tools/pmodes/exceptions.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deleted_files/usr/src/lib/print/libprint/common/job.c	Fri Aug 01 11:46:18 2008 -0700
@@ -0,0 +1,591 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident	"%Z%%M%	%I%	%E% SMI"
+
+/*LINTLIBRARY*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <stdarg.h>
+#include <unistd.h>
+#include <string.h>
+#include <dirent.h>
+#include <sys/mman.h>
+#include <sys/systeminfo.h>
+#include <syslog.h>
+#include <errno.h>
+#include <libintl.h>
+#include <grp.h>
+
+#include <job.h>
+#include <misc.h>
+#include <list.h>
+
+
+#define	MAX_RETRIES	(5)
+
+static char *_control_file_prefix =	CONTROL_FILE_PREFIX;
+static char *_xfer_file_prefix =	XFER_FILE_PREFIX;
+
+
+/*
+ *  _job_unlink_data_file() will unlink the path for the jobfile passed in.
+ *	this is only to be used with job_destroy() so it can iterate through
+ *	the job_df_list.
+ */
+static int
+_job_unlink_data_file(jobfile_t *file)
+{
+	syslog(LOG_DEBUG, "_job_unlink_data_file(%s)",
+		((file != NULL) ? file->jf_spl_path : "NULL"));
+	if (file && file->jf_spl_path)
+		return (unlink(file->jf_spl_path));
+	else
+		return (-1);
+}
+
+/*
+ *
+ */
+static void
+_job_file_free(jobfile_t *file)
+{
+	if (file == NULL)
+		return;
+	if (file->jf_spl_path != NULL) free(file->jf_spl_path);
+	if (file->jf_src_path != NULL) free(file->jf_src_path);
+	if (file->jf_name != NULL)	free(file->jf_name);
+	if (file->jf_data != NULL) {
+		if (file->jf_mmapped)
+			(void) munmap(file->jf_data, file->jf_size);
+		else
+			free(file->jf_data);
+	}
+	free(file);
+}
+
+
+/*
+ *
+ */
+static void
+_vjob_file_free(jobfile_t *file)
+{
+	_job_file_free(file);
+}
+
+
+/*
+ *  job_free() frees up memory mmapped for malloced
+ *	being used by the structure.
+ */
+void
+job_free(job_t *job)
+{
+	if (job == NULL)
+		return;
+
+	syslog(LOG_DEBUG, "job_free(%d, %s, %s)", job->job_id,
+		(job->job_printer ? job->job_printer : "NULL"),
+		(job->job_server ? job->job_server : "NULL"));
+
+	if (job->job_printer) free(job->job_printer);
+	if (job->job_server) free(job->job_server);
+	if (job->job_user) free(job->job_user);
+	if (job->job_host) free(job->job_host);
+	if (job->job_cf)
+		_job_file_free(job->job_cf);
+	(void) list_iterate((void *)job->job_df_list, (VFUNC_T)_vjob_file_free);
+
+	if (job->job_df_list)
+		free(job->job_df_list);
+
+	if (job->job_spool_dir)
+		free(job->job_spool_dir);
+
+	free(job);
+}
+void
+job_destroy(job_t *job)
+{
+	char	*name = NULL;
+	jobfile_t *cf;
+
+	if (job == NULL)
+		return;
+
+	syslog(LOG_DEBUG, "job_destroy(%d, %s, %s)", job->job_id,
+		job->job_printer, job->job_server);
+	if (chdir(job->job_spool_dir) < 0)
+		return;
+	(void) list_iterate((void *)job->job_df_list,
+			(VFUNC_T)_job_unlink_data_file);
+
+	/* lose privilege temporarily */
+	(void) seteuid(get_user_id(job->job_user));
+
+	if ((cf = job->job_cf) != NULL) {
+		for (name = cf->jf_data; name != NULL;
+				name = strchr(name, '\n')) {
+			if (name[0] == '\n')
+				name++;
+			if (name[0] == CF_UNLINK) {
+				struct stat st;
+				char	*path = strcdup(&name[1], '\n'),
+					*p;
+
+				if (stat(path, &st) < 0) {
+					free(path);
+					continue;
+				}
+
+				if (st.st_uid == getuid()) {
+					(void) unlink(path);
+					free(path);
+					continue;
+				}
+
+				p = strdup(path);
+				if ((p = strrchr(p, '/')) != NULL)
+					*++p = NULL;
+
+				if (access(p, W_OK) == 0)
+					(void) unlink(path);
+				free(path);
+			}
+		}
+	}
+	(void) seteuid(0); /* get back privilege */
+
+	(void) unlink(cf->jf_src_path);
+	(void) _job_unlink_data_file(cf);
+	job_free(job);
+}
+
+static int
+get_job_from_cfile(jobfile_t *file, char *cFile, char *xFile, job_t *tmp)
+{
+	jobfile_t *file1;
+	int	n_cnt;
+	char	*p, *cfp;
+
+	/* map in the control data */
+	if ((file->jf_size = map_in_file(cFile, &file->jf_data, 0)) <= 0) {
+		syslog(LOG_INFO, "could not read control file (%s): %m, "
+		    "canceling %d destined for %s:%s",
+		    (file->jf_spl_path ? file->jf_spl_path:"NULL"),
+		    tmp->job_id,
+		    (tmp->job_server ? tmp->job_server : "NULL"),
+		    (tmp->job_printer ? tmp->job_printer : "NULL"));
+		return (0);
+	}
+	file->jf_mmapped = 1;
+	tmp->job_cf = file;
+
+	/* look for usr, host, & data files */
+
+	/*
+	 * Bugid 4137904 - "File Name" can be
+	 * anywhere in control file.
+	 * Bugid 4179341 - "File Name" can be missing
+	 * in control file.
+	 * Keep a separate pointer to the control file.
+	 * When a CF_UNLINK entry is found use the second
+	 * pointer to search for a corresponding 'N' entry.
+	 * The behavior is to associate the first CF_UNLINK
+	 * entry with the first 'N' entry and so on.
+	 * Note: n_cnt is only used to determine if we
+	 *	should test for 'N' at the beginning of
+	 *	the file.
+	 */
+	cfp = file->jf_data;
+	n_cnt = 0;
+	for (p = file->jf_data - 1; p != NULL; p = strchr(p, '\n')) {
+		switch (*(++p)) {
+		case CF_USER:
+			tmp->job_user = strcdup(++p, '\n');
+			break;
+		case CF_HOST:
+			tmp->job_host = strcdup(++p, '\n');
+			break;
+		case CF_UNLINK:
+			if ((file1 = calloc(1, sizeof (*file))) == NULL) {
+				syslog(LOG_DEBUG, "cf_unlink: calloc() failed");
+				munmap(file->jf_data, file->jf_size);
+				file->jf_mmapped = 0;
+				return (0);
+			}
+			file1->jf_src_path = strdup(xFile);
+			file1->jf_spl_path = strcdup(++p, '\n');
+			file1->jf_size = file_size(file1->jf_spl_path);
+
+			if (cfp != NULL) {
+				/*
+				 * Beginning of file. Check for first
+				 * character == 'N'
+				 */
+				if ((n_cnt == 0) && (*cfp == 'N')) {
+					cfp++;
+					n_cnt++;
+				} else {
+					cfp = strstr(cfp, "\nN");
+					if (cfp != NULL) {
+						cfp += 2;
+						n_cnt++;
+					}
+				}
+				if (cfp != NULL) {
+					file1->jf_name = strcdup(cfp, '\n');
+					/*
+					 * Move cfp to end of line or
+					 * set to NULL if end of file.
+					 */
+					cfp = strchr(cfp, '\n');
+				}
+			}
+			tmp->job_df_list = (jobfile_t **)list_append((void **)
+			    tmp->job_df_list, (void *)file1);
+			break;
+		}
+	}
+	if (tmp->job_df_list == NULL) {
+		munmap(file->jf_data, file->jf_size);
+		file->jf_mmapped = 0;
+		return (0);
+	}
+
+	return (1);
+}
+
+/*
+ *  job_retrieve() will retrieve the disk copy of a job associated with the
+ *	transfer file name passed in.  It returns a pointer to a job structure
+ *	or a NULL if the job was not on disk.
+ */
+job_t *
+job_retrieve(char *xFile, char *spool)
+{
+	int	retry_cnt = 0;
+	char	*s;
+	jobfile_t *file;
+	char 	cFile[BUFSIZ];
+	char	buf[BUFSIZ];
+	int	fd;
+	flock_t flk;
+	job_t	*tmp;
+
+	syslog(LOG_DEBUG, "job_retrieve(%s)", xFile);
+	if ((tmp = (job_t *)calloc(1, sizeof (*tmp))) == NULL) {
+		return (NULL);
+	}
+
+	if ((file = calloc(1, sizeof (*file))) == NULL) {
+		free(tmp);
+		return (NULL);
+	}
+
+	flk.l_type = F_RDLCK;
+	flk.l_whence = 1;
+	flk.l_start = 0;
+	flk.l_len = 0;
+
+	(void) memset(buf, NULL, sizeof (buf));
+	/* get job id, from binding file name */
+	(void) strlcpy(buf, xFile + strlen(_xfer_file_prefix) + 1,
+	    sizeof (buf));
+
+	buf[3] = NULL;
+	tmp->job_id = atoi(buf);
+
+	/* Construct data file and control file names */
+	(void) strlcpy(cFile, _control_file_prefix, sizeof (cFile));
+	(void) strlcat(cFile, xFile + strlen(_xfer_file_prefix),
+	    sizeof (cFile));
+
+	/* remove data file and control file whenever xFile is removed */
+	if ((fd = open(xFile, O_RDONLY)) < 0) {
+		syslog(LOG_DEBUG, "job_retrieve(%s) open failed errno=%d",
+		    xFile, errno);
+		if (get_job_from_cfile(file, cFile, xFile, tmp))
+			job_destroy(tmp);
+		free(file);
+		free(tmp);
+		(void) unlink(xFile);
+		(void) unlink(cFile);
+		return (NULL);
+	}
+
+	/*
+	 * If failed to get a lock on the file, just return NULL. It will
+	 * be retried later.
+	 */
+	if ((fcntl(fd, F_SETLK, &flk)) < 0) {
+		syslog(LOG_DEBUG, "job_retrieve(%s) lock failed errno=%d",
+		    xFile, errno);
+		close(fd);
+		free(file);
+		free(tmp);
+		return (NULL);
+	}
+
+	/*
+	 * Retry a few times if we failed to read or read returns 0, just
+	 * to make sure we tried hard before giving up. In practice,
+	 * there were cases of read() returning 0. To handle that
+	 * scenario just try a few times.
+	 */
+	for (retry_cnt = 0; retry_cnt < MAX_RETRIES; retry_cnt++) {
+		if ((read(fd, buf, sizeof (buf))) > 0) {
+			close(fd);
+			if ((s = strtok(buf, ":\n")) != NULL)
+				tmp->job_server = strdup(s);
+			if ((s = strtok(NULL, ":\n")) != NULL)
+				tmp->job_printer = strdup(s);
+			syslog(LOG_DEBUG, "job_retrieve(%s) success - %s:%s",
+			    xFile, tmp->job_server, tmp->job_printer);
+			break;
+		}
+	}
+	/*
+	 * If failed to read after MAX_RETRIES, return NULL and remove xFile,
+	 * and cFile.
+	 */
+	if (retry_cnt == MAX_RETRIES) {
+		syslog(LOG_DEBUG, "job_retrieve(%s) unsuccessful", xFile);
+		if (get_job_from_cfile(file, cFile, xFile, tmp))
+			job_destroy(tmp);
+		free(file);
+		free(tmp);
+		(void) unlink(xFile);
+		(void) unlink(cFile);
+		return (NULL);
+	}
+
+	file->jf_src_path = strdup(xFile);
+	file->jf_spl_path = strdup(cFile);
+
+	if (!get_job_from_cfile(file, cFile, xFile, tmp)) {
+		(void) unlink(file->jf_spl_path);  /* control file */
+		(void) unlink(file->jf_src_path);  /* binding file */
+		free(file->jf_src_path);
+		free(file->jf_spl_path);
+		free(file);
+		free(tmp);
+		return (NULL);
+	}
+
+	tmp->job_spool_dir = strdup(spool);
+	return (tmp);
+}
+
+
+/*
+ * job_compar() compare 2 jobs for creation time ordering
+ */
+static int
+job_compar(job_t **j1, job_t **j2)
+{
+	int	server;
+	int	printer;
+	struct stat	s1,
+			s2;
+	jobfile_t	*f1 = (*j1)->job_cf,
+			*f2 = (*j2)->job_cf;
+
+	/*
+	 * If there is a null value, assume the job submitted remotely.
+	 * Jobs submitted remotely take precedence over those submitted
+	 * from the server.
+	 */
+	if (((*j1)->job_server) == NULL || ((*j1)->job_printer) == NULL ||
+				((*j1)->job_cf) == NULL)
+		return (-1);
+
+	else if ((*j2)->job_server == NULL || (*j2)->job_printer == NULL ||
+				(*j2)->job_cf == NULL)
+		return (1);
+
+	server = strcmp((*j1)->job_server, (*j2)->job_server);
+	printer = strcmp((*j1)->job_printer, (*j2)->job_printer);
+
+	if (server != 0)
+		return (server);
+	if (printer != 0)
+		return (printer);
+
+	if ((stat(f1->jf_spl_path, &s1) == 0) &&
+	    (stat(f2->jf_spl_path, &s2) == 0))
+		return (s1.st_ctime - s2.st_ctime);
+
+	return (0);
+}
+
+
+/*
+ *  job_list_append() reads all of the jobs associated with the printer passed
+ *	in and appends them to the list of jobs passed in.  The returned result
+ *	is a new list of jobs containing all jobs passed in and jobs for the
+ *	printer specified.  If the printer is NULL, all jobs for all printers
+ *	are added to the list.
+ */
+job_t **
+job_list_append(job_t **list, char *printer, char *server, char *spool)
+{
+	struct dirent *d;
+	DIR	*dirp;
+	job_t	*job;
+	int	i, found = 0;
+
+	syslog(LOG_DEBUG, "job_list_append(0x%x, %s, %s)", list,
+		((printer != NULL) ? printer : "NULL"),
+		    ((server != NULL) ? server : "NULL"));
+
+	/*
+	 * 4239765 - in.lpd segfaults performing strcmp()
+	 * in job_list_append()
+	 */
+	if (server == NULL) {
+		server = "";
+	}
+
+	if ((dirp = opendir(spool)) == NULL)
+		return (NULL);
+
+	/* should use scandir */
+	while ((d = readdir(dirp)) != NULL) {
+		if (strncmp(d->d_name, _xfer_file_prefix,
+				strlen(_xfer_file_prefix)) != 0)
+			continue;
+		if ((job = job_retrieve(d->d_name, spool)) == NULL)
+			continue;
+		syslog(LOG_DEBUG, "job_printer is (%s:%s)",
+			job->job_printer, job->job_server);
+
+		found = 0;
+
+		if ((printer == NULL) ||
+		    ((strcmp(printer, job->job_printer) == 0) &&
+			(strcmp(server, job->job_server) == 0))) {
+			if (list) {
+			    for (i = 0; list[i] != NULL; i++) {
+				if ((list[i]->job_cf != NULL) &&
+				    (job->job_cf != NULL) &&
+				    (strcmp(list[i]->job_cf->jf_spl_path,
+				    job->job_cf->jf_spl_path) == 0))
+					found = 1;
+			    }
+			} /* if (list) */
+
+			if (!found)
+				list = (job_t **)list_append((void **)list,
+				    (void *)job);
+		}
+	} /* while */
+
+	/* count the length of the list for qsort() */
+	if (list) {
+		for (i = 0; list[i] != NULL; i++)
+			;
+
+		qsort(list, i, sizeof (job_t *),
+		    (int(*)(const void *, const void *))job_compar);
+	}
+	(void) closedir(dirp);
+	return (list);
+}
+
+
+
+/*
+ *
+ * Shared routines for Canceling jobs.
+ *
+ */
+
+
+/*
+ *  vjob_match_attribute() checks to see if the attribute passed in
+ *	matches the the user or id of the job passed in via stdargs.  This is
+ *	intended for use with list_iterate().
+ */
+int
+vjob_match_attribute(char *attribute, va_list ap)
+{
+	job_t *job = va_arg(ap, job_t *);
+
+	if ((strcmp(attribute, job->job_user) == 0) ||
+	    (job->job_id == atoi(attribute)))
+		return (1);
+	else
+		return (0);
+}
+
+
+/*
+ *  vjob_job() determines if the job passed in is for the printer and server
+ *	of the cancel request, and if it is from the user requesting or the
+ *	user is root, it checsk the attributes.  If the job matches all of this
+ *	it cancels the job and prints a message.  It is intented to be called
+ *	by list_iterate().
+ */
+int
+vjob_cancel(job_t *job, va_list ap)
+{
+	int killed_process = 0;
+	int lock;
+	char	*user = va_arg(ap, char *),
+		*printer = va_arg(ap, char *),
+		*server = va_arg(ap, char *),
+		**list = va_arg(ap, char **);
+
+	syslog(LOG_DEBUG, "vjob_cancel((%s, %s, %d), %s, %s, %s)",
+		job->job_printer, job->job_server, job->job_id, user, printer,
+		server);
+	if (((strcmp(user, "root") == 0) ||
+	    (strcmp(user, job->job_user) == 0)) &&
+	    ((strcmp(printer, job->job_printer) == 0) &&
+	    (strcmp(server, job->job_server) == 0))) {
+		if (list_iterate((void **)list,
+		    (VFUNC_T)vjob_match_attribute, job) != 0) {
+			while ((lock = get_lock(job->job_cf->jf_src_path,
+						0)) < 0) {
+				(void) kill_process(job->job_cf->jf_src_path);
+				killed_process = 1;
+			}
+			job_destroy(job);
+			syslog(LOG_DEBUG, "\t%s-%d: canceled\n", printer,
+				job->job_id);
+			(void) printf(
+			    (char *)gettext("\t%s-%d: canceled\n"), printer,
+			    (int)job->job_id);
+			close(lock);
+		}
+	}
+	return (killed_process);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deleted_files/usr/src/lib/print/libprint/common/job.h	Fri Aug 01 11:46:18 2008 -0700
@@ -0,0 +1,138 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef	_JOB_H
+#define	_JOB_H
+
+#pragma ident	"%Z%%M%	%I%	%E% SMI"
+
+#include <sys/va_list.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ *	Sequence number space
+ */
+#define	JOB_ID_START		   0
+#define	JOB_ID_END		   999
+
+/*
+ *	Job related files
+ */
+#define	SEQUENCE_FILE		".seq"  /* sequence numbers */
+#define	TEMP_FILE_PREFIX	"tf"    /* printer:server */
+#define	XFER_FILE_PREFIX	"xf"    /* printer:server */
+#define	CONTROL_FILE_PREFIX	"cf"    /* job control data */
+#define	DATA_FILE_PREFIX	"df"    /* job data file */
+
+/*
+ *	RFC-1179 Control File Primatives
+ */
+#define	CF_CLASS	'C'	 /* C(ClassName)\n - for banner page */
+#define	CF_HOST		'H'	 /* H(Hostname)\n - host submitting job */
+#define	CF_INDENT	'I'	 /* I(indent)\n - # of spaces for 'f' */
+#define	CF_JOBNAME	'J'	 /* J(Jobname)\n - name of job for banner */
+#define	CF_PRINT_BANNER	'L'	 /* L[User]\n - User name on burst page */
+#define	CF_MAIL		'M'	 /* M(user)\n - User to mail when done */
+#define	CF_SOURCE_NAME	'N'	 /* N(name)\n - source of data file */
+#define	CF_USER		'P'	 /* P(name)\n - requesting user */
+#define	CF_SYMLINK	'S'	 /* S(device) (inode)\n - foget it */
+#define	CF_TITLE	'T'	 /* T(title)\n - for pr */
+#define	CF_UNLINK	'U'	 /* U(file)\n - unlink file */
+#define	CF_WIDTH	'W'	 /* W(width)\n - column width */
+#define	CF_FONT_TROFF_R	'1'	 /* 1(file)\n - file with Times Roman font */
+#define	CF_FONT_TROFF_I	'2'	 /* 2(file)\n - file with Times Italic font */
+#define	CF_FONT_TROFF_B	'3'	 /* 3(file)\n - file with Times Bold font */
+#define	CF_FONT_TROFF_S	'4'	 /* 4(file)\n - file with Times Special font */
+#define	CF_PRINT_CIF	'c'	 /* c(file)\n - print/plot file as CIF data */
+#define	CF_PRINT_DVI	'd'	 /* d(file)\n - print file as DVI data */
+#define	CF_PRINT_ASCII	'f'	 /* f(file)\n - print file as ASCII */
+#define	CF_PRINT_PLOT	'g'	 /* g(file)\n - print file as plot data */
+#define	CF_KERBERIZED	'k'	 /* k...\n - for Kerberos */
+#define	CF_PRINT_RAW	'l'	 /* l(file)\n - print file dammit */
+#define	CF_PRINT_DROFF	'n'	 /* n(file)\n - print file as ditroff output */
+#define	CF_PRINT_PS	'o'	 /* o(file)\n - print file as PostScript */
+#define	CF_PRINT_PR	'p'	 /* p(file)\n - print file thru "pr" */
+#define	CF_PRINT_FORT	'r'	 /* r(file)\n - print file as fortran */
+#define	CF_PRINT_TROFF	't'	 /* n(file)\n - print file as troff output */
+#define	CF_PRINT_RAS	'v'	 /* v(file)\n - print file as raster image */
+#define	CF_PRINT_PLDM	'z'	 /* z...\n - for Palladium ??? */
+
+/*
+ *	Solaris 2.X LP - BSD protocol extensions
+ */
+#define	CF_SYSV_OPTION  'O'		/* for SVR4 LP '-o' option */
+#define	CF_SYSV_FEATURE '5'		/* for SVR4 LP features */
+#define	CF_SYSV_FORM		'f'	/* for SVR4 Forms */
+#define	CF_SYSV_HANDLING	'H'	/* for SVR4 Handling */
+#define	CF_SYSV_NOTIFICATION	'p'	/* for SVR4 Notification */
+#define	CF_SYSV_PAGES		'P'	/* for SVR4 Pages */
+#define	CF_SYSV_PRIORITY	'q'	/* for SVR4 Priority */
+#define	CF_SYSV_CHARSET		'S'	/* for SVR4 Charset */
+#define	CF_SYSV_TYPE		'T'	/* for SVR4 Type */
+#define	CF_SYSV_MODE		'y'	/* for SVR4 Mode */
+
+
+typedef struct _jobfile jobfile_t;
+typedef struct _job job_t;
+
+struct _jobfile {
+	char	*jf_spl_path;	/* df file */
+	char	*jf_src_path;	/* source file */
+	char	*jf_name;	/* title/name */
+	char	*jf_data;	/* ptr to mmapped file */
+	long	jf_size;	/* size of data */
+	char	jf_mmapped;	/* is this mmapped or malloced */
+};
+
+struct _job {
+	int	job_id;
+	char	*job_printer;
+	char	*job_server;
+	char	*job_user;
+	char	*job_host;
+	char	*job_spool_dir;
+	jobfile_t *job_cf;
+	char 	job_df_next;
+	jobfile_t **job_df_list;
+};
+
+
+extern int	job_store(job_t *job);
+extern void	job_free(job_t *job);
+extern void	job_destroy(job_t *job);
+extern job_t	*job_retrieve(char *xfer_file, char *spool);
+extern job_t	**job_list_append(job_t **list, char *printer,
+					char *server, char *spool);
+extern int	vjob_match_attribute(char *attribute, __va_list ap);
+extern int	vjob_cancel(job_t *job, __va_list ap);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !_JOB_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deleted_files/usr/src/lib/print/libprint/common/misc.c	Fri Aug 01 11:46:18 2008 -0700
@@ -0,0 +1,433 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident	"%Z%%M%	%I%	%E% SMI"
+
+/*LINTLIBRARY*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <signal.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <string.h>
+#include <pwd.h>
+#include <sys/mman.h>
+#include <time.h>
+#include <syslog.h>
+#include <errno.h>
+
+#include <misc.h>
+#include <job.h>
+#include <list.h>
+
+
+/*
+ *	info about spool directory that we validate and fix
+ */
+#define	ROOT_UID	0
+#define	LP_GID		8
+#define	SPOOL_MODE	(S_IFDIR|S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH)
+
+/*ARGSUSED*/
+int
+check_client_spool(char *printer)
+{
+	char *dir = SPOOL_DIR;
+	struct stat st;
+
+	if ((stat(dir, &st) < 0) && (errno == ENOENT)) {
+		syslog(LOG_ERR, "no spool dir, creating %s", dir);
+		if (mkdir(dir, 0755) < 0) {
+			syslog(LOG_ERR, "mkdir(%s): %m", dir);
+			return (-1);
+		}
+		if (chown(dir, ROOT_UID, LP_GID) < 0) {
+			syslog(LOG_ERR, "chown(%s): %m", dir);
+			return (-1);
+		}
+		return (0);
+	}
+	if ((st.st_uid != ROOT_UID) || (st.st_gid != LP_GID)) {
+		syslog(LOG_ERR,
+			"correcting spool directory owner/group (was %d/%d)",
+			st.st_uid, st.st_gid);
+		if (chown(dir, ROOT_UID, LP_GID) < 0) {
+			syslog(LOG_ERR, "chown(%s): %m", dir);
+			return (-1);
+		}
+	}
+	if (st.st_mode != (S_IFDIR | SPOOL_MODE)) {
+		syslog(LOG_ERR,
+			"spool dir (%s), incorrect permission (%0), correcting",
+			dir, st.st_mode);
+		if (chmod(dir, 0755) < 0) {
+			syslog(LOG_ERR, "chmod(%s): %m", dir);
+			return (-1);
+		}
+	}
+	return (0);
+}
+
+int
+get_lock(char *name, int write_pid)
+{
+	int	fd;
+
+	syslog(LOG_DEBUG, "get_lock(%s, %d)", ((name != NULL) ? name : "NULL"),
+		write_pid);
+	if ((fd = open(name, O_RDWR|O_CREAT, 0640)) < 0)
+		return (fd);
+
+	if (lockf(fd, F_TLOCK, 0) < 0) {
+		close(fd);
+		return (-1);
+	}
+
+	if (write_pid != 0) {
+		char	pid[16];
+
+		if (ftruncate(fd, 0) < 0) {
+			close(fd);
+			return (-1);
+		}
+		if (snprintf(pid, sizeof (pid), "%d\n", (int)getpid())
+			>= sizeof (pid)) {
+			syslog(LOG_ERR, "get_lock: pid buffer overflow");
+			return (-1);
+		}
+		write(fd, pid, strlen(pid));
+	}
+	(void) fsync(fd);
+
+	syslog(LOG_DEBUG, "get_lock(%s, %d) - have lock",
+		((name != NULL) ? name : "NULL"), write_pid);
+	return (fd);
+}
+
+uid_t
+get_user_id(char *name)
+{
+	struct passwd *p = NULL;
+
+	if (name == NULL)
+		return (-1);
+	if ((p = getpwnam(name)) != NULL)
+		return (p->pw_uid);
+	else if ((p = getpwnam("nobody")) != NULL)
+		return (p->pw_uid);
+	else
+		return (-2);
+}
+
+
+/*
+ *  get_user_name()
+ */
+char *
+get_user_name()
+{
+	struct passwd *p = NULL;
+
+	if ((p = getpwuid(getuid())) != NULL)
+		return (strdup(p->pw_name));
+	else
+		return (strdup("unknown"));
+}
+
+
+
+/*
+ *  strcdup() - duplicate a string up to the first occurence of a character
+ */
+char *
+strcdup(char *p, char c)
+{
+	char	*q,
+		*r;
+
+	if (p == NULL)
+		return (NULL);
+	if ((c == NULL) || ((q = strchr(p, c)) == NULL))
+		return (strdup(p));
+
+	if ((r = malloc((q - p) + 1)) != NULL)
+		(void) strlcpy(r, p, ((q - p) + 1));
+	return (r);
+}
+
+
+/*
+ *	Should be obvious
+ */
+char *
+strndup(char *s, int l)
+{
+	char *t;
+
+	if ((s == NULL) || (l < 1))
+		return (NULL);
+
+	if ((t = malloc(l + 1)) != NULL)
+		(void) strlcpy(t, s, (l + 1));
+	return (t);
+}
+
+
+/*
+ *  file_size() - need I say more
+ */
+int
+file_size(char *path)
+{
+	struct stat st;
+
+	if (stat(path, &st) < 0)
+		return (-1);
+	else
+		return (st.st_size);
+}
+
+
+/*
+ *  copy_file() - need I say more
+ */
+int
+copy_file(char *src, char *dst)
+{
+	char	*buf;
+	int	size;
+
+	syslog(LOG_DEBUG, "copy_file(%s, %s)", ((src != NULL) ? src : "NULL"),
+		((dst != NULL) ? dst : "NULL"));
+
+	if ((src == NULL) || (dst == NULL))
+		return (-1);
+
+	if ((size = map_in_file(src, &buf, 1)) < 0)
+		return (-1);
+	if (write_buffer(dst, buf, size) < 0) {
+		(void) munmap(buf, size);
+		return (-1);
+	}
+
+	(void) munmap(buf, size);
+	return (0);
+}
+
+int
+backup_file(char *name)
+{
+	char buf[BUFSIZ];
+
+	if (snprintf(buf, sizeof (buf), "%s-", name) >= sizeof (buf)) {
+		syslog(LOG_ERR, "libprint:backup_file: buffer overrun");
+		return (-1);
+	}
+	return (copy_file(name, buf));
+}
+
+/*
+ *  map_in_file() - mmaps in a file into a buffer *buf.  returns the size of
+ *	the mmapped buffer.
+ */
+int
+map_in_file(const char *file, char **buf, int as_me)
+{
+	struct stat st;
+	int	fd;
+
+	syslog(LOG_DEBUG, "map_in_file(%s)", (file ? file : "NULL"));
+
+	if (buf == NULL)
+		return (-1);
+
+	if (as_me != 0)
+		seteuid(getuid());	/* if we are suid, lose privilege */
+
+	if ((fd = open(file, O_RDONLY)) < 0)
+		return (-1);
+
+	if (as_me != 0)
+		seteuid(0);	/* if we fail, didn't have privilege before */
+
+	if (fstat(fd, &st) < 0) {
+		close(fd);
+		return (-1);
+	}
+
+	if (st.st_size == 0) {
+		close(fd);
+		*buf = NULL;
+		return (0);
+	}
+
+	if ((*buf = mmap((caddr_t)0, (size_t)st.st_size, PROT_READ,
+			(MAP_PRIVATE | MAP_NORESERVE),
+			fd, (off_t)0)) == MAP_FAILED) {
+		syslog(LOG_ERR, "map_in_file(%s) - mmap:%m",
+			(file ? file : "NULL"));
+		close(fd);
+		return (-1);
+	}
+	close(fd);
+
+	syslog(LOG_DEBUG, "map_in_file(%s) - size(%d), addr(0x%x)",
+		(file ? file : "NULL"), st.st_size, *buf);
+	return (st.st_size);
+}
+
+
+/*
+ *  write_buffer() - writes a buffer in memory out to the file name passed in.
+ *	uses mmap and ftruncate to do this.
+ */
+int
+write_buffer(char *file, char *buf, int len)
+{
+	int	fd;
+	char	*tmp;
+
+	syslog(LOG_DEBUG, "write_buffer(%s, 0x%x, %d)", (file ? file : "NULL"),
+		buf, len);
+
+	if ((fd = open(file, O_CREAT|O_EXCL|O_RDWR, 0640)) < 0)
+		return (-1);
+	if (ftruncate(fd, len) < 0) {
+		close(fd);
+		return (-1);
+	}
+	if ((tmp = mmap((caddr_t)0, (size_t)len, PROT_READ| PROT_WRITE,
+			(MAP_SHARED | MAP_NORESERVE),
+			fd, (off_t)0)) == MAP_FAILED) {
+		syslog(LOG_ERR, "write_buffer(%s, 0x%x, %d) - mmap:%m",
+			(file ? file : "NULL"), buf, len);
+		close(fd);
+		return (-1);
+	}
+	close(fd);
+
+	(void) memcpy(tmp, buf, len);
+	(void) munmap(tmp, len);
+
+	syslog(LOG_DEBUG, "write_buffer(%s, 0x%x, %d) - ok",
+		(file ? file : "NULL"), buf, len);
+
+	return (0);
+}
+
+
+/*
+ *  start_daemon() - check for jobs queued, check if the lock is free.  If
+ *	so, start a daemon either by forking and execing or just execing
+ *	depending on the flag passed in.
+ */
+void
+start_daemon(int do_fork)
+{
+	int	lock;
+	job_t	**jobs = NULL;
+
+	if ((jobs = job_list_append(NULL, NULL, NULL, SPOOL_DIR)) == NULL)
+		return;
+
+	list_iterate((void **)jobs, (VFUNC_T)job_free);
+	free(jobs);
+
+	close(lock = get_lock(MASTER_LOCK, 0));
+	if (lock < 0)
+		return;
+	if (do_fork == 0) {
+		(void) execle("/usr/lib/print/printd", MASTER_NAME, NULL, NULL);
+		syslog(LOG_ERR, "start_daemon() - execl: %m");
+		exit(-1);
+	} else
+		switch (fork()) {
+		case -1:
+			syslog(LOG_ERR, "start_daemon() - fork: %m");
+			exit(-1);
+			/* NOTREACHED */
+		case 0:
+			break;
+		default:
+			(void) execl("/usr/lib/print/printd", MASTER_NAME,
+					NULL);
+			syslog(LOG_ERR, "start_daemon() - execl: %m");
+			exit(-1);
+			/* NOTREACHED */
+		}
+
+}
+
+
+/*
+ *  kill_daemon() - read the master lock file and send SIGTERM to the process
+ *	id stored in the file.
+ */
+int
+kill_process(char *file)
+{
+	int	fd,
+		pid;
+	char	buf[BUFSIZ],
+		*p;
+
+	if ((fd = open(file, O_RDONLY)) < 0)
+		return (-1);
+
+	(void) memset(buf, NULL, sizeof (buf));
+	if (read(fd, buf, sizeof (buf)) <= 0)
+		return (-1);
+
+	if ((p = strchr(buf, '\n')) == NULL) {	/* skip the 1st line */
+		close(fd);
+		return (-1);
+	}
+	pid = atoi(++p);		/* convert the PID */
+
+	if ((pid < 2) || (kill(pid, SIGTERM) < 0)) {
+		close(fd);
+		return (-1);
+	}
+	close(fd);
+	return (0);
+}
+
+
+char **
+strsplit(char *string, char *seperators)
+{
+	char **list = NULL;
+	char *where = NULL;
+	char *element;
+
+	for (element = strtok_r(string, seperators, &where); element != NULL;
+	    element = strtok_r(NULL, seperators, &where))
+		list = (char **)list_append((void **)list, element);
+
+	return (list);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deleted_files/usr/src/lib/print/libprint/common/misc.h	Fri Aug 01 11:46:18 2008 -0700
@@ -0,0 +1,73 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef	_MISC_H
+#define	_MISC_H
+
+#pragma ident	"%Z%%M%	%I%	%E% SMI"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Protocol Defined Requests */
+#define	PRINT_REQUEST		1	/* \1printer\n */
+#define	XFER_REQUEST		2	/* \2printer\n */
+#define	    XFER_CLEANUP	1 	/* \1 */
+#define	    XFER_CONTROL	2	/* \2size name\n */
+#define	    XFER_DATA		3	/* \3size name\n */
+
+#define	SHOW_QUEUE_SHORT_REQUEST 3	/* \3printer [users|jobs ...]\n */
+#define	SHOW_QUEUE_LONG_REQUEST  4	/* \4printer [users|jobs ...]\n */
+#define	REMOVE_REQUEST	    5	/* \5printer person [users|jobs ...]\n */
+
+#define	ACK_BYTE	0
+#define	NACK_BYTE	1
+
+#define	MASTER_NAME	"printd"
+#define	MASTER_LOCK	"/var/spool/print/.printd.lock"
+#define	SPOOL_DIR	"/var/spool/print"
+#define	TBL_NAME	"printers.conf"
+
+
+extern int check_client_spool(char *printer);
+extern int get_lock(char *name, int write_pid);
+extern uid_t get_user_id();
+extern char *get_user_name();
+extern char *strcdup(char *, char);
+extern char *strndup(char *, int);
+extern char **strsplit(char *, char *);
+extern int  file_size(char *);
+extern int  copy_file(char *src, char *dst);
+extern int  map_in_file(const char *name, char **buf, int as_me);
+extern int  write_buffer(char *name, char *buf, int len);
+extern void start_daemon(int do_fork);
+extern int  kill_process(char *file);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _MISC_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deleted_files/usr/src/lib/print/libprint/common/network.c	Fri Aug 01 11:46:18 2008 -0700
@@ -0,0 +1,418 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident	"%Z%%M%	%I%	%E% SMI"
+
+/*LINTLIBRARY*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <stdarg.h>
+#include <unistd.h>
+#include <string.h>
+#include <signal.h>
+#include <sys/mman.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+#include <errno.h>
+#include <syslog.h>
+#include <sys/utsname.h>
+
+#include <network.h>
+#include <misc.h>
+
+static int read_wait_time_sec = 300;
+static int write_wait_time_sec = 10;
+
+/*
+ *	This module implements a set of functions to handle network
+ *	communications.  It attempts to hide any "uglyness" that might be
+ *	necessary for such communications.
+ */
+
+
+/*
+ *  null() is to be used as a signal handler that does nothing.  It is used in
+ *	place of SIG_IGN, because we want the signal to be delivered and
+ *	interupt the current system call.
+ */
+static void
+null(int i)
+{
+	syslog(LOG_DEBUG, "null(%d)", i);
+}
+
+/*
+ *  net_open() opens a tcp connection to the printer port on the host specified
+ *	in the arguments passed in.  If the connection is not made in the
+ *	timeout (in seconds) passed in, an error it returned.  If the host is
+ *	unknown, an error is returned.  If all is well, a file descriptor is
+ *	returned to be used for future communications.
+ */
+int
+net_open(char *host, int timeout)
+{
+	struct hostent *hp;
+	struct servent *sp;
+	struct sockaddr_in6 sin;
+	void (*old_handler)();
+	static struct utsname uts;
+
+	int	s,
+		lport,
+		err,
+		error_num;
+	unsigned timo = 1;
+
+	syslog(LOG_DEBUG, "net_open(%s, %d)", (host != NULL ? host : "NULL"),
+		timeout);
+	/*
+	 * Get the host address and port number to connect to.
+	 */
+	if (host == NULL) {
+		return (-1);
+	}
+
+	(void) memset((char *)&sin, NULL, sizeof (sin));
+	if ((hp = getipnodebyname(host, AF_INET6, AI_DEFAULT,
+		    &error_num)) == NULL) {
+		syslog(LOG_DEBUG|LOG_ERR, "unknown host %s "
+		    "getipnodebyname() returned %d", host, error_num);
+		return (NETWORK_ERROR_HOST);
+	}
+	(void) memcpy((caddr_t)&sin.sin6_addr, hp->h_addr, hp->h_length);
+	sin.sin6_family = hp->h_addrtype;
+	freehostent(hp);
+
+	if ((sp = getservbyname("printer", "tcp")) == NULL) {
+		syslog(LOG_DEBUG|LOG_ERR, "printer/tcp: unknown service");
+		return (NETWORK_ERROR_SERVICE);
+	}
+	sin.sin6_port = sp->s_port;
+
+retry:
+	/*
+	 * Try connecting to the server.
+	 *
+	 * Use 0 as lport means that rresvport_af() will bind to a port in
+	 * the anonymous privileged port range.
+	 */
+	lport = 0;
+	s = rresvport_af(&lport, AF_INET6);
+	if (s < 0)
+		return (NETWORK_ERROR_PORT);
+
+	old_handler = signal(SIGALRM, null);
+	(void) alarm(timeout);
+	if (connect(s, (struct sockaddr *)&sin, sizeof (sin)) < 0) {
+		(void) alarm(0);
+		(void) signal(SIGALRM, old_handler);
+		err = errno;
+		(void) close(s);
+		errno = err;
+		if (errno == EADDRINUSE) {
+			goto retry;
+		}
+		/*
+		 * If connecting to the local system fails, try
+		 * again with "localhost" address instead.
+		 */
+		if (uts.nodename[0] == '\0')
+			(void) uname(&uts);
+		if (strcmp(host, uts.nodename) == 0) {
+			IN6_IPADDR_TO_V4MAPPED(htonl(INADDR_LOOPBACK),
+			    &sin.sin6_addr);
+			sin.sin6_family = AF_INET6;
+			goto retry;
+		}
+		if (errno == ECONNREFUSED && timo <= 16) {
+			(void) sleep(timo);
+			timo *= 2;
+			goto retry;
+		}
+		return (NETWORK_ERROR_UNKNOWN);
+	}
+	(void) alarm(0);
+	(void) signal(SIGALRM, old_handler);
+	return (s);
+}
+
+
+/*
+ *  net_close() closes a TCP connection opened by net_open()
+ */
+int
+net_close(int nd)
+{
+	syslog(LOG_DEBUG, "net_close(%d)", nd);
+	return (close(nd));
+}
+
+/*
+ *  net_read() reads up to the length specified into the buffer supplied from
+ *	the network connection specified
+ */
+int
+net_read(int nd, char *buf, int len)
+{
+	int rc;
+	void (*old_handler)();
+
+	syslog(LOG_DEBUG, "net_read(%d, 0x%x, %d)", nd, buf, len);
+	old_handler = signal(SIGALRM, null);
+	(void) alarm(read_wait_time_sec);
+	rc = read(nd, buf, len);
+	(void) alarm(0);
+	(void) signal(SIGALRM, old_handler);
+	return (rc);
+}
+
+
+/*
+ *  net_write() writes the buffer specified out to the network connection
+ *	supplied.
+ */
+int
+net_write(int nd, char *buf, int len)
+{
+	int rc;
+	void (*old_handler)();
+
+	syslog(LOG_DEBUG, "net_write(%d, 0x%x, %d)", nd, buf, len);
+	old_handler = signal(SIGALRM, null);
+	(void) alarm(write_wait_time_sec);
+	rc = write(nd, buf, len);
+	(void) alarm(0);
+	(void) signal(SIGALRM, old_handler);
+	return (rc);
+}
+
+
+/*
+ *  net_response() reads in a byte from the network connection and
+ *	returns -1 if it isn't 0.
+ */
+int
+net_response(int nd)
+{
+	char	c;
+
+	syslog(LOG_DEBUG, "net_response(%d)", nd);
+	if ((net_read(nd, &c, 1) != 1) || c) {
+		errno = EIO;
+		return (-1);
+	}
+	return (0);
+}
+
+/*
+ *  net_printf() sends a text message out to the network connection supplied
+ *	using the same semantics as printf(3C) for stdio.
+ */
+/*PRINTFLIKE2*/
+int
+net_printf(int nd, char *fmt, ...)
+{
+	char *buf;
+	va_list	ap;
+	int err;
+	int size;
+	int rc;
+
+	syslog(LOG_DEBUG, "net_printf(%d, %s, ...)", nd, fmt);
+
+	if ((buf = malloc(BUFSIZ)) == NULL) {
+		err = errno;
+		syslog(LOG_DEBUG, "net_printf malloc failed");
+		errno = err;
+		return (-1);
+	}
+
+	va_start(ap, fmt);
+	size = vsnprintf(buf, BUFSIZ, fmt, ap);
+	if (size >= BUFSIZ) {
+		if ((buf = (char *)realloc(buf, size + 2)) == NULL) {
+			err = errno;
+			syslog(LOG_DEBUG, "net_printf malloc failed");
+			errno = err;
+			return (-1);
+		}
+		size = vsnprintf(buf, size + 1, fmt, ap);
+	}
+	va_end(ap);
+
+
+	rc = net_write(nd, buf, (int)strlen(buf));
+	free(buf);
+	return (rc);
+}
+
+/*
+ *  net_gets() read from the network connection until either a newline
+ *	is encountered, or the buffer passed in is full.  This is similiar
+ *	to fgets(3C)
+ */
+char *
+net_gets(char *buf, int bufSize, int nd)
+{
+	char	tmp;
+	int	count = 0;
+
+	syslog(LOG_DEBUG, "net_gets(0x%x, %d, %d)",  buf, bufSize, nd);
+	(void) memset(buf, NULL, bufSize);
+	while ((count < bufSize) && (net_read(nd, &tmp, 1) > 0))
+		if ((buf[count++] = tmp) == '\n') break;
+
+	if (count != 0)
+		return (buf);
+	return (NULL);
+}
+
+
+/*
+ *  net_send_message() sends a message out the network connection using
+ *	net_printf() and returns the result from net_response()
+ */
+/*PRINTFLIKE2*/
+int
+net_send_message(int nd, char *fmt, ...)
+{
+	char	buf[BUFSIZ];
+	va_list	ap;
+
+	syslog(LOG_DEBUG, "net_send_message(%d, %s, ...)", nd, fmt);
+	va_start(ap, fmt);
+	if (vsnprintf(buf, sizeof (buf), fmt, ap) >= sizeof (buf)) {
+		syslog(LOG_ERR, "libprint:net_send_message: buffer overrun");
+		return (-1);
+	}
+	va_end(ap);
+
+	if (net_write(nd, buf, (int)((strlen(buf) != 0) ? strlen(buf) : 1)) < 0)
+		return (-1);
+	return (net_response(nd));
+}
+
+
+/*
+ *  net_send_file() sends the appropriate rfc1179 file transfer sub message
+ *	to notify the remote side it is sending a file.  It then sends the
+ *	file if the remote side responds that it is ready.  If the remote side
+ *	can't accept the file an error is returned.  If the transfer fails,
+ *	an error is returned.
+ */
+int
+net_send_file(int nd, char *name, char *data, int data_size, int type)
+{
+	char	*truncated_name,
+		*mptr,
+		*fileBuf = NULL;
+	int	count,
+		retries = 0,
+		size,
+		tmperrno;
+
+	syslog(LOG_DEBUG, "net_send_file(%d, %s, 0x%x, %d, %d)", nd,
+		(name ? name : "NULL"), data, data_size, type);
+	if ((truncated_name = (char *)strrchr(name, '/')) == NULL)
+		truncated_name = name;
+	else
+		truncated_name++;
+
+
+	if (data == NULL) {
+		size = map_in_file(name, &fileBuf, 1);
+		mptr = fileBuf;
+	} else {
+		mptr = data;
+		size = data_size;
+	}
+
+	if (size < 0) {
+		tmperrno = errno; /* because syslog() can change errno */
+		syslog(LOG_DEBUG, "net_send_file(%d, %s, 0x%x, %d, %d): %m", nd,
+			(name ? name : "NULL"), data, data_size, type);
+		errno = tmperrno;
+		return (NETWORK_ERROR_UNKNOWN);
+	}
+
+						/* send XFER command */
+	if (net_send_message(nd, "%c%d %s\n", type, size,
+				truncated_name) != 0) {
+		(void) munmap(fileBuf, size);
+		errno = EIO;
+		return (NETWORK_ERROR_SEND_RESPONSE);
+	}
+
+						/* send DATA and ACK */
+	count = size;
+	while (count > 0) {
+		int	rc;
+
+		rc = net_write(nd, mptr, count);
+
+		if (rc < 0) {
+			if (retries++ < 5) {
+				/*
+				 * save/restore errno;
+				 * will lose if syslogd down
+				 */
+				tmperrno = errno;
+				syslog(LOG_DEBUG,
+				    "net_send_file error on write: %m %d",
+					retries);
+				errno = tmperrno;
+				continue;
+			}
+			/* save/restore errno; will lose if syslogd down */
+			tmperrno = errno;
+			syslog(LOG_DEBUG, "net_send_file error on write: %m");
+			if (fileBuf != NULL)
+				(void) munmap(fileBuf, size);
+			errno = tmperrno;
+			return (-1);
+
+		} else {
+			count -= rc;
+			mptr += rc;
+			retries = 0;
+		}
+	}
+
+	if (fileBuf != NULL)
+		(void) munmap(fileBuf, size);
+
+	if (net_send_message(nd, "", NULL) != 0) {
+		errno = EIO;
+		return (NETWORK_ERROR_SEND_FAILED);
+	}
+
+	return (0);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deleted_files/usr/src/lib/print/libprint/common/network.h	Fri Aug 01 11:46:18 2008 -0700
@@ -0,0 +1,60 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _NETWORK_H
+#define	_NETWORK_H
+
+#pragma ident	"%Z%%M%	%I%	%E% SMI"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define	NETWORK_ERROR_UNKNOWN		-1
+#define	NETWORK_ERROR_HOST		-2
+#define	NETWORK_ERROR_SERVICE		-3
+#define	NETWORK_ERROR_PORT		-4
+#define	NETWORK_ERROR_SEND_RESPONSE	-5
+#define	NETWORK_ERROR_SEND_FAILED	-6
+
+#define	ACK(fd)	net_write(fd, "", 1);
+#define	NACK(fd) net_write(fd, "\1", 1);
+
+extern int	net_open(char *host, int timeout);
+extern int	net_close(int nd);
+extern int	net_read(int nd, char *buf, int len);
+extern int	net_write(int nd, char *buf, int len);
+extern int	net_printf(int nd, char *fmt, ...);
+extern char	*net_gets(char *buf, int size, int nd);
+extern int	net_send_message(int nd, char *fmt, ...);
+extern int	net_response(int nd);
+extern int	net_send_file(int nd, char *name, char *data, int data_len,
+				int type);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _NETWORK_H */
--- a/usr/src/cmd/lp/lib/papi/job.c	Fri Aug 01 10:53:04 2008 -0700
+++ b/usr/src/cmd/lp/lib/papi/job.c	Fri Aug 01 11:46:18 2008 -0700
@@ -118,14 +118,15 @@
 static REQUEST *
 create_request(papi_service_t svc, char *printer, papi_attribute_t **attributes)
 {
-	static REQUEST r;
+	REQUEST *r;
 
-	memset(&r, 0, sizeof (r));
-	r.priority = -1;
-	r.destination = printer_name_from_uri_id(printer, -1);
-	job_attributes_to_lpsched_request(svc, &r, attributes);
+	if ((r = calloc(1, sizeof (*r))) != NULL) {
+		r->priority = -1;
+		r->destination = printer_name_from_uri_id(printer, -1);
+		job_attributes_to_lpsched_request(svc, r, attributes);
+	}
 
-	return (&r);
+	return (r);
 }
 
 static papi_status_t
@@ -756,6 +757,7 @@
 			"job-uri", tmp);
 		free(s->meta_data_file);
 	}
+	freerequest(s->request);
 	free(s);
 
 	return (PAPI_OK);
--- a/usr/src/cmd/lp/model/netpr/Makefile	Fri Aug 01 10:53:04 2008 -0700
+++ b/usr/src/cmd/lp/model/netpr/Makefile	Fri Aug 01 11:46:18 2008 -0700
@@ -2,9 +2,8 @@
 # CDDL HEADER START
 #
 # The contents of this file are subject to the terms of the
-# Common Development and Distribution License, Version 1.0 only
-# (the "License").  You may not use this file except in compliance
-# with the License.
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
 #
 # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 # or http://www.opensolaris.org/os/licensing.
@@ -22,7 +21,7 @@
 #
 # ident	"%Z%%M%	%I%	%E% SMI"
 #
-# Copyright 1995-2002 Sun Microsystems, Inc.  All rights reserved.
+# Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
 # Use is subject to license terms.
 #
 # cmd/lp/model/netpr
@@ -35,9 +34,6 @@
 PURIFYOPTS      = -logfile=/tmp/errs.%p
 PURIFY          = purify $(PURIFYOPTS)
 
-LIBNPRT =	-L$(ROOT)/usr/lib -lprint $(LIBINTL)
-
-
 CPPFLAGS =	-I. -I$(LPINC) 	\
 		$(CPPFLAGS.master)
 
@@ -67,8 +63,7 @@
 		$(LIBOAM)	\
 		$(LIBLP)	\
 		$(LIBSEC)	\
-		$(LIBSYS)	\
-		$(LIBNPRT)
+		$(LIBSYS)
 
 SYSLIBS=	-lnsl -lsocket
 
@@ -116,7 +111,7 @@
 cstyle:
 		cstyle $(SRCS)
 
-LINTFLAGS	+= -L ../../../../lib/print -lprint -lnsl -lsocket
+LINTFLAGS	+= -lnsl -lsocket
 lint:
 		$(LINT.c) $(SRCS) $(LDLIBS)
 
--- a/usr/src/cmd/lp/model/netpr/netpr.c	Fri Aug 01 10:53:04 2008 -0700
+++ b/usr/src/cmd/lp/model/netpr/netpr.c	Fri Aug 01 11:46:18 2008 -0700
@@ -2,9 +2,8 @@
  * CDDL HEADER START
  *
  * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License").  You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
  *
  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  * or http://www.opensolaris.org/os/licensing.
@@ -20,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -36,15 +35,126 @@
 #include <unistd.h>
 #include <sys/mman.h>
 #include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <netdb.h>
 #include <fcntl.h>
 #include <syslog.h>
+#include <sys/utsname.h>
 #include "netpr.h"
 
+
 static void usage_exit();
 
 static void pipehandler(int);
 char data_file_type = 0;
 
+/*
+ *  null() is to be used as a signal handler that does nothing.  It is used in
+ *      place of SIG_IGN, because we want the signal to be delivered and
+ *      interupt the current system call.
+ */
+static void
+null(int i)
+{
+	syslog(LOG_DEBUG, "null(%d)", i);
+}
+
+/*
+ *  net_open() opens a tcp connection to the printer port on the host specified
+ *      in the arguments passed in.  If the connection is not made in the
+ *      timeout (in seconds) passed in, an error it returned.  If the host is
+ *      unknown, an error is returned.  If all is well, a file descriptor is
+ *      returned to be used for future communications.
+ */
+int
+net_open(char *host, int timeout)
+{
+	struct hostent *hp;
+	struct servent *sp;
+	struct sockaddr_in6 sin;
+	void (*old_handler)();
+	static struct utsname uts;
+
+	int	s,
+		lport,
+		err,
+		error_num;
+	unsigned timo = 1;
+
+	syslog(LOG_DEBUG, "net_open(%s, %d)", (host != NULL ? host : "NULL"),
+		timeout);
+	/*
+	 * Get the host address and port number to connect to.
+	 */
+	if (host == NULL) {
+		return (-1);
+	}
+
+	(void) memset((char *)&sin, NULL, sizeof (sin));
+	if ((hp = getipnodebyname(host, AF_INET6, AI_DEFAULT,
+		    &error_num)) == NULL) {
+		syslog(LOG_DEBUG|LOG_ERR, "unknown host %s "
+		    "getipnodebyname() returned %d", host, error_num);
+		return (NETWORK_ERROR_HOST);
+	}
+	(void) memcpy((caddr_t)&sin.sin6_addr, hp->h_addr, hp->h_length);
+	sin.sin6_family = hp->h_addrtype;
+	freehostent(hp);
+
+	if ((sp = getservbyname("printer", "tcp")) == NULL) {
+		syslog(LOG_DEBUG|LOG_ERR, "printer/tcp: unknown service");
+		return (NETWORK_ERROR_SERVICE);
+	}
+	sin.sin6_port = sp->s_port;
+
+retry:
+	/*
+	 * Try connecting to the server.
+	 *
+	 * Use 0 as lport means that rresvport_af() will bind to a port in
+	 * the anonymous privileged port range.
+	 */
+	lport = 0;
+	s = rresvport_af(&lport, AF_INET6);
+	if (s < 0)
+		return (NETWORK_ERROR_PORT);
+
+	old_handler = signal(SIGALRM, null);
+	(void) alarm(timeout);
+	if (connect(s, (struct sockaddr *)&sin, sizeof (sin)) < 0) {
+		(void) alarm(0);
+		(void) signal(SIGALRM, old_handler);
+		err = errno;
+		(void) close(s);
+		errno = err;
+		if (errno == EADDRINUSE) {
+			goto retry;
+		}
+		/*
+		 * If connecting to the local system fails, try
+		 * again with "localhost" address instead.
+		 */
+		if (uts.nodename[0] == '\0')
+			(void) uname(&uts);
+		if (strcmp(host, uts.nodename) == 0) {
+			IN6_IPADDR_TO_V4MAPPED(htonl(INADDR_LOOPBACK),
+			    &sin.sin6_addr);
+			sin.sin6_family = AF_INET6;
+			goto retry;
+		}
+		if (errno == ECONNREFUSED && timo <= 16) {
+			(void) sleep(timo);
+			timo *= 2;
+			goto retry;
+		}
+		return (NETWORK_ERROR_UNKNOWN);
+	}
+	(void) alarm(0);
+	(void) signal(SIGALRM, old_handler);
+	return (s);
+}
+
 int
 main(int argc, char *argv[])
 {
--- a/usr/src/cmd/print/bsd-sysv-commands/common.c	Fri Aug 01 10:53:04 2008 -0700
+++ b/usr/src/cmd/print/bsd-sysv-commands/common.c	Fri Aug 01 11:46:18 2008 -0700
@@ -400,8 +400,8 @@
 }
 
 papi_status_t
-jobSubmitSTDIN(papi_service_t svc, char *printer, papi_attribute_t **list,
-		papi_job_t *job)
+jobSubmitSTDIN(papi_service_t svc, char *printer, char *prefetch, int len,
+		papi_attribute_t **list, papi_job_t *job)
 {
 	papi_status_t status;
 	papi_stream_t stream = NULL;
@@ -409,6 +409,10 @@
 	char buf[BUFSIZ];
 
 	status = papiJobStreamOpen(svc, printer, list, NULL, &stream);
+
+	if (len > 0)
+		status = papiJobStreamWrite(svc, stream, prefetch, len);
+
 	while ((status == PAPI_OK) && ((rc = read(0, buf, sizeof (buf))) > 0))
 		status = papiJobStreamWrite(svc, stream, buf, rc);
 
@@ -426,19 +430,12 @@
 #define	PS_MAGIC	"%!"
 #define	PC_PS_MAGIC	"^D%!"
 int
-is_postscript(const char *file)
+is_postscript_stream(int fd, char *buf, int *len)
 {
-	char buf[3];
-	int fd;
-
-	if ((fd = open(file, O_RDONLY)) < 0)
-		return (-1);
-
-	if (read(fd, buf, sizeof (buf)) < 0) {
+	if ((*len = read(fd, buf, *len)) < 0) {
 		close(fd);
 		return (-1);
 	}
-	close(fd);
 
 	if ((strncmp(buf, PS_MAGIC, sizeof (PS_MAGIC) - 1) == 0) ||
 	    (strncmp(buf, PC_PS_MAGIC, sizeof (PC_PS_MAGIC) - 1) == 0))
@@ -447,6 +444,23 @@
 		return (0);
 }
 
+int
+is_postscript(const char *file)
+{
+	int rc = -1;
+	int fd;
+
+	if ((fd = open(file, O_RDONLY)) >= 0) {
+		char buf[3];
+		int len = sizeof (buf);
+
+		rc = is_postscript_stream(fd, buf, &len);
+		close(fd);
+	}
+
+	return (rc);
+}
+
 static char **
 all_list(papi_service_t svc)
 {
--- a/usr/src/cmd/print/bsd-sysv-commands/common.h	Fri Aug 01 10:53:04 2008 -0700
+++ b/usr/src/cmd/print/bsd-sysv-commands/common.h	Fri Aug 01 11:46:18 2008 -0700
@@ -20,7 +20,7 @@
  */
 
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  *
  */
@@ -52,12 +52,14 @@
 		int fmt, int ac, char *av[]);
 
 extern papi_status_t jobSubmitSTDIN(papi_service_t svc, char *printer,
+				char *prefetch, int len,
 				papi_attribute_t **list, papi_job_t *job);
 
 extern char **interest_list(papi_service_t svc);
 extern char *localhostname();
 extern char *lp_type_to_mime_type(char *lp_type);
 extern int is_postscript(const char *file);
+extern int is_postscript_stream(int fd, char *buf, int *len);
 
 extern int cli_auth_callback(papi_service_t svc, void *app_data);
 
--- a/usr/src/cmd/print/bsd-sysv-commands/lp.c	Fri Aug 01 10:53:04 2008 -0700
+++ b/usr/src/cmd/print/bsd-sysv-commands/lp.c	Fri Aug 01 11:46:18 2008 -0700
@@ -70,6 +70,8 @@
 	papi_attribute_t **list = NULL;
 	papi_encryption_t encryption = PAPI_ENCRYPT_NEVER;
 	papi_job_t job = NULL;
+	char prefetch[3];
+	int prefetch_len = sizeof (prefetch);
 	char *printer = NULL;
 	char b = PAPI_TRUE;
 	int copy = 0;
@@ -230,6 +232,10 @@
 			if (is_postscript(av[optind]) == 1)
 				document_format = "application/postscript";
 #endif
+		} else {
+			if (is_postscript_stream(0, prefetch, &prefetch_len)
+						== 1)
+				document_format = "application/postscript";
 		}
 
 		papiAttributeListAddInteger(&list, PAPI_ATTR_EXCL, "copies", 1);
@@ -257,7 +263,8 @@
 	if (modify != -1)
 		status = papiJobModify(svc, printer, modify, list, &job);
 	else if (optind == ac)	/* no file list, use stdin */
-		status = jobSubmitSTDIN(svc, printer, list, &job);
+		status = jobSubmitSTDIN(svc, printer, prefetch, prefetch_len,
+					list, &job);
 	else if (validate == 1)	/* validate the request can be processed */
 		status = papiJobValidate(svc, printer, list,
 					NULL, &av[optind], &job);
--- a/usr/src/cmd/print/bsd-sysv-commands/lpr.c	Fri Aug 01 10:53:04 2008 -0700
+++ b/usr/src/cmd/print/bsd-sysv-commands/lpr.c	Fri Aug 01 11:46:18 2008 -0700
@@ -70,6 +70,8 @@
 	papi_job_t job = NULL;
 	int exit_code = 0;
 	char *printer = NULL;
+	char prefetch[3];
+	int prefetch_len = sizeof (prefetch);
 	papi_encryption_t encryption = PAPI_ENCRYPT_NEVER;
 	int dump = 0;
 	int validate = 0;
@@ -217,6 +219,9 @@
 		if (is_postscript(av[optind]) == 1)
 			document_format = "application/postscript";
 #endif
+	} else {
+		if (is_postscript_stream(0, prefetch, &prefetch_len) == 1)
+			document_format = "application/postscript";
 	}
 
 	papiAttributeListAddInteger(&list, PAPI_ATTR_EXCL, "copies", 1);
@@ -238,7 +243,8 @@
 		status = papiJobValidate(svc, printer, list,
 					NULL, &av[optind], &job);
 	else if (optind == ac)	/* no file list, use stdin */
-		status = jobSubmitSTDIN(svc, printer, list, &job);
+		status = jobSubmitSTDIN(svc, printer, prefetch, prefetch_len,
+					list, &job);
 	else if (copy == 0)	/* reference the files in the job, default */
 		status = papiJobSubmitByReference(svc, printer, list,
 					NULL, &av[optind], &job);
--- a/usr/src/cmd/print/lpget/lpget.c	Fri Aug 01 10:53:04 2008 -0700
+++ b/usr/src/cmd/print/lpget/lpget.c	Fri Aug 01 11:46:18 2008 -0700
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -38,7 +38,6 @@
 #endif
 
 #include <ns.h>
-#include <misc.h>
 #include <list.h>
 
 extern char *optarg;
--- a/usr/src/cmd/print/lpset/lpset.c	Fri Aug 01 10:53:04 2008 -0700
+++ b/usr/src/cmd/print/lpset/lpset.c	Fri Aug 01 11:46:18 2008 -0700
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -41,7 +41,6 @@
 #include <pwd.h>
 
 #include <ns.h>
-#include <misc.h>
 #include <list.h>
 
 extern char *optarg;
--- a/usr/src/cmd/print/selector/print-service	Fri Aug 01 10:53:04 2008 -0700
+++ b/usr/src/cmd/print/selector/print-service	Fri Aug 01 11:46:18 2008 -0700
@@ -64,6 +64,8 @@
 my $SVC_CUPS_LPD = 'cups/in-lpd';
 
 sub fatal {
+	($ENV{"DESKTOP_LAUNCHED"}) &&
+		exec("/bin/zenity", "--error", "--text=@_");
 	print STDERR @_;
 	exit(1);
 }
--- a/usr/src/lib/print/libpapi-common/common/uri.c	Fri Aug 01 10:53:04 2008 -0700
+++ b/usr/src/lib/print/libpapi-common/common/uri.c	Fri Aug 01 11:46:18 2008 -0700
@@ -20,7 +20,7 @@
  */
 
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  *
  */
@@ -165,6 +165,14 @@
 		u->scheme_part = strdup(&ptr[1]);
 	}
 
+	if ((u->host_part == NULL) && (u->path_part == NULL) &&
+	    (u->scheme_part == NULL)) {
+		errno = EINVAL;
+		uri_free(u);
+		*uri = NULL;
+		return (-1);
+	}
+
 	return (0);
 }
 
--- a/usr/src/lib/print/libpapi-dynamic/common/nss.c	Fri Aug 01 10:53:04 2008 -0700
+++ b/usr/src/lib/print/libpapi-dynamic/common/nss.c	Fri Aug 01 11:46:18 2008 -0700
@@ -100,9 +100,16 @@
 
 	papiAttributeListGetString(*list, NULL,
 				"printer-uri-supported", &printer);
-	if (uri_from_string(printer, &uri) < 0)
+	/* if there is no printer-uri-supported, there is nothing to do */
+	if (printer == NULL)
 		return;
 
+	if (uri_from_string(printer, &uri) < 0) {
+		papiAttributeListFree(*list);
+		*list = NULL;
+		return;
+	}
+
 	/* already an lpsched URI ? */
 	if (strcasecmp(uri->scheme, "lpsched") == 0)
 		return;
--- a/usr/src/lib/print/libpapi-lpd/common/lpd-job.c	Fri Aug 01 10:53:04 2008 -0700
+++ b/usr/src/lib/print/libpapi-lpd/common/lpd-job.c	Fri Aug 01 11:46:18 2008 -0700
@@ -94,10 +94,12 @@
 		*metadata = (char *)calloc(1, size);
 	} else {
 		void *tmp;
-		tmp = realloc(*metadata, size);
-		if (tmp)
+		tmp = calloc(1, size);
+		if (tmp) {
+			strlcpy(tmp, *metadata, size);
+			free(*metadata);
 			*metadata = (char *)tmp;
-		else
+		} else
 			return (PAPI_TEMPORARY_ERROR);
 	}
 
--- a/usr/src/lib/print/libpapi-lpd/common/lpd-port.c	Fri Aug 01 10:53:04 2008 -0700
+++ b/usr/src/lib/print/libpapi-lpd/common/lpd-port.c	Fri Aug 01 11:46:18 2008 -0700
@@ -20,7 +20,7 @@
  */
 
 /*
- * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  *
  */
@@ -232,6 +232,7 @@
 			    (ftruncate(fd, 0) == 0))
 				write(fd, buf, strlen(buf));
 		}
+		close(fd);
 	}
 	syslog(LOG_DEBUG, "next_job_id() is %d", result);
 
--- a/usr/src/lib/print/libprint/Makefile.com	Fri Aug 01 10:53:04 2008 -0700
+++ b/usr/src/lib/print/libprint/Makefile.com	Fri Aug 01 11:46:18 2008 -0700
@@ -28,7 +28,7 @@
 LIBRARY =		libprint.a
 VERS =			.2
 OBJECTS = \
-	job.o list.o misc.o network.o ns.o ns_bsd_addr.o ns_cmn_kvp.o \
+	list.o ns.o ns_bsd_addr.o ns_cmn_kvp.o \
 	ns_cmn_printer.o nss_convert.o nss_ldap.o nss_printer.o nss_write.o
 
 include ../../../Makefile.lib
--- a/usr/src/lib/print/libprint/common/job.c	Fri Aug 01 10:53:04 2008 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,591 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
- * Use is subject to license terms.
- */
-
-#pragma ident	"%Z%%M%	%I%	%E% SMI"
-
-/*LINTLIBRARY*/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <stdarg.h>
-#include <unistd.h>
-#include <string.h>
-#include <dirent.h>
-#include <sys/mman.h>
-#include <sys/systeminfo.h>
-#include <syslog.h>
-#include <errno.h>
-#include <libintl.h>
-#include <grp.h>
-
-#include <job.h>
-#include <misc.h>
-#include <list.h>
-
-
-#define	MAX_RETRIES	(5)
-
-static char *_control_file_prefix =	CONTROL_FILE_PREFIX;
-static char *_xfer_file_prefix =	XFER_FILE_PREFIX;
-
-
-/*
- *  _job_unlink_data_file() will unlink the path for the jobfile passed in.
- *	this is only to be used with job_destroy() so it can iterate through
- *	the job_df_list.
- */
-static int
-_job_unlink_data_file(jobfile_t *file)
-{
-	syslog(LOG_DEBUG, "_job_unlink_data_file(%s)",
-		((file != NULL) ? file->jf_spl_path : "NULL"));
-	if (file && file->jf_spl_path)
-		return (unlink(file->jf_spl_path));
-	else
-		return (-1);
-}
-
-/*
- *
- */
-static void
-_job_file_free(jobfile_t *file)
-{
-	if (file == NULL)
-		return;
-	if (file->jf_spl_path != NULL) free(file->jf_spl_path);
-	if (file->jf_src_path != NULL) free(file->jf_src_path);
-	if (file->jf_name != NULL)	free(file->jf_name);
-	if (file->jf_data != NULL) {
-		if (file->jf_mmapped)
-			(void) munmap(file->jf_data, file->jf_size);
-		else
-			free(file->jf_data);
-	}
-	free(file);
-}
-
-
-/*
- *
- */
-static void
-_vjob_file_free(jobfile_t *file)
-{
-	_job_file_free(file);
-}
-
-
-/*
- *  job_free() frees up memory mmapped for malloced
- *	being used by the structure.
- */
-void
-job_free(job_t *job)
-{
-	if (job == NULL)
-		return;
-
-	syslog(LOG_DEBUG, "job_free(%d, %s, %s)", job->job_id,
-		(job->job_printer ? job->job_printer : "NULL"),
-		(job->job_server ? job->job_server : "NULL"));
-
-	if (job->job_printer) free(job->job_printer);
-	if (job->job_server) free(job->job_server);
-	if (job->job_user) free(job->job_user);
-	if (job->job_host) free(job->job_host);
-	if (job->job_cf)
-		_job_file_free(job->job_cf);
-	(void) list_iterate((void *)job->job_df_list, (VFUNC_T)_vjob_file_free);
-
-	if (job->job_df_list)
-		free(job->job_df_list);
-
-	if (job->job_spool_dir)
-		free(job->job_spool_dir);
-
-	free(job);
-}
-void
-job_destroy(job_t *job)
-{
-	char	*name = NULL;
-	jobfile_t *cf;
-
-	if (job == NULL)
-		return;
-
-	syslog(LOG_DEBUG, "job_destroy(%d, %s, %s)", job->job_id,
-		job->job_printer, job->job_server);
-	if (chdir(job->job_spool_dir) < 0)
-		return;
-	(void) list_iterate((void *)job->job_df_list,
-			(VFUNC_T)_job_unlink_data_file);
-
-	/* lose privilege temporarily */
-	(void) seteuid(get_user_id(job->job_user));
-
-	if ((cf = job->job_cf) != NULL) {
-		for (name = cf->jf_data; name != NULL;
-				name = strchr(name, '\n')) {
-			if (name[0] == '\n')
-				name++;
-			if (name[0] == CF_UNLINK) {
-				struct stat st;
-				char	*path = strcdup(&name[1], '\n'),
-					*p;
-
-				if (stat(path, &st) < 0) {
-					free(path);
-					continue;
-				}
-
-				if (st.st_uid == getuid()) {
-					(void) unlink(path);
-					free(path);
-					continue;
-				}
-
-				p = strdup(path);
-				if ((p = strrchr(p, '/')) != NULL)
-					*++p = NULL;
-
-				if (access(p, W_OK) == 0)
-					(void) unlink(path);
-				free(path);
-			}
-		}
-	}
-	(void) seteuid(0); /* get back privilege */
-
-	(void) unlink(cf->jf_src_path);
-	(void) _job_unlink_data_file(cf);
-	job_free(job);
-}
-
-static int
-get_job_from_cfile(jobfile_t *file, char *cFile, char *xFile, job_t *tmp)
-{
-	jobfile_t *file1;
-	int	n_cnt;
-	char	*p, *cfp;
-
-	/* map in the control data */
-	if ((file->jf_size = map_in_file(cFile, &file->jf_data, 0)) <= 0) {
-		syslog(LOG_INFO, "could not read control file (%s): %m, "
-		    "canceling %d destined for %s:%s",
-		    (file->jf_spl_path ? file->jf_spl_path:"NULL"),
-		    tmp->job_id,
-		    (tmp->job_server ? tmp->job_server : "NULL"),
-		    (tmp->job_printer ? tmp->job_printer : "NULL"));
-		return (0);
-	}
-	file->jf_mmapped = 1;
-	tmp->job_cf = file;
-
-	/* look for usr, host, & data files */
-
-	/*
-	 * Bugid 4137904 - "File Name" can be
-	 * anywhere in control file.
-	 * Bugid 4179341 - "File Name" can be missing
-	 * in control file.
-	 * Keep a separate pointer to the control file.
-	 * When a CF_UNLINK entry is found use the second
-	 * pointer to search for a corresponding 'N' entry.
-	 * The behavior is to associate the first CF_UNLINK
-	 * entry with the first 'N' entry and so on.
-	 * Note: n_cnt is only used to determine if we
-	 *	should test for 'N' at the beginning of
-	 *	the file.
-	 */
-	cfp = file->jf_data;
-	n_cnt = 0;
-	for (p = file->jf_data - 1; p != NULL; p = strchr(p, '\n')) {
-		switch (*(++p)) {
-		case CF_USER:
-			tmp->job_user = strcdup(++p, '\n');
-			break;
-		case CF_HOST:
-			tmp->job_host = strcdup(++p, '\n');
-			break;
-		case CF_UNLINK:
-			if ((file1 = calloc(1, sizeof (*file))) == NULL) {
-				syslog(LOG_DEBUG, "cf_unlink: calloc() failed");
-				munmap(file->jf_data, file->jf_size);
-				file->jf_mmapped = 0;
-				return (0);
-			}
-			file1->jf_src_path = strdup(xFile);
-			file1->jf_spl_path = strcdup(++p, '\n');
-			file1->jf_size = file_size(file1->jf_spl_path);
-
-			if (cfp != NULL) {
-				/*
-				 * Beginning of file. Check for first
-				 * character == 'N'
-				 */
-				if ((n_cnt == 0) && (*cfp == 'N')) {
-					cfp++;
-					n_cnt++;
-				} else {
-					cfp = strstr(cfp, "\nN");
-					if (cfp != NULL) {
-						cfp += 2;
-						n_cnt++;
-					}
-				}
-				if (cfp != NULL) {
-					file1->jf_name = strcdup(cfp, '\n');
-					/*
-					 * Move cfp to end of line or
-					 * set to NULL if end of file.
-					 */
-					cfp = strchr(cfp, '\n');
-				}
-			}
-			tmp->job_df_list = (jobfile_t **)list_append((void **)
-			    tmp->job_df_list, (void *)file1);
-			break;
-		}
-	}
-	if (tmp->job_df_list == NULL) {
-		munmap(file->jf_data, file->jf_size);
-		file->jf_mmapped = 0;
-		return (0);
-	}
-
-	return (1);
-}
-
-/*
- *  job_retrieve() will retrieve the disk copy of a job associated with the
- *	transfer file name passed in.  It returns a pointer to a job structure
- *	or a NULL if the job was not on disk.
- */
-job_t *
-job_retrieve(char *xFile, char *spool)
-{
-	int	retry_cnt = 0;
-	char	*s;
-	jobfile_t *file;
-	char 	cFile[BUFSIZ];
-	char	buf[BUFSIZ];
-	int	fd;
-	flock_t flk;
-	job_t	*tmp;
-
-	syslog(LOG_DEBUG, "job_retrieve(%s)", xFile);
-	if ((tmp = (job_t *)calloc(1, sizeof (*tmp))) == NULL) {
-		return (NULL);
-	}
-
-	if ((file = calloc(1, sizeof (*file))) == NULL) {
-		free(tmp);
-		return (NULL);
-	}
-
-	flk.l_type = F_RDLCK;
-	flk.l_whence = 1;
-	flk.l_start = 0;
-	flk.l_len = 0;
-
-	(void) memset(buf, NULL, sizeof (buf));
-	/* get job id, from binding file name */
-	(void) strlcpy(buf, xFile + strlen(_xfer_file_prefix) + 1,
-	    sizeof (buf));
-
-	buf[3] = NULL;
-	tmp->job_id = atoi(buf);
-
-	/* Construct data file and control file names */
-	(void) strlcpy(cFile, _control_file_prefix, sizeof (cFile));
-	(void) strlcat(cFile, xFile + strlen(_xfer_file_prefix),
-	    sizeof (cFile));
-
-	/* remove data file and control file whenever xFile is removed */
-	if ((fd = open(xFile, O_RDONLY)) < 0) {
-		syslog(LOG_DEBUG, "job_retrieve(%s) open failed errno=%d",
-		    xFile, errno);
-		if (get_job_from_cfile(file, cFile, xFile, tmp))
-			job_destroy(tmp);
-		free(file);
-		free(tmp);
-		(void) unlink(xFile);
-		(void) unlink(cFile);
-		return (NULL);
-	}
-
-	/*
-	 * If failed to get a lock on the file, just return NULL. It will
-	 * be retried later.
-	 */
-	if ((fcntl(fd, F_SETLK, &flk)) < 0) {
-		syslog(LOG_DEBUG, "job_retrieve(%s) lock failed errno=%d",
-		    xFile, errno);
-		close(fd);
-		free(file);
-		free(tmp);
-		return (NULL);
-	}
-
-	/*
-	 * Retry a few times if we failed to read or read returns 0, just
-	 * to make sure we tried hard before giving up. In practice,
-	 * there were cases of read() returning 0. To handle that
-	 * scenario just try a few times.
-	 */
-	for (retry_cnt = 0; retry_cnt < MAX_RETRIES; retry_cnt++) {
-		if ((read(fd, buf, sizeof (buf))) > 0) {
-			close(fd);
-			if ((s = strtok(buf, ":\n")) != NULL)
-				tmp->job_server = strdup(s);
-			if ((s = strtok(NULL, ":\n")) != NULL)
-				tmp->job_printer = strdup(s);
-			syslog(LOG_DEBUG, "job_retrieve(%s) success - %s:%s",
-			    xFile, tmp->job_server, tmp->job_printer);
-			break;
-		}
-	}
-	/*
-	 * If failed to read after MAX_RETRIES, return NULL and remove xFile,
-	 * and cFile.
-	 */
-	if (retry_cnt == MAX_RETRIES) {
-		syslog(LOG_DEBUG, "job_retrieve(%s) unsuccessful", xFile);
-		if (get_job_from_cfile(file, cFile, xFile, tmp))
-			job_destroy(tmp);
-		free(file);
-		free(tmp);
-		(void) unlink(xFile);
-		(void) unlink(cFile);
-		return (NULL);
-	}
-
-	file->jf_src_path = strdup(xFile);
-	file->jf_spl_path = strdup(cFile);
-
-	if (!get_job_from_cfile(file, cFile, xFile, tmp)) {
-		(void) unlink(file->jf_spl_path);  /* control file */
-		(void) unlink(file->jf_src_path);  /* binding file */
-		free(file->jf_src_path);
-		free(file->jf_spl_path);
-		free(file);
-		free(tmp);
-		return (NULL);
-	}
-
-	tmp->job_spool_dir = strdup(spool);
-	return (tmp);
-}
-
-
-/*
- * job_compar() compare 2 jobs for creation time ordering
- */
-static int
-job_compar(job_t **j1, job_t **j2)
-{
-	int	server;
-	int	printer;
-	struct stat	s1,
-			s2;
-	jobfile_t	*f1 = (*j1)->job_cf,
-			*f2 = (*j2)->job_cf;
-
-	/*
-	 * If there is a null value, assume the job submitted remotely.
-	 * Jobs submitted remotely take precedence over those submitted
-	 * from the server.
-	 */
-	if (((*j1)->job_server) == NULL || ((*j1)->job_printer) == NULL ||
-				((*j1)->job_cf) == NULL)
-		return (-1);
-
-	else if ((*j2)->job_server == NULL || (*j2)->job_printer == NULL ||
-				(*j2)->job_cf == NULL)
-		return (1);
-
-	server = strcmp((*j1)->job_server, (*j2)->job_server);
-	printer = strcmp((*j1)->job_printer, (*j2)->job_printer);
-
-	if (server != 0)
-		return (server);
-	if (printer != 0)
-		return (printer);
-
-	if ((stat(f1->jf_spl_path, &s1) == 0) &&
-	    (stat(f2->jf_spl_path, &s2) == 0))
-		return (s1.st_ctime - s2.st_ctime);
-
-	return (0);
-}
-
-
-/*
- *  job_list_append() reads all of the jobs associated with the printer passed
- *	in and appends them to the list of jobs passed in.  The returned result
- *	is a new list of jobs containing all jobs passed in and jobs for the
- *	printer specified.  If the printer is NULL, all jobs for all printers
- *	are added to the list.
- */
-job_t **
-job_list_append(job_t **list, char *printer, char *server, char *spool)
-{
-	struct dirent *d;
-	DIR	*dirp;
-	job_t	*job;
-	int	i, found = 0;
-
-	syslog(LOG_DEBUG, "job_list_append(0x%x, %s, %s)", list,
-		((printer != NULL) ? printer : "NULL"),
-		    ((server != NULL) ? server : "NULL"));
-
-	/*
-	 * 4239765 - in.lpd segfaults performing strcmp()
-	 * in job_list_append()
-	 */
-	if (server == NULL) {
-		server = "";
-	}
-
-	if ((dirp = opendir(spool)) == NULL)
-		return (NULL);
-
-	/* should use scandir */
-	while ((d = readdir(dirp)) != NULL) {
-		if (strncmp(d->d_name, _xfer_file_prefix,
-				strlen(_xfer_file_prefix)) != 0)
-			continue;
-		if ((job = job_retrieve(d->d_name, spool)) == NULL)
-			continue;
-		syslog(LOG_DEBUG, "job_printer is (%s:%s)",
-			job->job_printer, job->job_server);
-
-		found = 0;
-
-		if ((printer == NULL) ||
-		    ((strcmp(printer, job->job_printer) == 0) &&
-			(strcmp(server, job->job_server) == 0))) {
-			if (list) {
-			    for (i = 0; list[i] != NULL; i++) {
-				if ((list[i]->job_cf != NULL) &&
-				    (job->job_cf != NULL) &&
-				    (strcmp(list[i]->job_cf->jf_spl_path,
-				    job->job_cf->jf_spl_path) == 0))
-					found = 1;
-			    }
-			} /* if (list) */
-
-			if (!found)
-				list = (job_t **)list_append((void **)list,
-				    (void *)job);
-		}
-	} /* while */
-
-	/* count the length of the list for qsort() */
-	if (list) {
-		for (i = 0; list[i] != NULL; i++)
-			;
-
-		qsort(list, i, sizeof (job_t *),
-		    (int(*)(const void *, const void *))job_compar);
-	}
-	(void) closedir(dirp);
-	return (list);
-}
-
-
-
-/*
- *
- * Shared routines for Canceling jobs.
- *
- */
-
-
-/*
- *  vjob_match_attribute() checks to see if the attribute passed in
- *	matches the the user or id of the job passed in via stdargs.  This is
- *	intended for use with list_iterate().
- */
-int
-vjob_match_attribute(char *attribute, va_list ap)
-{
-	job_t *job = va_arg(ap, job_t *);
-
-	if ((strcmp(attribute, job->job_user) == 0) ||
-	    (job->job_id == atoi(attribute)))
-		return (1);
-	else
-		return (0);
-}
-
-
-/*
- *  vjob_job() determines if the job passed in is for the printer and server
- *	of the cancel request, and if it is from the user requesting or the
- *	user is root, it checsk the attributes.  If the job matches all of this
- *	it cancels the job and prints a message.  It is intented to be called
- *	by list_iterate().
- */
-int
-vjob_cancel(job_t *job, va_list ap)
-{
-	int killed_process = 0;
-	int lock;
-	char	*user = va_arg(ap, char *),
-		*printer = va_arg(ap, char *),
-		*server = va_arg(ap, char *),
-		**list = va_arg(ap, char **);
-
-	syslog(LOG_DEBUG, "vjob_cancel((%s, %s, %d), %s, %s, %s)",
-		job->job_printer, job->job_server, job->job_id, user, printer,
-		server);
-	if (((strcmp(user, "root") == 0) ||
-	    (strcmp(user, job->job_user) == 0)) &&
-	    ((strcmp(printer, job->job_printer) == 0) &&
-	    (strcmp(server, job->job_server) == 0))) {
-		if (list_iterate((void **)list,
-		    (VFUNC_T)vjob_match_attribute, job) != 0) {
-			while ((lock = get_lock(job->job_cf->jf_src_path,
-						0)) < 0) {
-				(void) kill_process(job->job_cf->jf_src_path);
-				killed_process = 1;
-			}
-			job_destroy(job);
-			syslog(LOG_DEBUG, "\t%s-%d: canceled\n", printer,
-				job->job_id);
-			(void) printf(
-			    (char *)gettext("\t%s-%d: canceled\n"), printer,
-			    (int)job->job_id);
-			close(lock);
-		}
-	}
-	return (killed_process);
-}
--- a/usr/src/lib/print/libprint/common/job.h	Fri Aug 01 10:53:04 2008 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,138 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
- * Use is subject to license terms.
- */
-
-#ifndef	_JOB_H
-#define	_JOB_H
-
-#pragma ident	"%Z%%M%	%I%	%E% SMI"
-
-#include <sys/va_list.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
- *	Sequence number space
- */
-#define	JOB_ID_START		   0
-#define	JOB_ID_END		   999
-
-/*
- *	Job related files
- */
-#define	SEQUENCE_FILE		".seq"  /* sequence numbers */
-#define	TEMP_FILE_PREFIX	"tf"    /* printer:server */
-#define	XFER_FILE_PREFIX	"xf"    /* printer:server */
-#define	CONTROL_FILE_PREFIX	"cf"    /* job control data */
-#define	DATA_FILE_PREFIX	"df"    /* job data file */
-
-/*
- *	RFC-1179 Control File Primatives
- */
-#define	CF_CLASS	'C'	 /* C(ClassName)\n - for banner page */
-#define	CF_HOST		'H'	 /* H(Hostname)\n - host submitting job */
-#define	CF_INDENT	'I'	 /* I(indent)\n - # of spaces for 'f' */
-#define	CF_JOBNAME	'J'	 /* J(Jobname)\n - name of job for banner */
-#define	CF_PRINT_BANNER	'L'	 /* L[User]\n - User name on burst page */
-#define	CF_MAIL		'M'	 /* M(user)\n - User to mail when done */
-#define	CF_SOURCE_NAME	'N'	 /* N(name)\n - source of data file */
-#define	CF_USER		'P'	 /* P(name)\n - requesting user */
-#define	CF_SYMLINK	'S'	 /* S(device) (inode)\n - foget it */
-#define	CF_TITLE	'T'	 /* T(title)\n - for pr */
-#define	CF_UNLINK	'U'	 /* U(file)\n - unlink file */
-#define	CF_WIDTH	'W'	 /* W(width)\n - column width */
-#define	CF_FONT_TROFF_R	'1'	 /* 1(file)\n - file with Times Roman font */
-#define	CF_FONT_TROFF_I	'2'	 /* 2(file)\n - file with Times Italic font */
-#define	CF_FONT_TROFF_B	'3'	 /* 3(file)\n - file with Times Bold font */
-#define	CF_FONT_TROFF_S	'4'	 /* 4(file)\n - file with Times Special font */
-#define	CF_PRINT_CIF	'c'	 /* c(file)\n - print/plot file as CIF data */
-#define	CF_PRINT_DVI	'd'	 /* d(file)\n - print file as DVI data */
-#define	CF_PRINT_ASCII	'f'	 /* f(file)\n - print file as ASCII */
-#define	CF_PRINT_PLOT	'g'	 /* g(file)\n - print file as plot data */
-#define	CF_KERBERIZED	'k'	 /* k...\n - for Kerberos */
-#define	CF_PRINT_RAW	'l'	 /* l(file)\n - print file dammit */
-#define	CF_PRINT_DROFF	'n'	 /* n(file)\n - print file as ditroff output */
-#define	CF_PRINT_PS	'o'	 /* o(file)\n - print file as PostScript */
-#define	CF_PRINT_PR	'p'	 /* p(file)\n - print file thru "pr" */
-#define	CF_PRINT_FORT	'r'	 /* r(file)\n - print file as fortran */
-#define	CF_PRINT_TROFF	't'	 /* n(file)\n - print file as troff output */
-#define	CF_PRINT_RAS	'v'	 /* v(file)\n - print file as raster image */
-#define	CF_PRINT_PLDM	'z'	 /* z...\n - for Palladium ??? */
-
-/*
- *	Solaris 2.X LP - BSD protocol extensions
- */
-#define	CF_SYSV_OPTION  'O'		/* for SVR4 LP '-o' option */
-#define	CF_SYSV_FEATURE '5'		/* for SVR4 LP features */
-#define	CF_SYSV_FORM		'f'	/* for SVR4 Forms */
-#define	CF_SYSV_HANDLING	'H'	/* for SVR4 Handling */
-#define	CF_SYSV_NOTIFICATION	'p'	/* for SVR4 Notification */
-#define	CF_SYSV_PAGES		'P'	/* for SVR4 Pages */
-#define	CF_SYSV_PRIORITY	'q'	/* for SVR4 Priority */
-#define	CF_SYSV_CHARSET		'S'	/* for SVR4 Charset */
-#define	CF_SYSV_TYPE		'T'	/* for SVR4 Type */
-#define	CF_SYSV_MODE		'y'	/* for SVR4 Mode */
-
-
-typedef struct _jobfile jobfile_t;
-typedef struct _job job_t;
-
-struct _jobfile {
-	char	*jf_spl_path;	/* df file */
-	char	*jf_src_path;	/* source file */
-	char	*jf_name;	/* title/name */
-	char	*jf_data;	/* ptr to mmapped file */
-	long	jf_size;	/* size of data */
-	char	jf_mmapped;	/* is this mmapped or malloced */
-};
-
-struct _job {
-	int	job_id;
-	char	*job_printer;
-	char	*job_server;
-	char	*job_user;
-	char	*job_host;
-	char	*job_spool_dir;
-	jobfile_t *job_cf;
-	char 	job_df_next;
-	jobfile_t **job_df_list;
-};
-
-
-extern int	job_store(job_t *job);
-extern void	job_free(job_t *job);
-extern void	job_destroy(job_t *job);
-extern job_t	*job_retrieve(char *xfer_file, char *spool);
-extern job_t	**job_list_append(job_t **list, char *printer,
-					char *server, char *spool);
-extern int	vjob_match_attribute(char *attribute, __va_list ap);
-extern int	vjob_cancel(job_t *job, __va_list ap);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* !_JOB_H */
--- a/usr/src/lib/print/libprint/common/llib-lprint	Fri Aug 01 10:53:04 2008 -0700
+++ b/usr/src/lib/print/libprint/common/llib-lprint	Fri Aug 01 11:46:18 2008 -0700
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -53,75 +53,14 @@
 #include <syslog.h>
 #include <unistd.h>
 
-typedef struct _jobfile jobfile_t;
-typedef struct _job job_t;
-
-struct _jobfile {
-	char	*jf_spl_path;	/* df file */
-	char	*jf_src_path;	/* source file */
-	char	*jf_name;		/* title/name */
-	char	*jf_data;	/* ptr to mmapped file */
-	long	jf_size;		/* size of data */
-	char	jf_mmapped;	/* is this mmapped or malloced */
-};
-
-struct _job {
-	int	job_id;
-	char	*job_printer;
-	char	*job_server;
-	char	*job_user;
-	char	*job_host;
-	char	*job_spool_dir;
-	jobfile_t *job_cf;
-	char 	job_df_next;
-	jobfile_t **job_df_list;
-};
-
-int	job_store(job_t *job);
-void	job_free(job_t *job);
-void	job_destroy(job_t *job);
-job_t	*job_create(char *printer, char *server, char *spool);
-job_t	*job_retrieve(char *xfer_file, char *spool);
-job_t	**job_list_append(job_t **list, char *printer, char *spool);
-#ifndef SUNOS_4
-int	vjob_match_attribute(char *attribute, __va_list ap);
-int	vjob_cancel(job_t *job, __va_list ap);
-#endif
-
-
 void **list_append(void **, void *);
 void **list_append_unique(void **, void *, int (*)(void *, void*));
 void **list_concatenate(void **, void **);
 void * list_locate(void **, int (*)(void *, void *), void *);
 int list_iterate(void **, int (*)(void *, __va_list), ...);
 
-char * get_user_name(void);
-int	check_client_spool(char *printer);
-int	get_lock(char *name, int write_pid);
-uid_t	get_user_id(void);
-char	*strcdup(char *, char);
-char	*strndup(char *, int);
-char	**strsplit(char *, char *);
-int	file_size(char *);
-int	copy_file(char *src, char *dst);
-int	map_in_file(const char *name, char **buf);
-int	write_buffer(char *name, char *buf, int len);
-void	start_daemon(int do_fork);
-int	kill_process(char *file);
 void	*dynamic_function(const char *, const char *);
 
-int	net_open(char *host, int timeout);
-int	net_close(int nd);
-int	net_read(int nd, char *buf, int len);
-int	net_write(int nd, char *buf, int len);
-int	net_printf(int nd, char *fmt, ...);
-char	*net_gets(char *buf, int size, int nd);
-int	net_send_message(int nd, char *fmt, ...);
-int	net_response(int nd);
-int	net_send_file(int nd, char *name, char *data, int data_len,
-				int type);
-
-
 struct ns_bsd_addr {
 	char	*server;	/* server name */
 	char	*printer;	/* printer name or NULL */
--- a/usr/src/lib/print/libprint/common/mapfile-vers	Fri Aug 01 10:53:04 2008 -0700
+++ b/usr/src/lib/print/libprint/common/mapfile-vers	Fri Aug 01 11:46:18 2008 -0700
@@ -19,7 +19,7 @@
 # CDDL HEADER END
 #
 #
-# Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+# Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
 # Use is subject to license terms.
 #
 #ident	"%Z%%M%	%I%	%E% SMI"
@@ -72,36 +72,6 @@
 		list_locate;
 		list_iterate;
 
-		job_free;			# job support
-		job_destroy;
-		job_retrieve;
-		job_list_append;
-		vjob_match_attribute;
-		vjob_cancel;
-
-		net_open;			# net support
-		net_close;
-		net_read;
-		net_write;
-		net_printf;
-		net_gets;
-		net_send_message;
-		net_response;
-		net_send_file;
-
-		check_client_spool;		# misc support
-		get_lock;
-		get_user_id;
-		get_user_name;
-		strcdup;
-		strndup;
-		strsplit;
-		file_size;
-		copy_file;
-		map_in_file;
-		write_buffer;
-		start_daemon;
-		
 		files_put_printer;		# required for ns_put_printer()
 		nis_put_printer;
 		nisplus_put_printer;
--- a/usr/src/lib/print/libprint/common/misc.c	Fri Aug 01 10:53:04 2008 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,433 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
- * Use is subject to license terms.
- */
-
-#pragma ident	"%Z%%M%	%I%	%E% SMI"
-
-/*LINTLIBRARY*/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <signal.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <string.h>
-#include <pwd.h>
-#include <sys/mman.h>
-#include <time.h>
-#include <syslog.h>
-#include <errno.h>
-
-#include <misc.h>
-#include <job.h>
-#include <list.h>
-
-
-/*
- *	info about spool directory that we validate and fix
- */
-#define	ROOT_UID	0
-#define	LP_GID		8
-#define	SPOOL_MODE	(S_IFDIR|S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH)
-
-/*ARGSUSED*/
-int
-check_client_spool(char *printer)
-{
-	char *dir = SPOOL_DIR;
-	struct stat st;
-
-	if ((stat(dir, &st) < 0) && (errno == ENOENT)) {
-		syslog(LOG_ERR, "no spool dir, creating %s", dir);
-		if (mkdir(dir, 0755) < 0) {
-			syslog(LOG_ERR, "mkdir(%s): %m", dir);
-			return (-1);
-		}
-		if (chown(dir, ROOT_UID, LP_GID) < 0) {
-			syslog(LOG_ERR, "chown(%s): %m", dir);
-			return (-1);
-		}
-		return (0);
-	}
-	if ((st.st_uid != ROOT_UID) || (st.st_gid != LP_GID)) {
-		syslog(LOG_ERR,
-			"correcting spool directory owner/group (was %d/%d)",
-			st.st_uid, st.st_gid);
-		if (chown(dir, ROOT_UID, LP_GID) < 0) {
-			syslog(LOG_ERR, "chown(%s): %m", dir);
-			return (-1);
-		}
-	}
-	if (st.st_mode != (S_IFDIR | SPOOL_MODE)) {
-		syslog(LOG_ERR,
-			"spool dir (%s), incorrect permission (%0), correcting",
-			dir, st.st_mode);
-		if (chmod(dir, 0755) < 0) {
-			syslog(LOG_ERR, "chmod(%s): %m", dir);
-			return (-1);
-		}
-	}
-	return (0);
-}
-
-int
-get_lock(char *name, int write_pid)
-{
-	int	fd;
-
-	syslog(LOG_DEBUG, "get_lock(%s, %d)", ((name != NULL) ? name : "NULL"),
-		write_pid);
-	if ((fd = open(name, O_RDWR|O_CREAT, 0640)) < 0)
-		return (fd);
-
-	if (lockf(fd, F_TLOCK, 0) < 0) {
-		close(fd);
-		return (-1);
-	}
-
-	if (write_pid != 0) {
-		char	pid[16];
-
-		if (ftruncate(fd, 0) < 0) {
-			close(fd);
-			return (-1);
-		}
-		if (snprintf(pid, sizeof (pid), "%d\n", (int)getpid())
-			>= sizeof (pid)) {
-			syslog(LOG_ERR, "get_lock: pid buffer overflow");
-			return (-1);
-		}
-		write(fd, pid, strlen(pid));
-	}
-	(void) fsync(fd);
-
-	syslog(LOG_DEBUG, "get_lock(%s, %d) - have lock",
-		((name != NULL) ? name : "NULL"), write_pid);
-	return (fd);
-}
-
-uid_t
-get_user_id(char *name)
-{
-	struct passwd *p = NULL;
-
-	if (name == NULL)
-		return (-1);
-	if ((p = getpwnam(name)) != NULL)
-		return (p->pw_uid);
-	else if ((p = getpwnam("nobody")) != NULL)
-		return (p->pw_uid);
-	else
-		return (-2);
-}
-
-
-/*
- *  get_user_name()
- */
-char *
-get_user_name()
-{
-	struct passwd *p = NULL;
-
-	if ((p = getpwuid(getuid())) != NULL)
-		return (strdup(p->pw_name));
-	else
-		return (strdup("unknown"));
-}
-
-
-
-/*
- *  strcdup() - duplicate a string up to the first occurence of a character
- */
-char *
-strcdup(char *p, char c)
-{
-	char	*q,
-		*r;
-
-	if (p == NULL)
-		return (NULL);
-	if ((c == NULL) || ((q = strchr(p, c)) == NULL))
-		return (strdup(p));
-
-	if ((r = malloc((q - p) + 1)) != NULL)
-		(void) strlcpy(r, p, ((q - p) + 1));
-	return (r);
-}
-
-
-/*
- *	Should be obvious
- */
-char *
-strndup(char *s, int l)
-{
-	char *t;
-
-	if ((s == NULL) || (l < 1))
-		return (NULL);
-
-	if ((t = malloc(l + 1)) != NULL)
-		(void) strlcpy(t, s, (l + 1));
-	return (t);
-}
-
-
-/*
- *  file_size() - need I say more
- */
-int
-file_size(char *path)
-{
-	struct stat st;
-
-	if (stat(path, &st) < 0)
-		return (-1);
-	else
-		return (st.st_size);
-}
-
-
-/*
- *  copy_file() - need I say more
- */
-int
-copy_file(char *src, char *dst)
-{
-	char	*buf;
-	int	size;
-
-	syslog(LOG_DEBUG, "copy_file(%s, %s)", ((src != NULL) ? src : "NULL"),
-		((dst != NULL) ? dst : "NULL"));
-
-	if ((src == NULL) || (dst == NULL))
-		return (-1);
-
-	if ((size = map_in_file(src, &buf, 1)) < 0)
-		return (-1);
-	if (write_buffer(dst, buf, size) < 0) {
-		(void) munmap(buf, size);
-		return (-1);
-	}
-
-	(void) munmap(buf, size);
-	return (0);
-}
-
-int
-backup_file(char *name)
-{
-	char buf[BUFSIZ];
-
-	if (snprintf(buf, sizeof (buf), "%s-", name) >= sizeof (buf)) {
-		syslog(LOG_ERR, "libprint:backup_file: buffer overrun");
-		return (-1);
-	}
-	return (copy_file(name, buf));
-}
-
-/*
- *  map_in_file() - mmaps in a file into a buffer *buf.  returns the size of
- *	the mmapped buffer.
- */
-int
-map_in_file(const char *file, char **buf, int as_me)
-{
-	struct stat st;
-	int	fd;
-
-	syslog(LOG_DEBUG, "map_in_file(%s)", (file ? file : "NULL"));
-
-	if (buf == NULL)
-		return (-1);
-
-	if (as_me != 0)
-		seteuid(getuid());	/* if we are suid, lose privilege */
-
-	if ((fd = open(file, O_RDONLY)) < 0)
-		return (-1);
-
-	if (as_me != 0)
-		seteuid(0);	/* if we fail, didn't have privilege before */
-
-	if (fstat(fd, &st) < 0) {
-		close(fd);
-		return (-1);
-	}
-
-	if (st.st_size == 0) {
-		close(fd);
-		*buf = NULL;
-		return (0);
-	}
-
-	if ((*buf = mmap((caddr_t)0, (size_t)st.st_size, PROT_READ,
-			(MAP_PRIVATE | MAP_NORESERVE),
-			fd, (off_t)0)) == MAP_FAILED) {
-		syslog(LOG_ERR, "map_in_file(%s) - mmap:%m",
-			(file ? file : "NULL"));
-		close(fd);
-		return (-1);
-	}
-	close(fd);
-
-	syslog(LOG_DEBUG, "map_in_file(%s) - size(%d), addr(0x%x)",
-		(file ? file : "NULL"), st.st_size, *buf);
-	return (st.st_size);
-}
-
-
-/*
- *  write_buffer() - writes a buffer in memory out to the file name passed in.
- *	uses mmap and ftruncate to do this.
- */
-int
-write_buffer(char *file, char *buf, int len)
-{
-	int	fd;
-	char	*tmp;
-
-	syslog(LOG_DEBUG, "write_buffer(%s, 0x%x, %d)", (file ? file : "NULL"),
-		buf, len);
-
-	if ((fd = open(file, O_CREAT|O_EXCL|O_RDWR, 0640)) < 0)
-		return (-1);
-	if (ftruncate(fd, len) < 0) {
-		close(fd);
-		return (-1);
-	}
-	if ((tmp = mmap((caddr_t)0, (size_t)len, PROT_READ| PROT_WRITE,
-			(MAP_SHARED | MAP_NORESERVE),
-			fd, (off_t)0)) == MAP_FAILED) {
-		syslog(LOG_ERR, "write_buffer(%s, 0x%x, %d) - mmap:%m",
-			(file ? file : "NULL"), buf, len);
-		close(fd);
-		return (-1);
-	}
-	close(fd);
-
-	(void) memcpy(tmp, buf, len);
-	(void) munmap(tmp, len);
-
-	syslog(LOG_DEBUG, "write_buffer(%s, 0x%x, %d) - ok",
-		(file ? file : "NULL"), buf, len);
-
-	return (0);
-}
-
-
-/*
- *  start_daemon() - check for jobs queued, check if the lock is free.  If
- *	so, start a daemon either by forking and execing or just execing
- *	depending on the flag passed in.
- */
-void
-start_daemon(int do_fork)
-{
-	int	lock;
-	job_t	**jobs = NULL;
-
-	if ((jobs = job_list_append(NULL, NULL, NULL, SPOOL_DIR)) == NULL)
-		return;
-
-	list_iterate((void **)jobs, (VFUNC_T)job_free);
-	free(jobs);
-
-	close(lock = get_lock(MASTER_LOCK, 0));
-	if (lock < 0)
-		return;
-	if (do_fork == 0) {
-		(void) execle("/usr/lib/print/printd", MASTER_NAME, NULL, NULL);
-		syslog(LOG_ERR, "start_daemon() - execl: %m");
-		exit(-1);
-	} else
-		switch (fork()) {
-		case -1:
-			syslog(LOG_ERR, "start_daemon() - fork: %m");
-			exit(-1);
-			/* NOTREACHED */
-		case 0:
-			break;
-		default:
-			(void) execl("/usr/lib/print/printd", MASTER_NAME,
-					NULL);
-			syslog(LOG_ERR, "start_daemon() - execl: %m");
-			exit(-1);
-			/* NOTREACHED */
-		}
-
-}
-
-
-/*
- *  kill_daemon() - read the master lock file and send SIGTERM to the process
- *	id stored in the file.
- */
-int
-kill_process(char *file)
-{
-	int	fd,
-		pid;
-	char	buf[BUFSIZ],
-		*p;
-
-	if ((fd = open(file, O_RDONLY)) < 0)
-		return (-1);
-
-	(void) memset(buf, NULL, sizeof (buf));
-	if (read(fd, buf, sizeof (buf)) <= 0)
-		return (-1);
-
-	if ((p = strchr(buf, '\n')) == NULL) {	/* skip the 1st line */
-		close(fd);
-		return (-1);
-	}
-	pid = atoi(++p);		/* convert the PID */
-
-	if ((pid < 2) || (kill(pid, SIGTERM) < 0)) {
-		close(fd);
-		return (-1);
-	}
-	close(fd);
-	return (0);
-}
-
-
-char **
-strsplit(char *string, char *seperators)
-{
-	char **list = NULL;
-	char *where = NULL;
-	char *element;
-
-	for (element = strtok_r(string, seperators, &where); element != NULL;
-	    element = strtok_r(NULL, seperators, &where))
-		list = (char **)list_append((void **)list, element);
-
-	return (list);
-}
--- a/usr/src/lib/print/libprint/common/misc.h	Fri Aug 01 10:53:04 2008 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,73 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
- * Use is subject to license terms.
- */
-
-#ifndef	_MISC_H
-#define	_MISC_H
-
-#pragma ident	"%Z%%M%	%I%	%E% SMI"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Protocol Defined Requests */
-#define	PRINT_REQUEST		1	/* \1printer\n */
-#define	XFER_REQUEST		2	/* \2printer\n */
-#define	    XFER_CLEANUP	1 	/* \1 */
-#define	    XFER_CONTROL	2	/* \2size name\n */
-#define	    XFER_DATA		3	/* \3size name\n */
-
-#define	SHOW_QUEUE_SHORT_REQUEST 3	/* \3printer [users|jobs ...]\n */
-#define	SHOW_QUEUE_LONG_REQUEST  4	/* \4printer [users|jobs ...]\n */
-#define	REMOVE_REQUEST	    5	/* \5printer person [users|jobs ...]\n */
-
-#define	ACK_BYTE	0
-#define	NACK_BYTE	1
-
-#define	MASTER_NAME	"printd"
-#define	MASTER_LOCK	"/var/spool/print/.printd.lock"
-#define	SPOOL_DIR	"/var/spool/print"
-#define	TBL_NAME	"printers.conf"
-
-
-extern int check_client_spool(char *printer);
-extern int get_lock(char *name, int write_pid);
-extern uid_t get_user_id();
-extern char *get_user_name();
-extern char *strcdup(char *, char);
-extern char *strndup(char *, int);
-extern char **strsplit(char *, char *);
-extern int  file_size(char *);
-extern int  copy_file(char *src, char *dst);
-extern int  map_in_file(const char *name, char **buf, int as_me);
-extern int  write_buffer(char *name, char *buf, int len);
-extern void start_daemon(int do_fork);
-extern int  kill_process(char *file);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _MISC_H */
--- a/usr/src/lib/print/libprint/common/network.c	Fri Aug 01 10:53:04 2008 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,418 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
- * Use is subject to license terms.
- */
-
-#pragma ident	"%Z%%M%	%I%	%E% SMI"
-
-/*LINTLIBRARY*/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <stdarg.h>
-#include <unistd.h>
-#include <string.h>
-#include <signal.h>
-#include <sys/mman.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <netdb.h>
-#include <errno.h>
-#include <syslog.h>
-#include <sys/utsname.h>
-
-#include <network.h>
-#include <misc.h>
-
-static int read_wait_time_sec = 300;
-static int write_wait_time_sec = 10;
-
-/*
- *	This module implements a set of functions to handle network
- *	communications.  It attempts to hide any "uglyness" that might be
- *	necessary for such communications.
- */
-
-
-/*
- *  null() is to be used as a signal handler that does nothing.  It is used in
- *	place of SIG_IGN, because we want the signal to be delivered and
- *	interupt the current system call.
- */
-static void
-null(int i)
-{
-	syslog(LOG_DEBUG, "null(%d)", i);
-}
-
-/*
- *  net_open() opens a tcp connection to the printer port on the host specified
- *	in the arguments passed in.  If the connection is not made in the
- *	timeout (in seconds) passed in, an error it returned.  If the host is
- *	unknown, an error is returned.  If all is well, a file descriptor is
- *	returned to be used for future communications.
- */
-int
-net_open(char *host, int timeout)
-{
-	struct hostent *hp;
-	struct servent *sp;
-	struct sockaddr_in6 sin;
-	void (*old_handler)();
-	static struct utsname uts;
-
-	int	s,
-		lport,
-		err,
-		error_num;
-	unsigned timo = 1;
-
-	syslog(LOG_DEBUG, "net_open(%s, %d)", (host != NULL ? host : "NULL"),
-		timeout);
-	/*
-	 * Get the host address and port number to connect to.
-	 */
-	if (host == NULL) {
-		return (-1);
-	}
-
-	(void) memset((char *)&sin, NULL, sizeof (sin));
-	if ((hp = getipnodebyname(host, AF_INET6, AI_DEFAULT,
-		    &error_num)) == NULL) {
-		syslog(LOG_DEBUG|LOG_ERR, "unknown host %s "
-		    "getipnodebyname() returned %d", host, error_num);
-		return (NETWORK_ERROR_HOST);
-	}
-	(void) memcpy((caddr_t)&sin.sin6_addr, hp->h_addr, hp->h_length);
-	sin.sin6_family = hp->h_addrtype;
-	freehostent(hp);
-
-	if ((sp = getservbyname("printer", "tcp")) == NULL) {
-		syslog(LOG_DEBUG|LOG_ERR, "printer/tcp: unknown service");
-		return (NETWORK_ERROR_SERVICE);
-	}
-	sin.sin6_port = sp->s_port;
-
-retry:
-	/*
-	 * Try connecting to the server.
-	 *
-	 * Use 0 as lport means that rresvport_af() will bind to a port in
-	 * the anonymous privileged port range.
-	 */
-	lport = 0;
-	s = rresvport_af(&lport, AF_INET6);
-	if (s < 0)
-		return (NETWORK_ERROR_PORT);
-
-	old_handler = signal(SIGALRM, null);
-	(void) alarm(timeout);
-	if (connect(s, (struct sockaddr *)&sin, sizeof (sin)) < 0) {
-		(void) alarm(0);
-		(void) signal(SIGALRM, old_handler);
-		err = errno;
-		(void) close(s);
-		errno = err;
-		if (errno == EADDRINUSE) {
-			goto retry;
-		}
-		/*
-		 * If connecting to the local system fails, try
-		 * again with "localhost" address instead.
-		 */
-		if (uts.nodename[0] == '\0')
-			(void) uname(&uts);
-		if (strcmp(host, uts.nodename) == 0) {
-			IN6_IPADDR_TO_V4MAPPED(htonl(INADDR_LOOPBACK),
-			    &sin.sin6_addr);
-			sin.sin6_family = AF_INET6;
-			goto retry;
-		}
-		if (errno == ECONNREFUSED && timo <= 16) {
-			(void) sleep(timo);
-			timo *= 2;
-			goto retry;
-		}
-		return (NETWORK_ERROR_UNKNOWN);
-	}
-	(void) alarm(0);
-	(void) signal(SIGALRM, old_handler);
-	return (s);
-}
-
-
-/*
- *  net_close() closes a TCP connection opened by net_open()
- */
-int
-net_close(int nd)
-{
-	syslog(LOG_DEBUG, "net_close(%d)", nd);
-	return (close(nd));
-}
-
-/*
- *  net_read() reads up to the length specified into the buffer supplied from
- *	the network connection specified
- */
-int
-net_read(int nd, char *buf, int len)
-{
-	int rc;
-	void (*old_handler)();
-
-	syslog(LOG_DEBUG, "net_read(%d, 0x%x, %d)", nd, buf, len);
-	old_handler = signal(SIGALRM, null);
-	(void) alarm(read_wait_time_sec);
-	rc = read(nd, buf, len);
-	(void) alarm(0);
-	(void) signal(SIGALRM, old_handler);
-	return (rc);
-}
-
-
-/*
- *  net_write() writes the buffer specified out to the network connection
- *	supplied.
- */
-int
-net_write(int nd, char *buf, int len)
-{
-	int rc;
-	void (*old_handler)();
-
-	syslog(LOG_DEBUG, "net_write(%d, 0x%x, %d)", nd, buf, len);
-	old_handler = signal(SIGALRM, null);
-	(void) alarm(write_wait_time_sec);
-	rc = write(nd, buf, len);
-	(void) alarm(0);
-	(void) signal(SIGALRM, old_handler);
-	return (rc);
-}
-
-
-/*
- *  net_response() reads in a byte from the network connection and
- *	returns -1 if it isn't 0.
- */
-int
-net_response(int nd)
-{
-	char	c;
-
-	syslog(LOG_DEBUG, "net_response(%d)", nd);
-	if ((net_read(nd, &c, 1) != 1) || c) {
-		errno = EIO;
-		return (-1);
-	}
-	return (0);
-}
-
-/*
- *  net_printf() sends a text message out to the network connection supplied
- *	using the same semantics as printf(3C) for stdio.
- */
-/*PRINTFLIKE2*/
-int
-net_printf(int nd, char *fmt, ...)
-{
-	char *buf;
-	va_list	ap;
-	int err;
-	int size;
-	int rc;
-
-	syslog(LOG_DEBUG, "net_printf(%d, %s, ...)", nd, fmt);
-
-	if ((buf = malloc(BUFSIZ)) == NULL) {
-		err = errno;
-		syslog(LOG_DEBUG, "net_printf malloc failed");
-		errno = err;
-		return (-1);
-	}
-
-	va_start(ap, fmt);
-	size = vsnprintf(buf, BUFSIZ, fmt, ap);
-	if (size >= BUFSIZ) {
-		if ((buf = (char *)realloc(buf, size + 2)) == NULL) {
-			err = errno;
-			syslog(LOG_DEBUG, "net_printf malloc failed");
-			errno = err;
-			return (-1);
-		}
-		size = vsnprintf(buf, size + 1, fmt, ap);
-	}
-	va_end(ap);
-
-
-	rc = net_write(nd, buf, (int)strlen(buf));
-	free(buf);
-	return (rc);
-}
-
-/*
- *  net_gets() read from the network connection until either a newline
- *	is encountered, or the buffer passed in is full.  This is similiar
- *	to fgets(3C)
- */
-char *
-net_gets(char *buf, int bufSize, int nd)
-{
-	char	tmp;
-	int	count = 0;
-
-	syslog(LOG_DEBUG, "net_gets(0x%x, %d, %d)",  buf, bufSize, nd);
-	(void) memset(buf, NULL, bufSize);
-	while ((count < bufSize) && (net_read(nd, &tmp, 1) > 0))
-		if ((buf[count++] = tmp) == '\n') break;
-
-	if (count != 0)
-		return (buf);
-	return (NULL);
-}
-
-
-/*
- *  net_send_message() sends a message out the network connection using
- *	net_printf() and returns the result from net_response()
- */
-/*PRINTFLIKE2*/
-int
-net_send_message(int nd, char *fmt, ...)
-{
-	char	buf[BUFSIZ];
-	va_list	ap;
-
-	syslog(LOG_DEBUG, "net_send_message(%d, %s, ...)", nd, fmt);
-	va_start(ap, fmt);
-	if (vsnprintf(buf, sizeof (buf), fmt, ap) >= sizeof (buf)) {
-		syslog(LOG_ERR, "libprint:net_send_message: buffer overrun");
-		return (-1);
-	}
-	va_end(ap);
-
-	if (net_write(nd, buf, (int)((strlen(buf) != 0) ? strlen(buf) : 1)) < 0)
-		return (-1);
-	return (net_response(nd));
-}
-
-
-/*
- *  net_send_file() sends the appropriate rfc1179 file transfer sub message
- *	to notify the remote side it is sending a file.  It then sends the
- *	file if the remote side responds that it is ready.  If the remote side
- *	can't accept the file an error is returned.  If the transfer fails,
- *	an error is returned.
- */
-int
-net_send_file(int nd, char *name, char *data, int data_size, int type)
-{
-	char	*truncated_name,
-		*mptr,
-		*fileBuf = NULL;
-	int	count,
-		retries = 0,
-		size,
-		tmperrno;
-
-	syslog(LOG_DEBUG, "net_send_file(%d, %s, 0x%x, %d, %d)", nd,
-		(name ? name : "NULL"), data, data_size, type);
-	if ((truncated_name = (char *)strrchr(name, '/')) == NULL)
-		truncated_name = name;
-	else
-		truncated_name++;
-
-
-	if (data == NULL) {
-		size = map_in_file(name, &fileBuf, 1);
-		mptr = fileBuf;
-	} else {
-		mptr = data;
-		size = data_size;
-	}
-
-	if (size < 0) {
-		tmperrno = errno; /* because syslog() can change errno */
-		syslog(LOG_DEBUG, "net_send_file(%d, %s, 0x%x, %d, %d): %m", nd,
-			(name ? name : "NULL"), data, data_size, type);
-		errno = tmperrno;
-		return (NETWORK_ERROR_UNKNOWN);
-	}
-
-						/* send XFER command */
-	if (net_send_message(nd, "%c%d %s\n", type, size,
-				truncated_name) != 0) {
-		(void) munmap(fileBuf, size);
-		errno = EIO;
-		return (NETWORK_ERROR_SEND_RESPONSE);
-	}
-
-						/* send DATA and ACK */
-	count = size;
-	while (count > 0) {
-		int	rc;
-
-		rc = net_write(nd, mptr, count);
-
-		if (rc < 0) {
-			if (retries++ < 5) {
-				/*
-				 * save/restore errno;
-				 * will lose if syslogd down
-				 */
-				tmperrno = errno;
-				syslog(LOG_DEBUG,
-				    "net_send_file error on write: %m %d",
-					retries);
-				errno = tmperrno;
-				continue;
-			}
-			/* save/restore errno; will lose if syslogd down */
-			tmperrno = errno;
-			syslog(LOG_DEBUG, "net_send_file error on write: %m");
-			if (fileBuf != NULL)
-				(void) munmap(fileBuf, size);
-			errno = tmperrno;
-			return (-1);
-
-		} else {
-			count -= rc;
-			mptr += rc;
-			retries = 0;
-		}
-	}
-
-	if (fileBuf != NULL)
-		(void) munmap(fileBuf, size);
-
-	if (net_send_message(nd, "", NULL) != 0) {
-		errno = EIO;
-		return (NETWORK_ERROR_SEND_FAILED);
-	}
-
-	return (0);
-}
--- a/usr/src/lib/print/libprint/common/network.h	Fri Aug 01 10:53:04 2008 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,60 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
- * Use is subject to license terms.
- */
-
-#ifndef _NETWORK_H
-#define	_NETWORK_H
-
-#pragma ident	"%Z%%M%	%I%	%E% SMI"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define	NETWORK_ERROR_UNKNOWN		-1
-#define	NETWORK_ERROR_HOST		-2
-#define	NETWORK_ERROR_SERVICE		-3
-#define	NETWORK_ERROR_PORT		-4
-#define	NETWORK_ERROR_SEND_RESPONSE	-5
-#define	NETWORK_ERROR_SEND_FAILED	-6
-
-#define	ACK(fd)	net_write(fd, "", 1);
-#define	NACK(fd) net_write(fd, "\1", 1);
-
-extern int	net_open(char *host, int timeout);
-extern int	net_close(int nd);
-extern int	net_read(int nd, char *buf, int len);
-extern int	net_write(int nd, char *buf, int len);
-extern int	net_printf(int nd, char *fmt, ...);
-extern char	*net_gets(char *buf, int size, int nd);
-extern int	net_send_message(int nd, char *fmt, ...);
-extern int	net_response(int nd);
-extern int	net_send_file(int nd, char *name, char *data, int data_len,
-				int type);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _NETWORK_H */
--- a/usr/src/lib/print/libprint/common/ns.c	Fri Aug 01 10:53:04 2008 -0700
+++ b/usr/src/lib/print/libprint/common/ns.c	Fri Aug 01 11:46:18 2008 -0700
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -39,7 +39,6 @@
 
 #include <ns.h>
 #include <list.h>
-#include <misc.h>
 
 
 /*
--- a/usr/src/lib/print/libprint/common/ns_bsd_addr.c	Fri Aug 01 10:53:04 2008 -0700
+++ b/usr/src/lib/print/libprint/common/ns_bsd_addr.c	Fri Aug 01 11:46:18 2008 -0700
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -37,7 +37,20 @@
 
 #include <ns.h>
 #include <list.h>
-#include <misc.h>
+
+static char **
+strsplit(char *string, char *seperators)
+{
+	char **list = NULL;
+	char *where = NULL;
+	char *element;
+
+	for (element = strtok_r(string, seperators, &where); element != NULL;
+	    element = strtok_r(NULL, seperators, &where))
+		list = (char **)list_append((void **)list, element);
+
+	return (list);
+}
 
 /*
  *	Manipulate bsd_addr structures
--- a/usr/src/lib/print/libprint/common/nss_convert.c	Fri Aug 01 10:53:04 2008 -0700
+++ b/usr/src/lib/print/libprint/common/nss_convert.c	Fri Aug 01 11:46:18 2008 -0700
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -40,7 +40,6 @@
 
 #include <ns.h>
 #include <list.h>
-#include <misc.h>
 
 #define	ESCAPE_CHARS	"\\\n=:"	/* \, \n, =, : */
 
--- a/usr/src/lib/print/libprint/common/nss_ldap.c	Fri Aug 01 10:53:04 2008 -0700
+++ b/usr/src/lib/print/libprint/common/nss_ldap.c	Fri Aug 01 11:46:18 2008 -0700
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -41,7 +41,6 @@
 
 #include <ns.h>
 #include <list.h>
-#include <misc.h>
 
 #define	LDAP_REFERRALS
 #include <lber.h>
--- a/usr/src/lib/print/libprint/common/nss_write.c	Fri Aug 01 10:53:04 2008 -0700
+++ b/usr/src/lib/print/libprint/common/nss_write.c	Fri Aug 01 11:46:18 2008 -0700
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -41,7 +41,6 @@
 
 #include <ns.h>
 #include <list.h>
-#include <misc.h>
 
 /*  escaped chars include delimiters and shell meta characters */
 #define	ESCAPE_CHARS	"\\\n=: `&;|>^$()<*?["
--- a/usr/src/tools/pmodes/exceptions.h	Fri Aug 01 10:53:04 2008 -0700
+++ b/usr/src/tools/pmodes/exceptions.h	Fri Aug 01 11:46:18 2008 -0700
@@ -2,9 +2,8 @@
  * CDDL HEADER START
  *
  * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License").  You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
  *
  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  * or http://www.opensolaris.org/os/licensing.
@@ -20,8 +19,8 @@
  * CDDL HEADER END
  */
 /*
- * Copyright (c) 1999-2001 by Sun Microsystems, Inc.
- * All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
+ * Use is subject to license terms.
  *
  * $Id: exceptions.h,v 1.11 2000/01/13 14:12:58 casper Exp $
  *
@@ -57,6 +56,9 @@
 	"/var/spool/lp/requests",
 	"/var/spool/lp/system",
 
+	/* CUPS */
+	"/var/cache/cups",
+
 	/* another strange logfile */
 	"/usr/oasys/tmp/TERRLOG",