/* * Client definitions for the CUPS scheduler. * * Copyright © 2007-2018 by Apple Inc. * Copyright © 1997-2007 by Easy Software Products, all rights reserved. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. */ #ifdef HAVE_AUTHORIZATION_H # include #endif /* HAVE_AUTHORIZATION_H */ /* * HTTP client structure... */ struct cupsd_client_s { int number; /* Connection number */ http_t *http; /* HTTP client connection */ ipp_t *request, /* IPP request information */ *response; /* IPP response information */ cupsd_location_t *best; /* Best match for AAA */ struct timeval start; /* Request start time */ http_state_t operation; /* Request operation */ off_t bytes; /* Bytes transferred for this request */ int is_browser; /* Is the client a web browser? */ int type; /* AuthType for username */ char username[HTTP_MAX_VALUE], /* Username from Authorization: line */ password[HTTP_MAX_VALUE], /* Password from Authorization: line */ uri[HTTP_MAX_URI], /* Localized URL/URI for GET/PUT */ *filename, /* Filename of output file */ *command, /* Command to run */ *options, /* Options for command */ *query_string; /* QUERY_STRING environment variable */ int file; /* Input/output file */ int file_ready; /* Input ready on file/pipe? */ int pipe_pid; /* Pipe process ID (or 0 if not a pipe) */ http_status_t pipe_status; /* HTTP status from pipe process */ int sent_header, /* Non-zero if sent HTTP header */ got_fields, /* Non-zero if all fields seen */ header_used; /* Number of header bytes used */ char header[2048]; /* Header from CGI program */ cups_lang_t *language; /* Language to use */ #ifdef HAVE_SSL int auto_ssl; /* Automatic test for SSL/TLS */ #endif /* HAVE_SSL */ http_addr_t clientaddr; /* Client's server address */ char clientname[256];/* Client's server name for connection */ int clientport; /* Client's server port for connection */ char servername[256];/* Server name for connection */ int serverport; /* Server port for connection */ #ifdef HAVE_GSSAPI int have_gss; /* Have GSS credentials? */ uid_t gss_uid; /* User ID for local prints */ #endif /* HAVE_GSSAPI */ #ifdef HAVE_AUTHORIZATION_H AuthorizationRef authref; /* Authorization ref */ #endif /* HAVE_AUTHORIZATION_H */ }; #define HTTP(con) ((con)->http) /* * HTTP listener structure... */ typedef struct { int fd; /* File descriptor for this server */ http_addr_t address; /* Bind address of socket */ http_encryption_t encryption; /* To encrypt or not to encrypt... */ #ifdef HAVE_ONDEMAND int on_demand; /* Is this a socket from launchd/systemd/upstart? */ #endif /* HAVE_ONDEMAND */ } cupsd_listener_t; /* * Globals... */ VAR int LastClientNumber VALUE(0), /* Last client connection number */ ListenBackLog VALUE(SOMAXCONN), /* Max backlog of pending connections */ LocalPort VALUE(631), /* Local port to use */ RemotePort VALUE(0); /* Remote port to use */ VAR http_encryption_t LocalEncryption VALUE(HTTP_ENCRYPT_IF_REQUESTED); /* Local port encryption to use */ VAR cups_array_t *Listeners VALUE(NULL); /* Listening sockets */ VAR time_t ListeningPaused VALUE(0); /* Time when listening was paused */ VAR cups_array_t *Clients VALUE(NULL), /* HTTP clients */ *ActiveClients VALUE(NULL); /* Active HTTP clients */ VAR char *ServerHeader VALUE(NULL); /* Server header in requests */ VAR int CGIPipes[2] VALUE2(-1,-1); /* Pipes for CGI error/debug output */ VAR cupsd_statbuf_t *CGIStatusBuffer VALUE(NULL); /* Status buffer for pipes */ /* * Prototypes... */ extern void cupsdAcceptClient(cupsd_listener_t *lis); extern void cupsdCloseAllClients(void); extern int cupsdCloseClient(cupsd_client_t *con); extern void cupsdDeleteAllListeners(void); extern void cupsdPauseListening(void); extern int cupsdProcessIPPRequest(cupsd_client_t *con); extern void cupsdReadClient(cupsd_client_t *con); extern void cupsdResumeListening(void); extern int cupsdSendCommand(cupsd_client_t *con, char *command, char *options, int root); extern int cupsdSendError(cupsd_client_t *con, http_status_t code, int auth_type); extern int cupsdSendHeader(cupsd_client_t *con, http_status_t code, char *type, int auth_type); extern void cupsdShutdownClient(cupsd_client_t *con); extern void cupsdStartListening(void); extern void cupsdStopListening(void); extern void cupsdUpdateCGI(void); extern void cupsdWriteClient(cupsd_client_t *con); #ifdef HAVE_SSL extern int cupsdEndTLS(cupsd_client_t *con); extern int cupsdStartTLS(cupsd_client_t *con); #endif /* HAVE_SSL */