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/*
a18dc42fc967d11feba9b8be61c6727dc6c56b48ps * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * Use is subject to license terms.
355b4669e025ff377602b6fc7caaf30dbc218371jacobs *
355b4669e025ff377602b6fc7caaf30dbc218371jacobs */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs/* $Id: ipp-listener.c 146 2006-03-24 00:26:54Z njacobs $ */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#pragma ident "%Z%%M% %I% %E% SMI"
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <stdio.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <stdlib.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <string.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <netinet/in.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <assert.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <errno.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <syslog.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <sys/types.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <sys/stat.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <fcntl.h>
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs#include <unistd.h>
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs#include <sys/systeminfo.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <papi.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <ipp-listener.h>
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs#include <uri.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobstypedef papi_status_t (ipp_handler_t)(papi_service_t svc,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_attribute_t **request,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_attribute_t ***response,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs ipp_reader_t iread, void *fd);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs/*
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * protocol request handlers are inserted below. The handler must be
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * declared extern immediately below this comment and then an entry
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * must be inserted in the "handlers" table a little further down.
355b4669e025ff377602b6fc7caaf30dbc218371jacobs */
355b4669e025ff377602b6fc7caaf30dbc218371jacobsextern ipp_handler_t ipp_print_job;
355b4669e025ff377602b6fc7caaf30dbc218371jacobsextern ipp_handler_t ipp_validate_job;
355b4669e025ff377602b6fc7caaf30dbc218371jacobsextern ipp_handler_t ipp_create_job;
355b4669e025ff377602b6fc7caaf30dbc218371jacobsextern ipp_handler_t ipp_get_printer_attributes;
355b4669e025ff377602b6fc7caaf30dbc218371jacobsextern ipp_handler_t ipp_get_jobs;
355b4669e025ff377602b6fc7caaf30dbc218371jacobsextern ipp_handler_t ipp_pause_printer;
355b4669e025ff377602b6fc7caaf30dbc218371jacobsextern ipp_handler_t ipp_resume_printer;
355b4669e025ff377602b6fc7caaf30dbc218371jacobsextern ipp_handler_t ipp_disable_printer;
355b4669e025ff377602b6fc7caaf30dbc218371jacobsextern ipp_handler_t ipp_enable_printer;
355b4669e025ff377602b6fc7caaf30dbc218371jacobsextern ipp_handler_t ipp_purge_jobs;
355b4669e025ff377602b6fc7caaf30dbc218371jacobsextern ipp_handler_t ipp_send_document;
355b4669e025ff377602b6fc7caaf30dbc218371jacobsextern ipp_handler_t ipp_cancel_job;
355b4669e025ff377602b6fc7caaf30dbc218371jacobsextern ipp_handler_t ipp_get_job_attributes;
355b4669e025ff377602b6fc7caaf30dbc218371jacobsextern ipp_handler_t ipp_release_job;
355b4669e025ff377602b6fc7caaf30dbc218371jacobsextern ipp_handler_t ipp_hold_job;
355b4669e025ff377602b6fc7caaf30dbc218371jacobsextern ipp_handler_t ipp_restart_job;
355b4669e025ff377602b6fc7caaf30dbc218371jacobsextern ipp_handler_t ipp_set_job_attributes;
355b4669e025ff377602b6fc7caaf30dbc218371jacobsextern ipp_handler_t ipp_set_printer_attributes;
355b4669e025ff377602b6fc7caaf30dbc218371jacobsextern ipp_handler_t cups_get_default;
355b4669e025ff377602b6fc7caaf30dbc218371jacobsextern ipp_handler_t cups_get_printers;
355b4669e025ff377602b6fc7caaf30dbc218371jacobsextern ipp_handler_t cups_get_classes;
355b4669e025ff377602b6fc7caaf30dbc218371jacobsextern ipp_handler_t cups_accept_jobs;
355b4669e025ff377602b6fc7caaf30dbc218371jacobsextern ipp_handler_t cups_reject_jobs;
355b4669e025ff377602b6fc7caaf30dbc218371jacobsextern ipp_handler_t cups_move_job;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs/* ARGSUSED0 */
355b4669e025ff377602b6fc7caaf30dbc218371jacobsstatic papi_status_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobsdefault_handler(papi_service_t svc, papi_attribute_t **request,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_attribute_t ***response, ipp_reader_t iread, void *fd)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs int result = (int)PAPI_INTERNAL_ERROR;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (response != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs (void) papiAttributeListGetInteger(*response, NULL,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs "status-code", &result);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return ((papi_status_t)result);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobsstatic struct {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs int16_t id;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char *name;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs ipp_handler_t *function;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs enum { OP_REQUIRED, OP_OPTIONAL, OP_VENDOR } type;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs} handlers[] = {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* Printer Operations */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs { 0x0002, "print-job", ipp_print_job, OP_REQUIRED },
355b4669e025ff377602b6fc7caaf30dbc218371jacobs { 0x0003, "print-uri", NULL, OP_OPTIONAL },
355b4669e025ff377602b6fc7caaf30dbc218371jacobs { 0x0004, "validate-job", ipp_validate_job,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs OP_REQUIRED },
355b4669e025ff377602b6fc7caaf30dbc218371jacobs { 0x0005, "create-job", ipp_create_job, OP_OPTIONAL },
355b4669e025ff377602b6fc7caaf30dbc218371jacobs { 0x000a, "get-jobs", ipp_get_jobs, OP_REQUIRED },
355b4669e025ff377602b6fc7caaf30dbc218371jacobs { 0x000b, "get-printer-attributes", ipp_get_printer_attributes,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs OP_REQUIRED },
355b4669e025ff377602b6fc7caaf30dbc218371jacobs { 0x0010, "pause-printer", ipp_pause_printer,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs OP_OPTIONAL },
355b4669e025ff377602b6fc7caaf30dbc218371jacobs { 0x0011, "resume-printer", ipp_resume_printer,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs OP_OPTIONAL },
355b4669e025ff377602b6fc7caaf30dbc218371jacobs { 0x0012, "purge-jobs", ipp_purge_jobs, OP_OPTIONAL },
355b4669e025ff377602b6fc7caaf30dbc218371jacobs { 0x0013, "set-printer-attributes", ipp_set_printer_attributes,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs OP_OPTIONAL },
355b4669e025ff377602b6fc7caaf30dbc218371jacobs { 0x0014, "set-job-attributes", ipp_set_job_attributes,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs OP_OPTIONAL },
355b4669e025ff377602b6fc7caaf30dbc218371jacobs { 0x0022, "enable-printer", ipp_enable_printer,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs OP_OPTIONAL },
355b4669e025ff377602b6fc7caaf30dbc218371jacobs { 0x0023, "disable-printer", ipp_disable_printer,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs OP_OPTIONAL },
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* Job Operations */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs { 0x0006, "send-document", ipp_send_document,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs OP_OPTIONAL },
355b4669e025ff377602b6fc7caaf30dbc218371jacobs { 0x0007, "send-uri", NULL, OP_OPTIONAL },
355b4669e025ff377602b6fc7caaf30dbc218371jacobs { 0x0008, "cancel-job", ipp_cancel_job, OP_REQUIRED },
355b4669e025ff377602b6fc7caaf30dbc218371jacobs { 0x0009, "get-job-attributes", ipp_get_job_attributes,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs OP_REQUIRED },
355b4669e025ff377602b6fc7caaf30dbc218371jacobs { 0x000c, "hold-job", ipp_hold_job, OP_OPTIONAL },
355b4669e025ff377602b6fc7caaf30dbc218371jacobs { 0x000d, "release-job", ipp_release_job,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs OP_OPTIONAL },
355b4669e025ff377602b6fc7caaf30dbc218371jacobs { 0x000e, "restart-job", ipp_restart_job,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs OP_OPTIONAL },
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* Other Operations */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs { 0x4001, "cups-get-default", cups_get_default,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs OP_VENDOR },
355b4669e025ff377602b6fc7caaf30dbc218371jacobs { 0x4002, "cups-get-printers", cups_get_printers,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs OP_VENDOR },
355b4669e025ff377602b6fc7caaf30dbc218371jacobs { 0x4005, "cups-get-classes", cups_get_classes,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs OP_VENDOR },
355b4669e025ff377602b6fc7caaf30dbc218371jacobs { 0x4008, "cups-accept-jobs", cups_accept_jobs,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs OP_VENDOR },
355b4669e025ff377602b6fc7caaf30dbc218371jacobs { 0x4009, "cups-reject-jobs", cups_reject_jobs,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs OP_VENDOR },
355b4669e025ff377602b6fc7caaf30dbc218371jacobs { 0x400D, "cups-move-job", cups_move_job, OP_VENDOR },
355b4669e025ff377602b6fc7caaf30dbc218371jacobs { 0, NULL, NULL, OP_VENDOR }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs};
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobsstatic int
355b4669e025ff377602b6fc7caaf30dbc218371jacobsipp_operation_name_to_index(char *name)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs int i;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs for (i = 0; handlers[i].name != NULL; i++)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (strcasecmp(name, handlers[i].name) == 0)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (i);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (-1);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobsstatic int
355b4669e025ff377602b6fc7caaf30dbc218371jacobsipp_operation_id_to_index(int16_t id)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs int i;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs for (i = 0; handlers[i].name != NULL; i++)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (id == handlers[i].id)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (i);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (-1);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobsstatic ipp_handler_t *
355b4669e025ff377602b6fc7caaf30dbc218371jacobsipp_operation_handler(papi_attribute_t **request, papi_attribute_t ***response)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs int id = 0;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs int index;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_attribute_t **ops = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_status_t status;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char configured = PAPI_FALSE;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* get the operation from the request */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs status = papiAttributeListGetInteger(request, NULL,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs "operation-id", &id);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (status != PAPI_OK) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs ipp_set_status(response, PAPI_BAD_ARGUMENT,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs "no operation specified in request");
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (default_handler);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* find the operation in the handler table */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs index = ipp_operation_id_to_index(id);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#ifdef DEBUG
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (index == -1)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs fprintf(stderr, "Operation: 0x%4.4x\n", id);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs else
355b4669e025ff377602b6fc7caaf30dbc218371jacobs fprintf(stderr, "Operation: 0x%4.4x(%s)\n", id,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs handlers[index].name);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs fflush(stderr);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#endif
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((index == -1) || (handlers[index].function == NULL)) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs ipp_set_status(response, PAPI_OPERATION_NOT_SUPPORTED,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs "operation (0x%4.4x) not implemented by server",
355b4669e025ff377602b6fc7caaf30dbc218371jacobs id);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (default_handler);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* find the configured operations */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs status = papiAttributeListGetCollection(request, NULL,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs "operations", &ops);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (status != PAPI_OK) { /* this should not be possible */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs ipp_set_status(response, PAPI_INTERNAL_ERROR,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs "sofware error, no operations configured");
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (default_handler);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* check if the requested operation is configured */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs status = papiAttributeListGetBoolean(ops, NULL,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs handlers[index].name, &configured);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((status != PAPI_OK) || (configured != PAPI_TRUE)) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs ipp_set_status(response, PAPI_OPERATION_NOT_SUPPORTED,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs "operation (%s 0x%4.4x) not enabled on server",
355b4669e025ff377602b6fc7caaf30dbc218371jacobs handlers[index].name, id);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (default_handler);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (handlers[index].function);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobsstatic char
355b4669e025ff377602b6fc7caaf30dbc218371jacobstype_to_boolean(char *type)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char result = PAPI_FALSE;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((strcasecmp(type, "true") == 0) ||
355b4669e025ff377602b6fc7caaf30dbc218371jacobs (strcasecmp(type, "yes") == 0) ||
355b4669e025ff377602b6fc7caaf30dbc218371jacobs (strcasecmp(type, "on") == 0) ||
355b4669e025ff377602b6fc7caaf30dbc218371jacobs (strcasecmp(type, "enable") == 0))
355b4669e025ff377602b6fc7caaf30dbc218371jacobs result = PAPI_TRUE;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (result);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobsstatic papi_status_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobsipp_configure_required_operations(papi_attribute_t ***list, char boolean)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_status_t result = PAPI_OK;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs int i;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs for (i = 0; ((result == PAPI_OK) && (handlers[i].name != NULL)); i++)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (handlers[i].type == OP_REQUIRED)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs result = papiAttributeListAddBoolean(list,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs PAPI_ATTR_REPLACE, handlers[i].name,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs boolean);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (result);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobsstatic papi_status_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobsipp_configure_all_operations(papi_attribute_t ***list, char boolean)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_status_t result = PAPI_OK;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs int i;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs for (i = 0; ((result == PAPI_OK) && (handlers[i].name != NULL)); i++)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs result = papiAttributeListAddBoolean(list, PAPI_ATTR_REPLACE,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs handlers[i].name, boolean);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (result);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapi_status_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobsipp_configure_operation(papi_attribute_t ***list, char *operation, char *type)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_status_t result = PAPI_OPERATION_NOT_SUPPORTED;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char boolean = PAPI_FALSE;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((list == NULL) || (operation == NULL) || (type == NULL))
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_BAD_ARGUMENT);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs boolean = type_to_boolean(type);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (strcasecmp(operation, "all") == 0) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs result = ipp_configure_all_operations(list, boolean);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs } else if (strcasecmp(operation, "required") == 0) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs result = ipp_configure_required_operations(list, boolean);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs } else if (ipp_operation_name_to_index(operation) != -1) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs result = papiAttributeListAddBoolean(list, PAPI_ATTR_REPLACE,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs operation, boolean);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (result);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobsvoid
355b4669e025ff377602b6fc7caaf30dbc218371jacobsipp_operations_supported(papi_attribute_t ***list, papi_attribute_t **request)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_attribute_t **group = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs (void) papiAttributeListGetCollection(request, NULL,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs "operations", &group);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (group != NULL) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs int i;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs for (i = 0; handlers[i].name != NULL; i++) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char boolean = PAPI_FALSE;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs (void) papiAttributeListGetBoolean(group, NULL,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs handlers[i].name, &boolean);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (boolean == PAPI_TRUE)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs (void) papiAttributeListAddInteger(list,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs PAPI_ATTR_APPEND,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs "operations-supported",
355b4669e025ff377602b6fc7caaf30dbc218371jacobs handlers[i].id);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobsstatic papi_status_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobsipp_initialize_response(papi_attribute_t **request,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_attribute_t ***response)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_attribute_t **operational = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs int i;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((request == NULL) || (response == NULL))
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_BAD_ARGUMENT);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* If the response was initialized, start over */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (*response != NULL) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListFree(*response);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs *response = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* Add the basic ipp header information to the response */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs (void) papiAttributeListGetInteger(request, NULL, "version-major", &i);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs (void) papiAttributeListAddInteger(response, PAPI_ATTR_REPLACE,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs "version-major", i);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs (void) papiAttributeListGetInteger(request, NULL, "version-minor", &i);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs (void) papiAttributeListAddInteger(response, PAPI_ATTR_REPLACE,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs "version-minor", i);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs (void) papiAttributeListGetInteger(request, NULL, "request-id", &i);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs (void) papiAttributeListAddInteger(response, PAPI_ATTR_REPLACE,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs "request-id", i);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* Add a default operational attributes group to the response */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs (void) papiAttributeListAddString(&operational, PAPI_ATTR_EXCL,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs "attributes-charset", "utf-8");
355b4669e025ff377602b6fc7caaf30dbc218371jacobs (void) papiAttributeListAddString(&operational, PAPI_ATTR_EXCL,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs "attributes-natural-language", "en-us");
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs (void) papiAttributeListAddCollection(response, PAPI_ATTR_REPLACE,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs "operational-attributes-group", operational);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListFree(operational);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_OK);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs/* simplistic check for cyclical service references */
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobsstatic int
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobscyclical_service_check(char *svc_name, int port)
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs{
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs papi_attribute_t **list;
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs char buf[BUFSIZ];
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs uri_t *uri = NULL;
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs char *s = NULL;
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs /* was there a service_uri? */
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs if (svc_name == NULL)
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs return (0);
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs if ((list = getprinterbyname(svc_name, NULL)) == NULL)
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs return (0); /* if it doesnt' resolve, we will fail later */
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs papiAttributeListGetString(list, NULL, "printer-uri-supported", &s);
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs if ((s == NULL) || (strcasecmp(svc_name, s) != 0))
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs return (0); /* they don't match */
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs /* is it in uri form? */
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs if (uri_from_string(s, &uri) < 0)
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs return (0);
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs if ((uri == NULL) || (uri->scheme == NULL) || (uri->host == NULL)) {
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs uri_free(uri);
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs return (0);
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs }
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs /* is it ipp form */
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs if (strcasecmp(uri->scheme, "ipp") != 0) {
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs uri_free(uri);
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs return (0);
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs }
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs /* does the host match up */
a18dc42fc967d11feba9b8be61c6727dc6c56b48ps if (is_localhost(uri->host) != 0) {
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs uri_free(uri);
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs return (0);
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs }
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs /* does the port match our own */
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs if (((uri->port == NULL) && (port != 631)) ||
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs ((uri->port != NULL) && (atoi(uri->port) != port))) {
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs uri_free(uri);
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs return (0);
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs }
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs uri_free(uri);
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs return (1);
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs}
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobsstatic papi_status_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobsprint_service_connect(papi_service_t *svc, papi_attribute_t **request,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_attribute_t ***response)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_status_t status;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_attribute_t **operational = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char *printer_uri = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char *svc_name = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char *user = NULL;
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs int port = 631;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* Get the operational attributes group from the request */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs (void) papiAttributeListGetCollection(request, NULL,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs "operational-attributes-group", &operational);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* get the user name */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs (void) papiAttributeListGetString(request, NULL, "default-user", &user);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs (void) papiAttributeListGetString(operational, NULL,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs "requesting-user-name", &user);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* get the printer or service name */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs (void) papiAttributeListGetString(request, NULL,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs "default-service", &svc_name);
0ce6acb835f8cec2ed5d14a190db6e2f98ed6d69jacobs get_printer_id(operational, &svc_name, NULL);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs /* get the port that we are listening on */
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs (void) papiAttributeListGetInteger(request, NULL, "uri-port", &port);
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs if (cyclical_service_check(svc_name, port) != 0) {
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs status = PAPI_NOT_POSSIBLE;
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs ipp_set_status(response, status, "printer-uri is cyclical");
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs return (status);
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs }
0a44ef6d9afbfe052a7e975f55ea0d2954b62a82jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs status = papiServiceCreate(svc, svc_name, user, NULL, NULL,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs PAPI_ENCRYPT_NEVER, NULL);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (status != PAPI_OK) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs ipp_set_status(response, status, "print service: %s",
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiStatusString(status));
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (status);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /*
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * Trusted Solaris can't be trusting of intermediaries. Pass
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * the socket connection to the print service to retrieve the
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * sensativity label off of a multi-level port.
355b4669e025ff377602b6fc7caaf30dbc218371jacobs */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs int fd = -1;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs (void) papiAttributeListGetInteger(request, NULL,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs "peer-socket", &fd);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (fd != -1)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiServiceSetPeer(*svc, fd);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (status);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapi_status_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobsipp_process_request(papi_attribute_t **request, papi_attribute_t ***response,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs ipp_reader_t iread, void *fd)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_status_t result = PAPI_OK;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs ipp_initialize_response(request, response);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#ifdef DEBUG
355b4669e025ff377602b6fc7caaf30dbc218371jacobs fprintf(stderr, "REQUEST:");
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListPrint(stderr, request, " %d ", getpid());
355b4669e025ff377602b6fc7caaf30dbc218371jacobs fprintf(stderr, "\n");
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#endif
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* verify that the request is "well-formed" */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((result = ipp_validate_request(request, response)) == PAPI_OK) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_service_t svc = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs ipp_handler_t *handler;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs result = print_service_connect(&svc, request, response);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs handler = ipp_operation_handler(request, response);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* process the request */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((result == PAPI_OK) && (handler != NULL))
355b4669e025ff377602b6fc7caaf30dbc218371jacobs result = (handler)(svc, request, response, iread, fd);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#ifdef DEBUG
355b4669e025ff377602b6fc7caaf30dbc218371jacobs fprintf(stderr, "RESULT: %s\n", papiStatusString(result));
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#endif
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiServiceDestroy(svc);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs (void) papiAttributeListAddInteger(response, PAPI_ATTR_EXCL,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs "status-code", result);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs massage_response(request, *response);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#ifdef DEBUG
355b4669e025ff377602b6fc7caaf30dbc218371jacobs fprintf(stderr, "RESPONSE:");
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListPrint(stderr, *response, " %d ", getpid());
355b4669e025ff377602b6fc7caaf30dbc218371jacobs fprintf(stderr, "\n");
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#endif
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (result);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}