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.
--- /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",