X-Git-Url: http://git.ipfire.org/?p=thirdparty%2Fcups.git;a=blobdiff_plain;f=cups%2Fgetputfile.c;h=ae33bc5993026fe781f8877e192d6945ce3f7de9;hp=9dc7f7a9cd15b898db89c84a089d62294ee1ce6f;hb=57b7b66b58a66426494ec13ffb18f730afeab8b5;hpb=757d2cad8f3f75c420ad2e462b787cd9cf8a7a62 diff --git a/cups/getputfile.c b/cups/getputfile.c index 9dc7f7a9c..ae33bc599 100644 --- a/cups/getputfile.c +++ b/cups/getputfile.c @@ -1,48 +1,23 @@ /* - * "$Id: getputfile.c 5235 2006-03-06 13:02:23Z mike $" + * Get/put file functions for CUPS. * - * Get/put file functions for the Common UNIX Printing System (CUPS). + * Copyright 2007-2014 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products. * - * Copyright 1997-2006 by Easy Software Products. + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * missing or damaged, see the license at "http://www.cups.org/". * - * These coded instructions, statements, and computer programs are the - * property of Easy Software Products and are protected by Federal - * copyright law. Distribution and use rights are outlined in the file - * "LICENSE.txt" which should have been included with this file. If this - * file is missing or damaged please contact Easy Software Products - * at: - * - * Attn: CUPS Licensing Information - * Easy Software Products - * 44141 Airport View Drive, Suite 204 - * Hollywood, Maryland 20636 USA - * - * Voice: (301) 373-9600 - * EMail: cups-info@cups.org - * WWW: http://www.cups.org - * - * This file is subject to the Apple OS-Developed Software exception. - * - * Contents: - * - * cupsGetFd() - Get a file from the server. - * cupsGetFile() - Get a file from the server. - * cupsPutFd() - Put a file on the server. - * cupsPutFile() - Put a file on the server. + * This file is subject to the Apple OS-Developed Software exception. */ /* * Include necessary headers... */ -#include "cups.h" -#include "ipp.h" -#include "language.h" -#include "string.h" -#include "debug.h" -#include -#include -#include +#include "cups-private.h" #include #include #if defined(WIN32) || defined(__EMX__) @@ -55,17 +30,17 @@ /* * 'cupsGetFd()' - Get a file from the server. * - * This function returns HTTP_OK when the file is successfully retrieved. + * This function returns @code HTTP_STATUS_OK@ when the file is successfully retrieved. * - * @since CUPS 1.1.20@ + * @since CUPS 1.1.20/macOS 10.4@ */ http_status_t /* O - HTTP status */ -cupsGetFd(http_t *http, /* I - HTTP connection to server */ +cupsGetFd(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ const char *resource, /* I - Resource name */ int fd) /* I - File descriptor */ { - int bytes; /* Number of bytes read */ + ssize_t bytes; /* Number of bytes read */ char buffer[8192]; /* Buffer for file */ http_status_t status; /* HTTP status from server */ char if_modified_since[HTTP_MAX_VALUE]; @@ -76,17 +51,20 @@ cupsGetFd(http_t *http, /* I - HTTP connection to server */ * Range check input... */ - DEBUG_printf(("cupsGetFd(http=%p, resource=\"%s\", fd=%d)\n", http, - resource, fd)); + DEBUG_printf(("cupsGetFd(http=%p, resource=\"%s\", fd=%d)", (void *)http, resource, fd)); - if (!http || !resource || fd < 0) + if (!resource || fd < 0) { if (http) http->error = EINVAL; - return (HTTP_ERROR); + return (HTTP_STATUS_ERROR); } + if (!http) + if ((http = _cupsConnect()) == NULL) + return (HTTP_STATUS_SERVICE_UNAVAILABLE); + /* * Then send GET requests to the HTTP server... */ @@ -96,27 +74,37 @@ cupsGetFd(http_t *http, /* I - HTTP connection to server */ do { + if (!_cups_strcasecmp(httpGetField(http, HTTP_FIELD_CONNECTION), "close")) + { + httpClearFields(http); + if (httpReconnect2(http, 30000, NULL)) + { + status = HTTP_STATUS_ERROR; + break; + } + } + httpClearFields(http); httpSetField(http, HTTP_FIELD_AUTHORIZATION, http->authstring); httpSetField(http, HTTP_FIELD_IF_MODIFIED_SINCE, if_modified_since); if (httpGet(http, resource)) { - if (httpReconnect(http)) + if (httpReconnect2(http, 30000, NULL)) { - status = HTTP_ERROR; + status = HTTP_STATUS_ERROR; break; } else { - status = HTTP_UNAUTHORIZED; + status = HTTP_STATUS_UNAUTHORIZED; continue; } } - while ((status = httpUpdate(http)) == HTTP_CONTINUE); + while ((status = httpUpdate(http)) == HTTP_STATUS_CONTINUE); - if (status == HTTP_UNAUTHORIZED) + if (status == HTTP_STATUS_UNAUTHORIZED) { /* * Flush any error message... @@ -129,59 +117,67 @@ cupsGetFd(http_t *http, /* I - HTTP connection to server */ */ if (cupsDoAuthentication(http, "GET", resource)) + { + status = HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED; break; + } - if (httpReconnect(http)) + if (httpReconnect2(http, 30000, NULL)) { - status = HTTP_ERROR; + status = HTTP_STATUS_ERROR; break; } continue; } #ifdef HAVE_SSL - else if (status == HTTP_UPGRADE_REQUIRED) + else if (status == HTTP_STATUS_UPGRADE_REQUIRED) { /* Flush any error message... */ httpFlush(http); /* Reconnect... */ - if (httpReconnect(http)) + if (httpReconnect2(http, 30000, NULL)) { - status = HTTP_ERROR; + status = HTTP_STATUS_ERROR; break; } /* Upgrade with encryption... */ - httpEncryption(http, HTTP_ENCRYPT_REQUIRED); + httpEncryption(http, HTTP_ENCRYPTION_REQUIRED); /* Try again, this time with encryption enabled... */ continue; } #endif /* HAVE_SSL */ } - while (status == HTTP_UNAUTHORIZED || status == HTTP_UPGRADE_REQUIRED); + while (status == HTTP_STATUS_UNAUTHORIZED || status == HTTP_STATUS_UPGRADE_REQUIRED); /* * See if we actually got the file or an error... */ - if (status == HTTP_OK) + if (status == HTTP_STATUS_OK) { /* * Yes, copy the file... */ while ((bytes = httpRead2(http, buffer, sizeof(buffer))) > 0) - write(fd, buffer, bytes); + write(fd, buffer, (size_t)bytes); } else + { + _cupsSetHTTPError(status); httpFlush(http); + } /* * Return the request status... */ + DEBUG_printf(("1cupsGetFd: Returning %d...", status)); + return (status); } @@ -189,13 +185,13 @@ cupsGetFd(http_t *http, /* I - HTTP connection to server */ /* * 'cupsGetFile()' - Get a file from the server. * - * This function returns HTTP_OK when the file is successfully retrieved. + * This function returns @code HTTP_STATUS_OK@ when the file is successfully retrieved. * - * @since CUPS 1.1.20@ + * @since CUPS 1.1.20/macOS 10.4@ */ http_status_t /* O - HTTP status */ -cupsGetFile(http_t *http, /* I - HTTP connection to server */ +cupsGetFile(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ const char *resource, /* I - Resource name */ const char *filename) /* I - Filename */ { @@ -212,7 +208,7 @@ cupsGetFile(http_t *http, /* I - HTTP connection to server */ if (http) http->error = EINVAL; - return (HTTP_ERROR); + return (HTTP_STATUS_ERROR); } /* @@ -227,7 +223,7 @@ cupsGetFile(http_t *http, /* I - HTTP connection to server */ http->error = errno; - return (HTTP_ERROR); + return (HTTP_STATUS_ERROR); } /* @@ -242,7 +238,7 @@ cupsGetFile(http_t *http, /* I - HTTP connection to server */ close(fd); - if (status != HTTP_OK) + if (status != HTTP_STATUS_OK) unlink(filename); /* @@ -256,18 +252,19 @@ cupsGetFile(http_t *http, /* I - HTTP connection to server */ /* * 'cupsPutFd()' - Put a file on the server. * - * This function returns HTTP_CREATED when the file is stored successfully. + * This function returns @code HTTP_STATUS_CREATED@ when the file is stored + * successfully. * - * @since CUPS 1.1.20@ + * @since CUPS 1.1.20/macOS 10.4@ */ http_status_t /* O - HTTP status */ -cupsPutFd(http_t *http, /* I - HTTP connection to server */ +cupsPutFd(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ const char *resource, /* I - Resource name */ int fd) /* I - File descriptor */ { - int bytes, /* Number of bytes read */ - retries; /* Number of retries */ + ssize_t bytes; /* Number of bytes read */ + int retries; /* Number of retries */ char buffer[8192]; /* Buffer for file */ http_status_t status; /* HTTP status from server */ @@ -276,17 +273,20 @@ cupsPutFd(http_t *http, /* I - HTTP connection to server */ * Range check input... */ - DEBUG_printf(("cupsPutFd(http=%p, resource=\"%s\", fd=%d)\n", http, - resource, fd)); + DEBUG_printf(("cupsPutFd(http=%p, resource=\"%s\", fd=%d)", (void *)http, resource, fd)); - if (!http || !resource || fd < 0) + if (!resource || fd < 0) { if (http) http->error = EINVAL; - return (HTTP_ERROR); + return (HTTP_STATUS_ERROR); } + if (!http) + if ((http = _cupsConnect()) == NULL) + return (HTTP_STATUS_SERVICE_UNAVAILABLE); + /* * Then send PUT requests to the HTTP server... */ @@ -295,24 +295,34 @@ cupsPutFd(http_t *http, /* I - HTTP connection to server */ do { - DEBUG_printf(("cupsPutFd: starting attempt, authstring=\"%s\"...\n", + if (!_cups_strcasecmp(httpGetField(http, HTTP_FIELD_CONNECTION), "close")) + { + httpClearFields(http); + if (httpReconnect2(http, 30000, NULL)) + { + status = HTTP_STATUS_ERROR; + break; + } + } + + DEBUG_printf(("2cupsPutFd: starting attempt, authstring=\"%s\"...", http->authstring)); httpClearFields(http); httpSetField(http, HTTP_FIELD_AUTHORIZATION, http->authstring); httpSetField(http, HTTP_FIELD_TRANSFER_ENCODING, "chunked"); - httpSetExpect(http, HTTP_CONTINUE); + httpSetExpect(http, HTTP_STATUS_CONTINUE); if (httpPut(http, resource)) { - if (httpReconnect(http)) + if (httpReconnect2(http, 30000, NULL)) { - status = HTTP_ERROR; + status = HTTP_STATUS_ERROR; break; } else { - status = HTTP_UNAUTHORIZED; + status = HTTP_STATUS_UNAUTHORIZED; continue; } } @@ -324,9 +334,9 @@ cupsPutFd(http_t *http, /* I - HTTP connection to server */ if (httpWait(http, 1000)) status = httpUpdate(http); else - status = HTTP_CONTINUE; + status = HTTP_STATUS_CONTINUE; - if (status == HTTP_CONTINUE) + if (status == HTTP_STATUS_CONTINUE) { /* * Copy the file... @@ -337,23 +347,23 @@ cupsPutFd(http_t *http, /* I - HTTP connection to server */ while ((bytes = read(fd, buffer, sizeof(buffer))) > 0) if (httpCheck(http)) { - if ((status = httpUpdate(http)) != HTTP_CONTINUE) + if ((status = httpUpdate(http)) != HTTP_STATUS_CONTINUE) break; } else - httpWrite2(http, buffer, bytes); + httpWrite2(http, buffer, (size_t)bytes); } - if (status == HTTP_CONTINUE) + if (status == HTTP_STATUS_CONTINUE) { httpWrite2(http, buffer, 0); - while ((status = httpUpdate(http)) == HTTP_CONTINUE); + while ((status = httpUpdate(http)) == HTTP_STATUS_CONTINUE); } - if (status == HTTP_ERROR && !retries) + if (status == HTTP_STATUS_ERROR && !retries) { - DEBUG_printf(("cupsPutFd: retry on status %d\n", status)); + DEBUG_printf(("2cupsPutFd: retry on status %d", status)); retries ++; @@ -361,9 +371,9 @@ cupsPutFd(http_t *http, /* I - HTTP connection to server */ httpFlush(http); /* Reconnect... */ - if (httpReconnect(http)) + if (httpReconnect2(http, 30000, NULL)) { - status = HTTP_ERROR; + status = HTTP_STATUS_ERROR; break; } @@ -371,9 +381,9 @@ cupsPutFd(http_t *http, /* I - HTTP connection to server */ continue; } - DEBUG_printf(("cupsPutFd: status=%d\n", status)); + DEBUG_printf(("2cupsPutFd: status=%d", status)); - if (status == HTTP_UNAUTHORIZED) + if (status == HTTP_STATUS_UNAUTHORIZED) { /* * Flush any error message... @@ -386,46 +396,54 @@ cupsPutFd(http_t *http, /* I - HTTP connection to server */ */ if (cupsDoAuthentication(http, "PUT", resource)) + { + status = HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED; break; + } - if (httpReconnect(http)) + if (httpReconnect2(http, 30000, NULL)) { - status = HTTP_ERROR; + status = HTTP_STATUS_ERROR; break; } continue; } #ifdef HAVE_SSL - else if (status == HTTP_UPGRADE_REQUIRED) + else if (status == HTTP_STATUS_UPGRADE_REQUIRED) { /* Flush any error message... */ httpFlush(http); /* Reconnect... */ - if (httpReconnect(http)) + if (httpReconnect2(http, 30000, NULL)) { - status = HTTP_ERROR; + status = HTTP_STATUS_ERROR; break; } /* Upgrade with encryption... */ - httpEncryption(http, HTTP_ENCRYPT_REQUIRED); + httpEncryption(http, HTTP_ENCRYPTION_REQUIRED); /* Try again, this time with encryption enabled... */ continue; } #endif /* HAVE_SSL */ } - while (status == HTTP_UNAUTHORIZED || status == HTTP_UPGRADE_REQUIRED || - (status == HTTP_ERROR && retries < 2)); + while (status == HTTP_STATUS_UNAUTHORIZED || status == HTTP_STATUS_UPGRADE_REQUIRED || + (status == HTTP_STATUS_ERROR && retries < 2)); /* * See if we actually put the file or an error... */ - if (status != HTTP_CREATED) + if (status != HTTP_STATUS_CREATED) + { + _cupsSetHTTPError(status); httpFlush(http); + } + + DEBUG_printf(("1cupsPutFd: Returning %d...", status)); return (status); } @@ -434,13 +452,14 @@ cupsPutFd(http_t *http, /* I - HTTP connection to server */ /* * 'cupsPutFile()' - Put a file on the server. * - * This function returns HTTP_CREATED when the file is stored successfully. + * This function returns @code HTTP_CREATED@ when the file is stored + * successfully. * - * @since CUPS 1.1.20@ + * @since CUPS 1.1.20/macOS 10.4@ */ http_status_t /* O - HTTP status */ -cupsPutFile(http_t *http, /* I - HTTP connection to server */ +cupsPutFile(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ const char *resource, /* I - Resource name */ const char *filename) /* I - Filename */ { @@ -457,7 +476,7 @@ cupsPutFile(http_t *http, /* I - HTTP connection to server */ if (http) http->error = EINVAL; - return (HTTP_ERROR); + return (HTTP_STATUS_ERROR); } /* @@ -472,7 +491,7 @@ cupsPutFile(http_t *http, /* I - HTTP connection to server */ http->error = errno; - return (HTTP_ERROR); + return (HTTP_STATUS_ERROR); } /* @@ -485,8 +504,3 @@ cupsPutFile(http_t *http, /* I - HTTP connection to server */ return (status); } - - -/* - * End of "$Id: getputfile.c 5235 2006-03-06 13:02:23Z mike $". - */