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: ipp-support.c 148 2006-04-25 16:54:17Z njacobs $ */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <papi_impl.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <stdlib.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <pwd.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <locale.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <errno.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <fcntl.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <sys/stat.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <md5.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <config-site.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs#include <ipp.h>
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs
223f6c28404c8d330c123e98936160b8da9a26b2jacobsstatic void ipp_add_printer_uri(service_t *svc, char *name,
223f6c28404c8d330c123e98936160b8da9a26b2jacobs papi_attribute_t ***op);
223f6c28404c8d330c123e98936160b8da9a26b2jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapi_status_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobshttp_to_papi_status(http_status_t status)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs switch (status) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case HTTP_OK:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_OK);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case HTTP_BAD_REQUEST:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_BAD_REQUEST);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case HTTP_UNAUTHORIZED:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case HTTP_FORBIDDEN:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_NOT_AUTHORIZED);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case HTTP_NOT_FOUND:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_NOT_FOUND);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case HTTP_GONE:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_GONE);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case HTTP_SERVICE_UNAVAILABLE:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_SERVICE_UNAVAILABLE);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs default:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return ((papi_status_t)status);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapi_status_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobsipp_to_papi_status(uint16_t status)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs switch (status) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case IPP_OK:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_OK);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case IPP_OK_IGNORED_ATTRIBUTES:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_OK);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case IPP_OK_CONFLICTING_ATTRIBUTES:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_OK);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case IPP_OK_IGNORED_SUBSCRIPTIONS:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_OK_IGNORED_SUBSCRIPTIONS);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case IPP_OK_IGNORED_NOTIFICATIONS:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_OK_IGNORED_NOTIFICATIONS);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case IPP_CERR_BAD_REQUEST:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_BAD_REQUEST);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case IPP_CERR_FORBIDDEN:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_FORBIDDEN);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case IPP_CERR_NOT_AUTHENTICATED:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_NOT_AUTHENTICATED);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case IPP_CERR_NOT_AUTHORIZED:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_NOT_AUTHORIZED);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case IPP_CERR_NOT_POSSIBLE:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_NOT_POSSIBLE);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case IPP_CERR_TIMEOUT:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_TIMEOUT);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case IPP_CERR_NOT_FOUND:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_NOT_FOUND);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case IPP_CERR_GONE:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_GONE);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case IPP_CERR_REQUEST_ENTITY:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_REQUEST_ENTITY);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case IPP_CERR_REQUEST_VALUE:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_REQUEST_VALUE);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case IPP_CERR_DOCUMENT_FORMAT:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_DOCUMENT_FORMAT);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case IPP_CERR_ATTRIBUTES:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_ATTRIBUTES);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case IPP_CERR_URI_SCHEME:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_URI_SCHEME);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case IPP_CERR_CHARSET:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_CHARSET);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case IPP_CERR_CONFLICT:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_CONFLICT);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case IPP_CERR_COMPRESSION_NOT_SUPPORTED:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_COMPRESSION_NOT_SUPPORTED);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case IPP_CERR_COMPRESSION_ERROR:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_COMPRESSION_ERROR);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case IPP_CERR_DOCUMENT_FORMAT_ERROR:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_DOCUMENT_FORMAT_ERROR);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case IPP_CERR_DOCUMENT_ACCESS_ERROR:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_DOCUMENT_ACCESS_ERROR);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case IPP_CERR_ATTRIBUTES_NOT_SETTABLE:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_ATTRIBUTES_NOT_SETTABLE);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case IPP_CERR_IGNORED_ALL_SUBSCRIPTIONS:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_IGNORED_ALL_SUBSCRIPTIONS);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case IPP_CERR_TOO_MANY_SUBSCRIPTIONS:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_TOO_MANY_SUBSCRIPTIONS);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case IPP_CERR_IGNORED_ALL_NOTIFICATIONS:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_IGNORED_ALL_NOTIFICATIONS);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case IPP_CERR_PRINT_SUPPORT_FILE_NOT_FOUND:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_PRINT_SUPPORT_FILE_NOT_FOUND);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case IPP_SERR_INTERNAL:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_INTERNAL_ERROR);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case IPP_SERR_OPERATION_NOT_SUPPORTED:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_OPERATION_NOT_SUPPORTED);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case IPP_SERR_SERVICE_UNAVAILABLE:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_SERVICE_UNAVAILABLE);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case IPP_SERR_VERSION_NOT_SUPPORTED:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_VERSION_NOT_SUPPORTED);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case IPP_SERR_DEVICE_ERROR:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_DEVICE_ERROR);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case IPP_SERR_TEMPORARY_ERROR:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_TEMPORARY_ERROR);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case IPP_SERR_NOT_ACCEPTING:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_NOT_ACCEPTING);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case IPP_SERR_BUSY:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case IPP_SERR_CANCELLED:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs default:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_TEMPORARY_ERROR);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobsvoid
355b4669e025ff377602b6fc7caaf30dbc218371jacobsipp_initialize_request(service_t *svc, papi_attribute_t ***request,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs uint16_t operation)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListAddInteger(request, PAPI_ATTR_EXCL,
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes "version-major", 1);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListAddInteger(request, PAPI_ATTR_EXCL,
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes "version-minor", 1);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListAddInteger(request, PAPI_ATTR_EXCL,
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes "request-id", (short)lrand48());
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListAddInteger(request, PAPI_ATTR_EXCL,
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes "operation-id", operation);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobsvoid
355b4669e025ff377602b6fc7caaf30dbc218371jacobsipp_initialize_operational_attributes(service_t *svc, papi_attribute_t ***op,
223f6c28404c8d330c123e98936160b8da9a26b2jacobs char *printer, int job_id)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char *charset = "utf-8"; /* default to UTF-8 encoding */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char *language = setlocale(LC_ALL, "");
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char *user = "nobody";
355b4669e025ff377602b6fc7caaf30dbc218371jacobs struct passwd *pw = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /*
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * All IPP requests must contain the following:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * attributes-charset (UTF-8)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * attributes-natural-language (our current locale)
223f6c28404c8d330c123e98936160b8da9a26b2jacobs * (object identifier) printer-uri/job-id or job-uri
223f6c28404c8d330c123e98936160b8da9a26b2jacobs * requesting-user-name (process user or none)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListAddString(op, PAPI_ATTR_EXCL,
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes "attributes-charset", charset);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListAddString(op, PAPI_ATTR_EXCL,
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes "attributes-natural-language", language);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
223f6c28404c8d330c123e98936160b8da9a26b2jacobs if (printer != NULL)
223f6c28404c8d330c123e98936160b8da9a26b2jacobs ipp_add_printer_uri(svc, printer, op);
223f6c28404c8d330c123e98936160b8da9a26b2jacobs
223f6c28404c8d330c123e98936160b8da9a26b2jacobs if ((printer != NULL) && (job_id >= 0))
223f6c28404c8d330c123e98936160b8da9a26b2jacobs papiAttributeListAddInteger(op, PAPI_ATTR_EXCL,
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes "job-id", job_id);
223f6c28404c8d330c123e98936160b8da9a26b2jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((pw = getpwuid(getuid())) != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs user = pw->pw_name;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /*
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * if our euid is 0 "super user", we will allow the system supplied
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * user name to be overridden, if the requestor wants to.
355b4669e025ff377602b6fc7caaf30dbc218371jacobs */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (geteuid() == 0) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (svc->user != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs user = svc->user;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListAddString(op, PAPI_ATTR_REPLACE,
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes "requesting-user-name", user);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#ifndef OPID_CUPS_GET_DEFAULT /* for servers that will enumerate */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#define OPID_CUPS_GET_DEFAULT 0x4001
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#endif /* OPID_CUPS_GET_DEFAULT */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobsstatic papi_status_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobs_default_destination(service_t *svc, char **uri)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_status_t result = PAPI_INTERNAL_ERROR;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs printer_t *p = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_attribute_t **request = NULL, **op = NULL, **response = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char *tmp = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((svc == NULL) || (uri == NULL))
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_BAD_ARGUMENT);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* we must be connected to find the default destination */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (svc->connection == NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_NOT_POSSIBLE);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((p = calloc(1, sizeof (*p))) == NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_TEMPORARY_ERROR);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs ipp_initialize_request(svc, &request, OPID_CUPS_GET_DEFAULT);
223f6c28404c8d330c123e98936160b8da9a26b2jacobs ipp_initialize_operational_attributes(svc, &op, NULL, -1);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListAddString(&op, PAPI_ATTR_APPEND,
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes "requested-attributes", "printer-uri-supported");
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListAddCollection(&request, PAPI_ATTR_REPLACE,
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes "operational-attributes-group", op);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListFree(op);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs result = ipp_send_request(svc, request, &response);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListFree(request);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs op = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListGetCollection(response, NULL,
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes "printer-attributes-group", &op);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (uri != NULL) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char *tmp = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListGetString(op, NULL, "printer-uri", &tmp);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListGetString(op, NULL,
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes "printer-uri-supported", &tmp);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (tmp != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs *uri = strdup(tmp);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListFree(response);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (result);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
223f6c28404c8d330c123e98936160b8da9a26b2jacobsstatic void
355b4669e025ff377602b6fc7caaf30dbc218371jacobsipp_add_printer_uri(service_t *svc, char *name, papi_attribute_t ***op)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char *uri = name;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char buf[BUFSIZ];
355b4669e025ff377602b6fc7caaf30dbc218371jacobs uri_t *tmp = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (strstr(name, "://") == NULL) { /* not in URI form */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (strcmp(name, DEFAULT_DEST) != 0) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* not the "default" */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs snprintf(buf, sizeof (buf), "%s/%s", svc->name, name);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs uri = buf;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs } else
355b4669e025ff377602b6fc7caaf30dbc218371jacobs _default_destination(svc, &uri);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListAddString(op, PAPI_ATTR_EXCL, "printer-uri", uri);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* save the printer-uri's path to be used by http POST request */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((uri_from_string(uri, &tmp) == 0) && (tmp != NULL)) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (svc->post != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs free(svc->post);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs svc->post = strdup(tmp->path);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs uri_free(tmp);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs/*
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * don't actually write anything, just add to the total size and return the
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * size of what would be written, so we can figure out how big the request
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * is going to be.
355b4669e025ff377602b6fc7caaf30dbc218371jacobs */
355b4669e025ff377602b6fc7caaf30dbc218371jacobsstatic ssize_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobssize_calculate(void *fd, void *buffer, size_t length)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs ssize_t *size = (ssize_t *)fd;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs *size += length;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (length);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobsstatic ssize_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobsbuild_chunk(void *fd, void *buffer, size_t length)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char **s1 = fd;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs memcpy(*s1, buffer, length);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs *s1 = *s1 + length;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (length);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobsssize_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobsipp_request_write(void *fd, void *buffer, size_t length)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs service_t *svc = (service_t *)fd;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#ifdef DEBUG
355b4669e025ff377602b6fc7caaf30dbc218371jacobs printf("ipp_request_write(0x%8.8x, 0x%8.8x, %d)\n", fd, buffer, length);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs httpDumpData(stdout, "ipp_request_write:", buffer, length);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#endif
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (httpWrite(svc->connection, buffer, length));
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobsssize_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobsipp_request_read(void *fd, void *buffer, size_t length)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs service_t *svc = (service_t *)fd;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs ssize_t rc, i = length;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char *p = buffer;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs while ((rc = httpRead(svc->connection, p, i)) != i) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (rc == 0)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (rc);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (rc < 0)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (rc);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs i -= rc;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs p += rc;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#ifdef DEBUG
355b4669e025ff377602b6fc7caaf30dbc218371jacobs printf("ipp_request_read(0x%8.8x, 0x%8.8x, %d) = %d\n",
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes fd, buffer, length, rc);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs httpDumpData(stdout, "ipp_request_read:", buffer, length);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#endif
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (length);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapi_status_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobsipp_send_initial_request_block(service_t *svc, papi_attribute_t **request,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs ssize_t file_size)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_status_t result = PAPI_OK;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs ssize_t chunk_size = 0;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char length[32];
355b4669e025ff377602b6fc7caaf30dbc218371jacobs void *chunk, *ptr;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs http_status_t status;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* calculate the request size */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs (void) ipp_write_message(&size_calculate, &chunk_size, request);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* Fill in the HTTP Header information */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs httpClearFields(svc->connection);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (svc->transfer_encoding == TRANSFER_ENCODING_CHUNKED)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs httpSetField(svc->connection, HTTP_FIELD_TRANSFER_ENCODING,
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes "chunked");
355b4669e025ff377602b6fc7caaf30dbc218371jacobs else {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs sprintf(length, "%lu", (unsigned long)(file_size + chunk_size));
355b4669e025ff377602b6fc7caaf30dbc218371jacobs httpSetField(svc->connection, HTTP_FIELD_CONTENT_LENGTH,
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes length);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs httpSetField(svc->connection, HTTP_FIELD_CONTENT_TYPE,
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes "application/ipp");
355b4669e025ff377602b6fc7caaf30dbc218371jacobs httpSetField(svc->connection, HTTP_FIELD_AUTHORIZATION,
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes svc->connection->authstring);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* flush any state information about this connection */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs httpFlush(svc->connection);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* if we have don't have a POST path, use the service uri path */
e059026e2da8f12ef0ebea9d686d67f32660cfc0Keerthi Kondaka if ((svc->post == NULL) && (svc->uri->path))
355b4669e025ff377602b6fc7caaf30dbc218371jacobs svc->post = strdup(svc->uri->path);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* send the HTTP POST message for the IPP request */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* if the POST fails, return the error */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs status = httpPost(svc->connection, svc->post);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (status != 0)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (http_to_papi_status(status));
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (httpCheck(svc->connection) != 0) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs status = httpUpdate(svc->connection);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (status != HTTP_OK)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (http_to_papi_status(status));
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* build the request chunk */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs chunk = ptr = calloc(1, chunk_size);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs result = ipp_write_message(&build_chunk, &ptr, request);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#ifdef DEBUG
355b4669e025ff377602b6fc7caaf30dbc218371jacobs printf("request: %d (0x%x) bytes\n", chunk_size, chunk_size);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs httpDumpData(stdout, "request:", chunk, chunk_size);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#endif
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* send the actual IPP request */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (ipp_request_write(svc, chunk, chunk_size) != chunk_size)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs result = PAPI_TEMPORARY_ERROR;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs free(chunk);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (httpCheck(svc->connection) != 0) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs status = httpUpdate(svc->connection);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (status != HTTP_OK)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (http_to_papi_status(status));
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (result);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobsstatic int
355b4669e025ff377602b6fc7caaf30dbc218371jacobssetAuthString(service_t *svc)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs http_t *http;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char *user, *passphrase;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char encoded[BUFSIZ];
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((svc == NULL) || (svc->connection == NULL) || (svc->name == NULL))
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (-1);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs http = svc->connection;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (svc->user == NULL) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs struct passwd *p;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((p = getpwuid(getuid())) != NULL) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs user = p->pw_name;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs } else if ((user = getenv("LOGNAME")) == NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs user = getenv("USER");
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (user == NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs user = "nobody";
355b4669e025ff377602b6fc7caaf30dbc218371jacobs } else
355b4669e025ff377602b6fc7caaf30dbc218371jacobs user = svc->user;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* if the passphrase is not set, use the Authentication Callback */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (((svc->password == NULL) || (svc->password[0] == '\0')) &&
355b4669e025ff377602b6fc7caaf30dbc218371jacobs (svc->authCB != NULL))
355b4669e025ff377602b6fc7caaf30dbc218371jacobs (svc->authCB)(svc, svc->app_data);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs passphrase = svc->password;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* if there is still no passphrase, we have to fail */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((passphrase == NULL) || (passphrase[0] == '\0'))
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (-1);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (strncmp(http->fields[HTTP_FIELD_WWW_AUTHENTICATE],
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes "Basic", 5) == 0) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char plain[BUFSIZ];
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs snprintf(plain, sizeof (plain), "%s:%s", user, passphrase);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs httpEncode64(encoded, plain);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs snprintf(http->authstring, sizeof (http->authstring),
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes "Basic %s", encoded);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs } else if (strncmp(http->fields[HTTP_FIELD_WWW_AUTHENTICATE],
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes "Digest", 6) == 0) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char realm[HTTP_MAX_VALUE];
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char nonce[HTTP_MAX_VALUE];
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char line [BUFSIZ];
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char urp[128];
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char mr[128];
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char *uri = svc->post;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs httpGetSubField(http, HTTP_FIELD_WWW_AUTHENTICATE,
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes "realm", realm);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs httpGetSubField(http, HTTP_FIELD_WWW_AUTHENTICATE,
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes "nonce", nonce);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs snprintf(line, sizeof (line), "%s:%s:%s", user, realm,
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes passphrase);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs md5_calc(urp, line, strlen(line));
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs snprintf(line, sizeof (line), "POST:%s", uri);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs md5_calc(mr, line, strlen(line));
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs snprintf(line, sizeof (line), "%s:%s:%s", urp, mr, nonce);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs md5_calc(encoded, line, strlen(line));
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs snprintf(http->authstring, sizeof (http->authstring),
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes "Digest username=\"%s\", realm=\"%s\", nonce=\"%s\", "
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes "uri=\"%s\", response=\"%s\"", user, realm, nonce, uri,
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes encoded);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (0);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapi_status_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobsipp_status_info(service_t *svc, papi_attribute_t **response)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_attribute_t **operational = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs int32_t status = 0;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListGetCollection(response, NULL,
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes "operational-attributes-group", &operational);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (operational != NULL) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char *message = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListGetString(response, NULL,
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes "status-message", &message);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListAddString(&svc->attributes, PAPI_ATTR_REPLACE,
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes "detailed-status-message", message);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListGetInteger(response, NULL, "status-code", &status);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (ipp_to_papi_status(status));
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapi_status_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobsipp_send_request_with_file(service_t *svc, papi_attribute_t **request,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_attribute_t ***response, char *file)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_status_t result = PAPI_OK;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs ssize_t size = 0;
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes struct stat statbuf;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs int fd;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#ifdef DEBUG
355b4669e025ff377602b6fc7caaf30dbc218371jacobs fprintf(stderr, "\nIPP-REQUEST: (%s)", (file ? file : ""));
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListPrint(stderr, request, " ");
355b4669e025ff377602b6fc7caaf30dbc218371jacobs putc('\n', stderr);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs fflush(stderr);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#endif
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /*
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * if we are sending a file, open it and include it's size in the
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * message size.
355b4669e025ff377602b6fc7caaf30dbc218371jacobs */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (file != NULL) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((fd = open(file, O_RDONLY)) < 0) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs detailed_error(svc, "%s: %s", file, strerror(errno));
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_DOCUMENT_ACCESS_ERROR);
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes } else if (strcmp("standard input", file) != 0) {
a5669307eaef64af8519feb70d42f0aa0e7ec21aJonathan Cowper-Andrewes if (stat(file, &statbuf) < 0) {
a5669307eaef64af8519feb70d42f0aa0e7ec21aJonathan Cowper-Andrewes detailed_error(svc,
a5669307eaef64af8519feb70d42f0aa0e7ec21aJonathan Cowper-Andrewes gettext("Cannot access file: %s: %s"),
a5669307eaef64af8519feb70d42f0aa0e7ec21aJonathan Cowper-Andrewes file, 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 "Zero byte (empty) file: %s", file);
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes return (PAPI_BAD_ARGUMENT);
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs } else if (svc->transfer_encoding !=
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes TRANSFER_ENCODING_CHUNKED) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs struct stat st;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (fstat(fd, &st) >= 0)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs size = st.st_size;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs *response = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs while (*response == NULL) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs http_status_t status = HTTP_CONTINUE;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs result = ipp_send_initial_request_block(svc, request, size);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (result == PAPI_OK) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (file != NULL) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* send the file contents if we have it */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs int rc;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char buf[BUFSIZ];
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs lseek(fd, 0L, SEEK_SET);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs while ((rc = read(fd, buf, sizeof (buf))) > 0) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (ipp_request_write(svc, buf, rc)
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes < rc) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs break;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs (void) ipp_request_write(svc, "", 0);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* update our connection info */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs while (status == HTTP_CONTINUE)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs status = httpUpdate(svc->connection);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (status == HTTP_UNAUTHORIZED) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs httpFlush(svc->connection);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((svc->connection->authstring[0] == '\0') &&
355b4669e025ff377602b6fc7caaf30dbc218371jacobs (setAuthString(svc) == 0)) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs httpReconnect(svc->connection);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs continue;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs } else if (status == HTTP_UPGRADE_REQUIRED) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /*
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * If the transport was built with TLS support, we can
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * try to use it.
355b4669e025ff377602b6fc7caaf30dbc218371jacobs */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs httpFlush(svc->connection);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs httpReconnect(svc->connection);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs httpEncryption(svc->connection, HTTP_ENCRYPT_REQUIRED);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs continue;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (status != HTTP_OK)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (http_to_papi_status(status));
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* read the IPP response */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs result = ipp_read_message(&ipp_request_read, svc, response,
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes IPP_TYPE_RESPONSE);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (result == PAPI_OK)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs result = ipp_status_info(svc, *response);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#ifdef DEBUG
355b4669e025ff377602b6fc7caaf30dbc218371jacobs fprintf(stderr, "\nIPP-RESPONSE: (%s) (%s)", (file ? file : ""),
95c2d3023b88b9097d9822eb47ace5466e6d1cf4Jonathan Cowper-Andrewes papiStatusString(result));
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListPrint(stderr, *response, " ");
355b4669e025ff377602b6fc7caaf30dbc218371jacobs putc('\n', stderr);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs fflush(stderr);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#endif
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (result);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapi_status_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobsipp_send_request(service_t *svc, papi_attribute_t **request,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_attribute_t ***response)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (ipp_send_request_with_file(svc, request, response, NULL));
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}