355b4669e025ff377602b6fc7caaf30dbc218371jacobs/*
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * CDDL HEADER START
355b4669e025ff377602b6fc7caaf30dbc218371jacobs *
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * The contents of this file are subject to the terms of the
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * Common Development and Distribution License (the "License").
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * You may not use this file except in compliance with the License.
355b4669e025ff377602b6fc7caaf30dbc218371jacobs *
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * or http://www.opensolaris.org/os/licensing.
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * See the License for the specific language governing permissions
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * and limitations under the License.
355b4669e025ff377602b6fc7caaf30dbc218371jacobs *
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * When distributing Covered Code, include this CDDL HEADER in each
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * If applicable, add the following below this CDDL HEADER, with the
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * fields enclosed by brackets "[]" replaced with your own identifying
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * information: Portions Copyright [yyyy] [name of copyright owner]
355b4669e025ff377602b6fc7caaf30dbc218371jacobs *
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * CDDL HEADER END
355b4669e025ff377602b6fc7caaf30dbc218371jacobs */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs/*
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * Use is subject to license terms.
355b4669e025ff377602b6fc7caaf30dbc218371jacobs *
355b4669e025ff377602b6fc7caaf30dbc218371jacobs */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs/* $Id: lpd-job.c 157 2006-04-26 15:07:55Z ktou $ */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#define __EXTENSIONS__ /* for strtok_r() */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <stdio.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <stdlib.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <unistd.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <errno.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <limits.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <sys/types.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <sys/stat.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <fcntl.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <string.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <pwd.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <libintl.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <papi_impl.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobsenum { LPD_RFC, LPD_SVR4 };
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobsstatic char
355b4669e025ff377602b6fc7caaf30dbc218371jacobsmime_type_to_rfc1179_type(char *mime)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs static struct { char *mime; char rfc; } cvt[] = {
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs { "text/plain", 'f' },
355b4669e025ff377602b6fc7caaf30dbc218371jacobs { "application/octet-stream", 'l' },
355b4669e025ff377602b6fc7caaf30dbc218371jacobs { "application/postscript", 'f' }, /* rfc incorrectly has 'o' */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs { "application/x-pr", 'p' },
355b4669e025ff377602b6fc7caaf30dbc218371jacobs { "application/x-cif", 'c' },
355b4669e025ff377602b6fc7caaf30dbc218371jacobs { "application/x-dvi", 'd' },
355b4669e025ff377602b6fc7caaf30dbc218371jacobs { "application/x-fortran", 'r' },
355b4669e025ff377602b6fc7caaf30dbc218371jacobs { "application/x-plot", 'g' },
355b4669e025ff377602b6fc7caaf30dbc218371jacobs { "application/x-ditroff", 'n' },
355b4669e025ff377602b6fc7caaf30dbc218371jacobs { "application/x-troff", 't' },
355b4669e025ff377602b6fc7caaf30dbc218371jacobs { "application/x-raster", 'v' },
355b4669e025ff377602b6fc7caaf30dbc218371jacobs { NULL, 0}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs };
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char result = '\0';
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (mime != NULL) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs int i;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs for (i = 0; cvt[i].mime != NULL; i++)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (strcasecmp(cvt[i].mime, mime) == 0) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs result = cvt[i].rfc;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs break;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (result);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobsstatic papi_status_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobsadd_lpd_control_line(char **metadata, char code, char *value)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs size_t size = 0;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char line[BUFSIZ];
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((metadata == NULL) || (value == NULL))
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_BAD_REQUEST);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (*metadata != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs size = strlen(*metadata);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs size += strlen(value) + 3;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (*metadata == NULL) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs *metadata = (char *)calloc(1, size);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs } else {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs void *tmp;
c1ecd8b9404ee0d96d93f02e82c441b9bb149a3djacobs tmp = calloc(1, size);
c1ecd8b9404ee0d96d93f02e82c441b9bb149a3djacobs if (tmp) {
c1ecd8b9404ee0d96d93f02e82c441b9bb149a3djacobs strlcpy(tmp, *metadata, size);
c1ecd8b9404ee0d96d93f02e82c441b9bb149a3djacobs free(*metadata);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs *metadata = (char *)tmp;
c1ecd8b9404ee0d96d93f02e82c441b9bb149a3djacobs } else
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_TEMPORARY_ERROR);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs snprintf(line, sizeof (line), "%c%s\n", code, value);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs strlcat(*metadata, line, size);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_OK);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobsstatic papi_status_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobsadd_svr4_control_line(char **metadata, char code, char *value)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char line[BUFSIZ];
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((metadata == NULL) || (value == NULL))
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_BAD_REQUEST);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs snprintf(line, sizeof (line), "%c%s", code, value);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (add_lpd_control_line(metadata, '5', line));
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobsstatic papi_status_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobsadd_hpux_control_line(char **metadata, char *value)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char line[BUFSIZ];
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((metadata == NULL) || (value == NULL))
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_BAD_REQUEST);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs snprintf(line, sizeof (line), " O%s", value);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (add_lpd_control_line(metadata, 'N', line));
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobsstatic papi_status_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobsadd_int_control_line(char **metadata, char code, int value, int flag)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char buf[16];
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs snprintf(buf, sizeof (buf), "%d", value);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (flag == LPD_SVR4)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (add_svr4_control_line(metadata, code, buf));
355b4669e025ff377602b6fc7caaf30dbc218371jacobs else
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (add_lpd_control_line(metadata, code, buf));
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobsstatic papi_status_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobslpd_add_rfc1179_attributes(service_t *svc, papi_attribute_t **attributes,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char **metadata, papi_attribute_t ***used)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_status_t status = PAPI_OK;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char *s;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs int integer;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char bool;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char host[BUFSIZ];
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char *user = "nobody";
355b4669e025ff377602b6fc7caaf30dbc218371jacobs uid_t uid = getuid();
355b4669e025ff377602b6fc7caaf30dbc218371jacobs struct passwd *pw;
286caa64ad16838107c004ca772b1d153e7c7510Keerthi Kondaka char *h1;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (svc == NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_BAD_REQUEST);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* There is nothing to do */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (attributes == NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_OK);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs gethostname(host, sizeof (host));
286caa64ad16838107c004ca772b1d153e7c7510Keerthi Kondaka if (papiAttributeListGetString(attributes, NULL,
286caa64ad16838107c004ca772b1d153e7c7510Keerthi Kondaka "job-originating-host-name", &h1) == PAPI_OK) {
286caa64ad16838107c004ca772b1d153e7c7510Keerthi Kondaka papiAttributeListAddString(&attributes, PAPI_ATTR_APPEND,
286caa64ad16838107c004ca772b1d153e7c7510Keerthi Kondaka "job-host", h1);
286caa64ad16838107c004ca772b1d153e7c7510Keerthi Kondaka }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs add_lpd_control_line(metadata, 'H', host);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListAddString(used, PAPI_ATTR_EXCL,
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes "job-originating-host-name", host);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((pw = getpwuid(uid)) != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs user = pw->pw_name;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (uid == 0)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListGetString(svc->attributes, NULL, "username",
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes &user);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs add_lpd_control_line(metadata, 'P', user);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListAddString(used, PAPI_ATTR_EXCL,
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes "job-originating-user-name", user);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* Class for Banner Page */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs s = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListGetString(attributes, NULL, "rfc-1179-class", &s);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (s != NULL) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs add_lpd_control_line(metadata, 'C', s);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListAddString(used, PAPI_ATTR_EXCL,
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes "rfc-1179-class", s);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* Print Banner Page */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs s = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListGetString(attributes, NULL, "job-sheets", &s);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((s != NULL) && (strcmp(s, "standard") == 0)) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs add_lpd_control_line(metadata, 'L', user);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListAddString(used, PAPI_ATTR_EXCL,
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes "job-sheets", s);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* Jobname */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs s = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListGetString(attributes, NULL, "job-name", &s);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (s != NULL) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs add_lpd_control_line(metadata, 'J', s);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListAddString(used, PAPI_ATTR_EXCL,
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes "job-name", s);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* User to mail when job is done - lpr -m */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs bool = PAPI_FALSE;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListGetBoolean(attributes, NULL, "rfc-1179-mail", &bool);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (bool == PAPI_TRUE) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs add_lpd_control_line(metadata, 'M', user);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListAddBoolean(used, PAPI_ATTR_EXCL,
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes "rfc-1179-mail", bool);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* Title for pr */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs s = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListGetString(attributes, NULL, "pr-title", &s);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (s != NULL) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs add_lpd_control_line(metadata, 'T', s);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListAddString(used, PAPI_ATTR_EXCL,
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes "pr-title", s);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* Indent - used with pr filter */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs integer = 0;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListGetInteger(attributes, NULL, "pr-indent", &integer);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (integer >= 1) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs add_int_control_line(metadata, 'I', integer, LPD_RFC);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListAddInteger(used, PAPI_ATTR_EXCL,
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes "pr-indent", integer);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* Width - used with pr filter */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs integer = 0;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListGetInteger(attributes, NULL, "pr-width", &integer);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (integer >= 1) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs add_int_control_line(metadata, 'W', integer, LPD_RFC);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListAddInteger(used, PAPI_ATTR_EXCL,
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes "pr-width", integer);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* file with Times Roman font lpr -1 */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs s = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListGetString(attributes, NULL, "rfc-1179-font-r", &s);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (s != NULL) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs add_lpd_control_line(metadata, '1', s);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListAddString(used, PAPI_ATTR_EXCL,
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes "rfc-1179-font-r", s);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* file with Times Roman font lpr -2 */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs s = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListGetString(attributes, NULL, "rfc-1179-font-i", &s);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (s != NULL) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs add_lpd_control_line(metadata, '2', s);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListAddString(used, PAPI_ATTR_EXCL,
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes "rfc-1179-font-i", s);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* file with Times Roman font lpr -3 */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs s = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListGetString(attributes, NULL, "rfc-1179-font-b", &s);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (s != NULL) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs add_lpd_control_line(metadata, '3', s);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListAddString(used, PAPI_ATTR_EXCL,
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes "rfc-1179-font-b", s);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* file with Times Roman font lpr -4 */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs s = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListGetString(attributes, NULL, "rfc-1179-font-s", &s);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (s != NULL) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs add_lpd_control_line(metadata, '4', s);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListAddString(used, PAPI_ATTR_EXCL,
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes "rfc-1179-font-s", s);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
b657fff74acfeed123d06540dcbf2ebf0f4ebee9"Nagaraj Yedathore - Sun Microsystems - Bangalore India" /*
b657fff74acfeed123d06540dcbf2ebf0f4ebee9"Nagaraj Yedathore - Sun Microsystems - Bangalore India" * The document format needs to be added, but the control line
b657fff74acfeed123d06540dcbf2ebf0f4ebee9"Nagaraj Yedathore - Sun Microsystems - Bangalore India" * should be added when the filenames are figured out.
b657fff74acfeed123d06540dcbf2ebf0f4ebee9"Nagaraj Yedathore - Sun Microsystems - Bangalore India" */
b657fff74acfeed123d06540dcbf2ebf0f4ebee9"Nagaraj Yedathore - Sun Microsystems - Bangalore India" s = NULL;
b657fff74acfeed123d06540dcbf2ebf0f4ebee9"Nagaraj Yedathore - Sun Microsystems - Bangalore India" papiAttributeListGetString(attributes, NULL, "document-format", &s);
b657fff74acfeed123d06540dcbf2ebf0f4ebee9"Nagaraj Yedathore - Sun Microsystems - Bangalore India" if (s != NULL) {
b657fff74acfeed123d06540dcbf2ebf0f4ebee9"Nagaraj Yedathore - Sun Microsystems - Bangalore India" papiAttributeListAddString(used, PAPI_ATTR_EXCL,
b657fff74acfeed123d06540dcbf2ebf0f4ebee9"Nagaraj Yedathore - Sun Microsystems - Bangalore India" "document-format", s);
b657fff74acfeed123d06540dcbf2ebf0f4ebee9"Nagaraj Yedathore - Sun Microsystems - Bangalore India" }
b657fff74acfeed123d06540dcbf2ebf0f4ebee9"Nagaraj Yedathore - Sun Microsystems - Bangalore India"
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (status);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
fd06a699040f011e80ab8ac5213bb0a47858e69bjacobsstatic char *
fd06a699040f011e80ab8ac5213bb0a47858e69bjacobsunused_attributes(papi_attribute_t **list, papi_attribute_t **used)
fd06a699040f011e80ab8ac5213bb0a47858e69bjacobs{
fd06a699040f011e80ab8ac5213bb0a47858e69bjacobs char *result = NULL;
fd06a699040f011e80ab8ac5213bb0a47858e69bjacobs char **names = NULL;
fd06a699040f011e80ab8ac5213bb0a47858e69bjacobs int i;
fd06a699040f011e80ab8ac5213bb0a47858e69bjacobs
fd06a699040f011e80ab8ac5213bb0a47858e69bjacobs if ((list == NULL) || (used == NULL))
fd06a699040f011e80ab8ac5213bb0a47858e69bjacobs return (NULL);
fd06a699040f011e80ab8ac5213bb0a47858e69bjacobs
fd06a699040f011e80ab8ac5213bb0a47858e69bjacobs for (i = 0; used[i] != NULL; i++)
fd06a699040f011e80ab8ac5213bb0a47858e69bjacobs list_append(&names, used[i]->name);
fd06a699040f011e80ab8ac5213bb0a47858e69bjacobs
fd06a699040f011e80ab8ac5213bb0a47858e69bjacobs if (names != NULL) {
fd06a699040f011e80ab8ac5213bb0a47858e69bjacobs papi_attribute_t **unused = NULL;
fd06a699040f011e80ab8ac5213bb0a47858e69bjacobs
fd06a699040f011e80ab8ac5213bb0a47858e69bjacobs /* add these to the list of things to ignore */
fd06a699040f011e80ab8ac5213bb0a47858e69bjacobs list_append(&names, "document-format");
fd06a699040f011e80ab8ac5213bb0a47858e69bjacobs list_append(&names, "copies");
fd06a699040f011e80ab8ac5213bb0a47858e69bjacobs
fd06a699040f011e80ab8ac5213bb0a47858e69bjacobs split_and_copy_attributes(names, list, NULL, &unused);
fd06a699040f011e80ab8ac5213bb0a47858e69bjacobs if (unused != NULL) {
fd06a699040f011e80ab8ac5213bb0a47858e69bjacobs size_t size = 0;
fd06a699040f011e80ab8ac5213bb0a47858e69bjacobs
fd06a699040f011e80ab8ac5213bb0a47858e69bjacobs do {
fd06a699040f011e80ab8ac5213bb0a47858e69bjacobs size += 1024;
fd06a699040f011e80ab8ac5213bb0a47858e69bjacobs if (result != NULL)
fd06a699040f011e80ab8ac5213bb0a47858e69bjacobs free(result);
fd06a699040f011e80ab8ac5213bb0a47858e69bjacobs result = calloc(1, size);
fd06a699040f011e80ab8ac5213bb0a47858e69bjacobs } while (papiAttributeListToString(unused, " ",
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes result, size) != PAPI_OK);
fd06a699040f011e80ab8ac5213bb0a47858e69bjacobs papiAttributeListFree(unused);
fd06a699040f011e80ab8ac5213bb0a47858e69bjacobs }
fd06a699040f011e80ab8ac5213bb0a47858e69bjacobs free(names);
fd06a699040f011e80ab8ac5213bb0a47858e69bjacobs }
fd06a699040f011e80ab8ac5213bb0a47858e69bjacobs
fd06a699040f011e80ab8ac5213bb0a47858e69bjacobs return (result);
fd06a699040f011e80ab8ac5213bb0a47858e69bjacobs}
fd06a699040f011e80ab8ac5213bb0a47858e69bjacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs/*
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * lpd_add_svr4_attributes
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * Solaris 2.x LP - BSD protocol extensions
355b4669e025ff377602b6fc7caaf30dbc218371jacobs */
355b4669e025ff377602b6fc7caaf30dbc218371jacobsstatic papi_status_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobslpd_add_svr4_attributes(service_t *svc, papi_attribute_t **attributes,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char **metadata, papi_attribute_t ***used)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
43b9c05035ac59f7f7a8e7827598db5a15f30ed3jacobs papi_attribute_t *tmp[2];
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char *s;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs int integer;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (svc == NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_BAD_REQUEST);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* media */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs s = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListGetString(attributes, NULL, "media", &s);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (s != NULL) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs add_svr4_control_line(metadata, 'f', s);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListAddString(used, PAPI_ATTR_EXCL,
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes "media", s);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* Handling */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs s = NULL;
43b9c05035ac59f7f7a8e7827598db5a15f30ed3jacobs papiAttributeListGetString(attributes, NULL, "job-hold-until", &s);
fe37c54d747b42e6ba91c90c9a1bdd69d2c8b909"Nagaraj Yedathore - Sun Microsystems - Bangalore India" if ((s != NULL) && (strcmp(s, "indefinite") == 0)) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs add_svr4_control_line(metadata, 'H', "hold");
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListAddString(used, PAPI_ATTR_EXCL,
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes "job-hold-until", "indefinite");
fe37c54d747b42e6ba91c90c9a1bdd69d2c8b909"Nagaraj Yedathore - Sun Microsystems - Bangalore India" } else if ((s != NULL) && (strcmp(s, "no-hold") == 0)) {
43b9c05035ac59f7f7a8e7827598db5a15f30ed3jacobs add_svr4_control_line(metadata, 'H', "immediate");
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListAddString(used, PAPI_ATTR_EXCL,
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes "job-hold-until", "no-hold");
43b9c05035ac59f7f7a8e7827598db5a15f30ed3jacobs } else if (s != NULL) {
43b9c05035ac59f7f7a8e7827598db5a15f30ed3jacobs add_svr4_control_line(metadata, 'H', s);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListAddString(used, PAPI_ATTR_EXCL,
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes "job-hold-until", s);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* Pages */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs s = NULL;
43b9c05035ac59f7f7a8e7827598db5a15f30ed3jacobs memset(tmp, NULL, sizeof (tmp));
43b9c05035ac59f7f7a8e7827598db5a15f30ed3jacobs tmp[0] = papiAttributeListFind(attributes, "page-ranges");
43b9c05035ac59f7f7a8e7827598db5a15f30ed3jacobs if (tmp[0] != NULL) {
43b9c05035ac59f7f7a8e7827598db5a15f30ed3jacobs char buf[BUFSIZ];
43b9c05035ac59f7f7a8e7827598db5a15f30ed3jacobs
43b9c05035ac59f7f7a8e7827598db5a15f30ed3jacobs papiAttributeListToString(tmp, " ", buf, sizeof (buf));
43b9c05035ac59f7f7a8e7827598db5a15f30ed3jacobs if ((s = strchr(buf, '=')) != NULL) {
43b9c05035ac59f7f7a8e7827598db5a15f30ed3jacobs add_svr4_control_line(metadata, 'P', ++s);
43b9c05035ac59f7f7a8e7827598db5a15f30ed3jacobs papiAttributeListAddString(used, PAPI_ATTR_EXCL,
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes "page-ranges", s);
43b9c05035ac59f7f7a8e7827598db5a15f30ed3jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* Priority : lp -q */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs integer = -1;
43b9c05035ac59f7f7a8e7827598db5a15f30ed3jacobs papiAttributeListGetInteger(attributes, NULL, "job-priority", &integer);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (integer != -1) {
43b9c05035ac59f7f7a8e7827598db5a15f30ed3jacobs integer = 40 - (integer / 2.5);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs add_int_control_line(metadata, 'q', integer, LPD_SVR4);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListAddInteger(used, PAPI_ATTR_EXCL,
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes "job-priority", integer);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* Charset : lp -S */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs s = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListGetString(attributes, NULL, "lp-charset", &s);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (s != NULL) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs add_svr4_control_line(metadata, 'S', s);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListAddString(used, PAPI_ATTR_EXCL,
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes "lp-charset", s);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* Type : done when adding file */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* Mode : lp -y */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs s = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListGetString(attributes, NULL, "lp-modes", &s);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (s != NULL) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs add_svr4_control_line(metadata, 'y', s);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListAddString(used, PAPI_ATTR_EXCL,
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes "lp-modes", s);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
fd06a699040f011e80ab8ac5213bb0a47858e69bjacobs /* Options lp -o are handled elsewhere */
fd06a699040f011e80ab8ac5213bb0a47858e69bjacobs if ((s = unused_attributes(attributes, *used)) != NULL) {
fd06a699040f011e80ab8ac5213bb0a47858e69bjacobs add_lpd_control_line(metadata, 'O', s);
fd06a699040f011e80ab8ac5213bb0a47858e69bjacobs free(s);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_OK);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapi_status_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobslpd_add_hpux_attributes(service_t *svc, papi_attribute_t **attributes,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char **metadata, papi_attribute_t ***used)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char *s = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* Options lp -o */
fd06a699040f011e80ab8ac5213bb0a47858e69bjacobs if ((s = unused_attributes(attributes, *used)) != NULL) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs add_hpux_control_line(metadata, s);
fd06a699040f011e80ab8ac5213bb0a47858e69bjacobs free(s);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_OK);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapi_status_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobslpd_job_add_attributes(service_t *svc, papi_attribute_t **attributes,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char **metadata, papi_attribute_t ***used)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((svc == NULL) || (metadata == NULL))
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_BAD_REQUEST);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs lpd_add_rfc1179_attributes(svc, attributes, metadata, used);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
fd06a699040f011e80ab8ac5213bb0a47858e69bjacobs /* add protocol extensions if applicable */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (svc->uri->fragment != NULL) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((strcasecmp(svc->uri->fragment, "solaris") == 0) ||
355b4669e025ff377602b6fc7caaf30dbc218371jacobs (strcasecmp(svc->uri->fragment, "svr4") == 0))
355b4669e025ff377602b6fc7caaf30dbc218371jacobs lpd_add_svr4_attributes(svc, attributes, metadata,
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes used);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs else if (strcasecmp(svc->uri->fragment, "hpux") == 0)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs lpd_add_hpux_attributes(svc, attributes, metadata,
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes used);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /*
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * others could be added here:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * lprng, sco, aix, digital unix, xerox, ...
355b4669e025ff377602b6fc7caaf30dbc218371jacobs */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_OK);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapi_status_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobslpd_job_add_files(service_t *svc, papi_attribute_t **attributes,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char **files, char **metadata, papi_attribute_t ***used)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs char *format = "text/plain";
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char rfc_fmt = 'l';
355b4669e025ff377602b6fc7caaf30dbc218371jacobs int copies = 1;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char host[BUFSIZ];
355b4669e025ff377602b6fc7caaf30dbc218371jacobs int i;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((svc == NULL) || (attributes == NULL) || (files == NULL) ||
355b4669e025ff377602b6fc7caaf30dbc218371jacobs (metadata == NULL))
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_BAD_ARGUMENT);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListGetString(attributes, NULL, "document-format",
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes &format);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListAddString(used, PAPI_ATTR_EXCL,
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes "document-format", format);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((rfc_fmt = mime_type_to_rfc1179_type(format)) == '\0') {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((svc->uri->fragment != NULL) &&
355b4669e025ff377602b6fc7caaf30dbc218371jacobs ((strcasecmp(svc->uri->fragment, "solaris") == 0) ||
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes (strcasecmp(svc->uri->fragment, "svr4") == 0)))
355b4669e025ff377602b6fc7caaf30dbc218371jacobs add_svr4_control_line(metadata, 'T', format);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs rfc_fmt = 'l';
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListGetInteger(attributes, NULL, "copies", &copies);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (copies < 1)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs copies = 1;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListAddInteger(used, PAPI_ATTR_EXCL, "copies", copies);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs gethostname(host, sizeof (host));
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs for (i = 0; files[i] != NULL; i++) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char name[BUFSIZ];
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes struct stat statbuf;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char key;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs int j;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((strcmp("standard input", files[i]) != 0) &&
355b4669e025ff377602b6fc7caaf30dbc218371jacobs (access(files[i], R_OK) < 0)) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs detailed_error(svc, gettext("aborting request, %s: %s"),
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes files[i], strerror(errno));
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_NOT_AUTHORIZED);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes if (strcmp("standard input", files[i]) != 0) {
a5669307eaef64af8519feb70d42f0aa0e7ec21aJonathan Cowper-Andrewes if (stat(files[i], &statbuf) < 0) {
a5669307eaef64af8519feb70d42f0aa0e7ec21aJonathan Cowper-Andrewes detailed_error(svc,
a5669307eaef64af8519feb70d42f0aa0e7ec21aJonathan Cowper-Andrewes gettext("Cannot access file: %s: %s"),
a5669307eaef64af8519feb70d42f0aa0e7ec21aJonathan Cowper-Andrewes files[i], strerror(errno));
a5669307eaef64af8519feb70d42f0aa0e7ec21aJonathan Cowper-Andrewes return (PAPI_DOCUMENT_ACCESS_ERROR);
a5669307eaef64af8519feb70d42f0aa0e7ec21aJonathan Cowper-Andrewes }
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes if (statbuf.st_size == 0) {
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes detailed_error(svc,
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes gettext("Zero byte (empty) file: %s"),
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes files[i]);
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes return (PAPI_BAD_ARGUMENT);
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes }
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (i < 26)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs key = 'A' + i;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs else if (i < 52)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs key = 'a' + (i - 26);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs else if (i < 62)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs key = '0' + (i - 52);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs else {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs detailed_error(svc,
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes gettext("too many files, truncated at 62"));
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_OK_SUBST);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs snprintf(name, sizeof (name), "df%cXXX%s", key, host);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs for (j = 0; j < copies; j++)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs add_lpd_control_line(metadata, rfc_fmt, name);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs add_lpd_control_line(metadata, 'U', name);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs add_lpd_control_line(metadata, 'N', (char *)files[i]);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_OK);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapi_status_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobslpd_submit_job(service_t *svc, char *metadata, papi_attribute_t ***attributes,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs int *ofd)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_status_t status = PAPI_INTERNAL_ERROR;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs int fd;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char path[32];
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char *list[2];
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((svc == NULL) || (metadata == NULL))
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_BAD_ARGUMENT);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs strcpy(path, "/tmp/lpd-job-XXXXXX");
355b4669e025ff377602b6fc7caaf30dbc218371jacobs fd = mkstemp(path);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs write(fd, metadata, strlen(metadata));
355b4669e025ff377602b6fc7caaf30dbc218371jacobs close(fd);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs list[0] = path;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs list[1] = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
4bd2082ff2d009263265d7de938de336894b6009ceastha if (((fd = lpd_open(svc, 's', list, 15)) < 0) && (errno != EBADMSG)) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs switch (errno) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case ENOSPC:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs status = PAPI_TEMPORARY_ERROR;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs break;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case EIO:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs status = PAPI_TEMPORARY_ERROR;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs break;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case ECONNREFUSED:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs status = PAPI_SERVICE_UNAVAILABLE;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs break;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case ENOENT:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs status = PAPI_NOT_ACCEPTING;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs break;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case EBADMSG:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case EBADF:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs status = PAPI_OK;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs break;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs default:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs status = PAPI_TIMEOUT;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs break;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs } else
355b4669e025ff377602b6fc7caaf30dbc218371jacobs status = PAPI_OK;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (ofd != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs *ofd = fd;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs else
355b4669e025ff377602b6fc7caaf30dbc218371jacobs close(fd);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* read the ID and add it to to the job */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((fd = open(path, O_RDONLY)) >= 0) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs int job_id = 0;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs read(fd, &job_id, sizeof (job_id));
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListAddInteger(attributes, PAPI_ATTR_REPLACE,
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes "job-id", job_id);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs close(fd);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs unlink(path);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (status);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}