X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=cups%2Fadminutil.c;h=5a7dea0924afb2a8404722b13fe28c6a258224ad;hb=6539a0afd57df07c1dd476775d92a28c5fce892d;hp=edef4f909f09295f550ee303f089feddf8e069d0;hpb=07725fee410af68be5081d9b1af3536eff5326b8;p=thirdparty%2Fcups.git diff --git a/cups/adminutil.c b/cups/adminutil.c index edef4f909..5a7dea092 100644 --- a/cups/adminutil.c +++ b/cups/adminutil.c @@ -1,56 +1,33 @@ /* - * "$Id: adminutil.c 5970 2006-09-19 20:11:08Z mike $" + * "$Id$" * - * Administration utility API definitions for the Common UNIX Printing - * System (CUPS). + * Administration utility API definitions for CUPS. * - * MANY OF THE FUNCTIONS IN THIS HEADER ARE PRIVATE AND SUBJECT TO - * CHANGE AT ANY TIME. USE AT YOUR OWN RISK. + * Copyright 2007-2014 by Apple Inc. + * Copyright 2001-2007 by Easy Software Products. * - * Copyright 2001-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 + * 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: - * - * cupsAdminCreateWindowsPPD() - Create the Windows PPD file for a printer. - * cupsAdminExportSamba() - Export a printer to Samba. - * _cupsAdminGetServerSettings() - Get settings from the server. - * _cupsAdminSetServerSettings() - Set settings on the server. - * do_samba_command() - Do a SAMBA command. - * get_cupsd_conf() - Get the current cupsd.conf file. - * invalidate_cupsd_cache() - Invalidate the cached cupsd.conf settings. - * write_option() - Write a CUPS option to a PPD file. + * This file is subject to the Apple OS-Developed Software exception. */ /* * Include necessary headers... */ +#include "cups-private.h" #include "adminutil.h" -#include "globals.h" -#include "debug.h" -#include #include -#include #include -#include +#ifdef WIN32 +#else +# include +# include +#endif /* WIN32 */ /* @@ -64,7 +41,7 @@ static int do_samba_command(const char *command, FILE *logfile); static http_status_t get_cupsd_conf(http_t *http, _cups_globals_t *cg, time_t last_update, char *name, - int namelen, int *remote); + size_t namelen, int *remote); static void invalidate_cupsd_cache(_cups_globals_t *cg); static void write_option(cups_file_t *dstfp, int order, const char *name, const char *text, @@ -76,11 +53,13 @@ static void write_option(cups_file_t *dstfp, int order, /* * 'cupsAdminCreateWindowsPPD()' - Create the Windows PPD file for a printer. + * + * @deprecated@ */ char * /* O - PPD file or NULL */ cupsAdminCreateWindowsPPD( - http_t *http, /* I - Connection to server */ + http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ const char *dest, /* I - Printer or class */ char *buffer, /* I - Filename buffer */ int bufsize) /* I - Size of filename buffer */ @@ -100,6 +79,7 @@ cupsAdminCreateWindowsPPD( option[41], /* Option */ choice[41]; /* Choice */ int jcloption, /* In a JCL option? */ + jclorder, /* Next JCL order dependency */ linenum; /* Current line number */ time_t curtime; /* Current time */ struct tm *curdate; /* Current date */ @@ -121,6 +101,9 @@ cupsAdminCreateWindowsPPD( if (buffer) *buffer = '\0'; + if (!http) + http = _cupsConnect(); + if (!http || !dest || !buffer || bufsize < 2) return (NULL); @@ -135,7 +118,7 @@ cupsAdminCreateWindowsPPD( * Get the supported banner pages, etc. for the printer... */ - request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES); + request = ippNewRequest(IPP_OP_GET_PRINTER_ATTRIBUTES); httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, "localhost", 0, "/printers/%s", dest); @@ -151,7 +134,7 @@ cupsAdminCreateWindowsPPD( */ response = cupsDoRequest(http, request, "/"); - if (!response || cupsLastError() > IPP_OK_CONFLICT) + if (!response || cupsLastError() > IPP_STATUS_OK_CONFLICTING) { unlink(src); return (NULL); @@ -197,6 +180,7 @@ cupsAdminCreateWindowsPPD( */ jcloption = 0; + jclorder = 0; linenum = 0; language = cupsLangDefault(); @@ -235,17 +219,30 @@ cupsAdminCreateWindowsPPD( jcloption = 0; cupsFilePrintf(dstfp, "%s\n", line); } + else if (jcloption && !strncmp(line, "*OrderDependency:", 17)) + { + for (ptr = line + 17; _cups_isspace(*ptr); ptr ++); + + ptr = strchr(ptr, ' '); + + if (ptr) + { + cupsFilePrintf(dstfp, "*OrderDependency: %d%s\n", jclorder, ptr); + jclorder ++; + } + else + cupsFilePrintf(dstfp, "%s\n", line); + } else if (jcloption && strncmp(line, "*End", 4) && - strncmp(line, "*Default", 8) && - strncmp(line, "*OrderDependency", 16)) + strncmp(line, "*Default", 8)) { if ((ptr = strchr(line, ':')) == NULL) { snprintf(line, sizeof(line), - _cupsLangString(language, _("Missing value on line %d!\n")), - linenum); - _cupsSetError(IPP_DOCUMENT_FORMAT_ERROR, line); + _cupsLangString(language, _("Missing value on line %d.")), + linenum); + _cupsSetError(IPP_STATUS_ERROR_DOCUMENT_FORMAT_ERROR, line, 0); cupsFileClose(srcfp); cupsFileClose(dstfp); @@ -262,9 +259,9 @@ cupsAdminCreateWindowsPPD( { snprintf(line, sizeof(line), _cupsLangString(language, - _("Missing double quote on line %d!\n")), + _("Missing double quote on line %d.")), linenum); - _cupsSetError(IPP_DOCUMENT_FORMAT_ERROR, line); + _cupsSetError(IPP_STATUS_ERROR_DOCUMENT_FORMAT_ERROR, line, 0); cupsFileClose(srcfp); cupsFileClose(dstfp); @@ -277,13 +274,13 @@ cupsAdminCreateWindowsPPD( return (NULL); } - if (sscanf(line, "*%40s%*[ \t]%40[^/]", option, choice) != 2) + if (sscanf(line, "*%40s%*[ \t]%40[^:/]", option, choice) != 2) { snprintf(line, sizeof(line), _cupsLangString(language, - _("Bad option + choice on line %d!\n")), + _("Bad option + choice on line %d.")), linenum); - _cupsSetError(IPP_DOCUMENT_FORMAT_ERROR, line); + _cupsSetError(IPP_STATUS_ERROR_DOCUMENT_FORMAT_ERROR, line, 0); cupsFileClose(srcfp); cupsFileClose(dstfp); @@ -311,7 +308,7 @@ cupsAdminCreateWindowsPPD( } } - snprintf(ptr + 1, sizeof(line) - (ptr - line + 1), + snprintf(ptr + 1, sizeof(line) - (size_t)(ptr - line + 1), "%%cupsJobTicket: %s=%s\n\"\n*End", option, choice); cupsFilePrintf(dstfp, "*%% Changed for CUPS Windows Driver...\n%s\n", @@ -324,6 +321,18 @@ cupsAdminCreateWindowsPPD( cupsFileClose(srcfp); unlink(src); + if (linenum == 0) + { + _cupsSetError(IPP_STATUS_ERROR_DOCUMENT_FORMAT_ERROR, _("Empty PPD file."), 1); + + cupsFileClose(dstfp); + unlink(buffer); + + *buffer = '\0'; + + return (NULL); + } + /* * Now add the CUPS-specific attributes and options... */ @@ -340,24 +349,24 @@ cupsAdminCreateWindowsPPD( IPP_TAG_ZERO)) != NULL && (suppattr = ippFindAttribute(response, "job-hold-until-supported", IPP_TAG_ZERO)) != NULL) - write_option(dstfp, 10, "cupsJobHoldUntil", "Hold Until", "job-hold-until", - suppattr, defattr, 0, 1); + write_option(dstfp, jclorder ++, "cupsJobHoldUntil", "Hold Until", + "job-hold-until", suppattr, defattr, 0, 1); if ((defattr = ippFindAttribute(response, "job-priority-default", IPP_TAG_INTEGER)) != NULL && (suppattr = ippFindAttribute(response, "job-priority-supported", IPP_TAG_RANGE)) != NULL) - write_option(dstfp, 11, "cupsJobPriority", "Priority", "job-priority", - suppattr, defattr, 0, 1); + write_option(dstfp, jclorder ++, "cupsJobPriority", "Priority", + "job-priority", suppattr, defattr, 0, 1); if ((defattr = ippFindAttribute(response, "job-sheets-default", IPP_TAG_ZERO)) != NULL && (suppattr = ippFindAttribute(response, "job-sheets-supported", IPP_TAG_ZERO)) != NULL) { - write_option(dstfp, 20, "cupsJobSheetsStart", "Start Banner", + write_option(dstfp, jclorder ++, "cupsJobSheetsStart", "Start Banner", "job-sheets", suppattr, defattr, 0, 2); - write_option(dstfp, 21, "cupsJobSheetsEnd", "End Banner", + write_option(dstfp, jclorder, "cupsJobSheetsEnd", "End Banner", "job-sheets", suppattr, defattr, 1, 2); } @@ -372,6 +381,8 @@ cupsAdminCreateWindowsPPD( /* * 'cupsAdminExportSamba()' - Export a printer to Samba. + * + * @deprecated@ */ int /* O - 1 on success, 0 on failure */ @@ -402,7 +413,7 @@ cupsAdminExportSamba( if (!dest || !ppd || !samba_server || !samba_user || !samba_password) { - _cupsSetError(IPP_INTERNAL_ERROR, NULL); + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0); return (0); } @@ -412,7 +423,7 @@ cupsAdminExportSamba( if ((fp = cupsTempFile2(authfile, sizeof(authfile))) == NULL) { - _cupsSetError(IPP_INTERNAL_ERROR, strerror(errno)); + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, NULL, 0); return (0); } @@ -463,12 +474,12 @@ cupsAdminExportSamba( snprintf(message, sizeof(message), _cupsLangString(language, _("Unable to copy Windows 2000 printer " - "driver files (%d)!")), status); + "driver files (%d).")), status); - _cupsSetError(IPP_INTERNAL_ERROR, message); + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, message, 0); if (logfile) - _cupsLangPrintf(logfile, "%s\n", message); + _cupsLangPuts(logfile, message); unlink(authfile); @@ -498,18 +509,18 @@ cupsAdminExportSamba( snprintf(message, sizeof(message), _cupsLangString(language, _("Unable to copy CUPS printer driver " - "files (%d)!")), status); + "files (%d).")), status); - _cupsSetError(IPP_INTERNAL_ERROR, message); + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, message, 0); if (logfile) - _cupsLangPrintf(logfile, "%s\n", message); + _cupsLangPuts(logfile, message); unlink(authfile); return (0); } - + /* * Do the rpcclient command needed for the CUPS drivers... */ @@ -541,12 +552,12 @@ cupsAdminExportSamba( snprintf(message, sizeof(message), _cupsLangString(language, _("Unable to install Windows 2000 printer " - "driver files (%d)!")), status); + "driver files (%d).")), status); - _cupsSetError(IPP_INTERNAL_ERROR, message); + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, message, 0); if (logfile) - _cupsLangPrintf(logfile, "%s\n", message); + _cupsLangPuts(logfile, message); unlink(authfile); @@ -554,6 +565,10 @@ cupsAdminExportSamba( } } + /* + * See if we have the Win9x PS driver... + */ + snprintf(file, sizeof(file), "%s/drivers/ADOBEPS4.DRV", cg->cups_datadir); if (!access(file, 0)) { @@ -582,12 +597,12 @@ cupsAdminExportSamba( snprintf(message, sizeof(message), _cupsLangString(language, _("Unable to copy Windows 9x printer " - "driver files (%d)!")), status); + "driver files (%d).")), status); - _cupsSetError(IPP_INTERNAL_ERROR, message); + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, message, 0); if (logfile) - _cupsLangPrintf(logfile, "%s\n", message); + _cupsLangPuts(logfile, message); unlink(authfile); @@ -611,12 +626,142 @@ cupsAdminExportSamba( snprintf(message, sizeof(message), _cupsLangString(language, _("Unable to install Windows 9x printer " - "driver files (%d)!")), status); + "driver files (%d).")), status); - _cupsSetError(IPP_INTERNAL_ERROR, message); + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, message, 0); if (logfile) - _cupsLangPrintf(logfile, "%s\n", message); + _cupsLangPuts(logfile, message); + + unlink(authfile); + + return (0); + } + } + + /* + * See if we have the 64-bit Windows PS driver... + * + * Files: + * + * x64/ps5ui.dll + * x64/pscript.hlp + * x64/pscript.ntf + * x64/pscript5.dll + */ + + snprintf(file, sizeof(file), "%s/drivers/x64/pscript5.dll", cg->cups_datadir); + if (!access(file, 0)) + { + have_drivers |= 4; + + /* + * 64-bit Windows driver is installed; do the smbclient commands needed + * to copy the Win64 drivers over... + */ + + snprintf(address, sizeof(address), "//%s/print$", samba_server); + + snprintf(subcmd, sizeof(subcmd), + "mkdir x64;" + "put %s x64/%s.ppd;" + "put %s/drivers/x64/ps5ui.dll x64/ps5ui.dll;" + "put %s/drivers/x64/pscript.hlp x64/pscript.hlp;" + "put %s/drivers/x64/pscript.ntf x64/pscript.ntf;" + "put %s/drivers/x64/pscript5.dll x64/pscript5.dll", + ppd, dest, cg->cups_datadir, cg->cups_datadir, + cg->cups_datadir, cg->cups_datadir); + + if ((status = do_samba_command("smbclient", address, subcmd, + authfile, logfile)) != 0) + { + snprintf(message, sizeof(message), + _cupsLangString(language, + _("Unable to copy 64-bit Windows printer " + "driver files (%d).")), status); + + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, message, 0); + + if (logfile) + _cupsLangPuts(logfile, message); + + unlink(authfile); + + return (0); + } + + /* + * See if we also have the CUPS driver files; if so, use them! + */ + + snprintf(file, sizeof(file), "%s/drivers/x64/cupsps6.dll", cg->cups_datadir); + if (!access(file, 0)) + { + /* + * Copy the CUPS driver files over... + */ + + snprintf(subcmd, sizeof(subcmd), + "put %s/drivers/x64/cups6.ini x64/cups6.ini;" + "put %s/drivers/x64/cupsps6.dll x64/cupsps6.dll;" + "put %s/drivers/x64/cupsui6.dll x64/cupsui6.dll", + cg->cups_datadir, cg->cups_datadir, cg->cups_datadir); + + if ((status = do_samba_command("smbclient", address, subcmd, + authfile, logfile)) != 0) + { + snprintf(message, sizeof(message), + _cupsLangString(language, + _("Unable to copy 64-bit CUPS printer driver " + "files (%d).")), status); + + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, message, 0); + + if (logfile) + _cupsLangPuts(logfile, message); + + unlink(authfile); + + return (0); + } + + /* + * Do the rpcclient command needed for the CUPS drivers... + */ + + snprintf(subcmd, sizeof(subcmd), + "adddriver \"Windows x64\" \"%s:" + "pscript5.dll:%s.ppd:ps5ui.dll:pscript.hlp:NULL:RAW:" + "pscript5.dll,%s.ppd,ps5ui.dll,pscript.hlp,pscript.ntf," + "cups6.ini,cupsps6.dll,cupsui6.dll\"", + dest, dest, dest); + } + else + { + /* + * Don't have the CUPS drivers, so just use the standard Windows + * drivers... + */ + + snprintf(subcmd, sizeof(subcmd), + "adddriver \"Windows x64\" \"%s:" + "pscript5.dll:%s.ppd:ps5ui.dll:pscript.hlp:NULL:RAW:" + "pscript5.dll,%s.ppd,ps5ui.dll,pscript.hlp,pscript.ntf\"", + dest, dest, dest); + } + + if ((status = do_samba_command("rpcclient", samba_server, subcmd, + authfile, logfile)) != 0) + { + snprintf(message, sizeof(message), + _cupsLangString(language, + _("Unable to install Windows 2000 printer " + "driver files (%d).")), status); + + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, message, 0); + + if (logfile) + _cupsLangPuts(logfile, message); unlink(authfile); @@ -629,21 +774,27 @@ cupsAdminExportSamba( if (!have_drivers) strlcpy(message, _cupsLangString(language, - _("No Windows printer drivers are installed!")), + _("No Windows printer drivers are installed.")), sizeof(message)); else strlcpy(message, _cupsLangString(language, _("Warning, no Windows 2000 printer drivers " - "are installed!")), + "are installed.")), sizeof(message)); - _cupsSetError(IPP_INTERNAL_ERROR, message); - _cupsLangPrintf(logfile, "%s\n", message); + _cupsSetError(IPP_STATUS_ERROR_NOT_FOUND, message, 0); + _cupsLangPuts(logfile, message); } if (have_drivers == 0) + { + _cupsSetError(IPP_STATUS_ERROR_NOT_FOUND, message, 0); + + unlink(authfile); + return (0); + } /* * Finally, associate the drivers we just added with the queue... @@ -656,13 +807,13 @@ cupsAdminExportSamba( { snprintf(message, sizeof(message), _cupsLangString(language, - _("Unable to set Windows printer driver (%d)!\n")), + _("Unable to set Windows printer driver (%d).")), status); - _cupsSetError(IPP_INTERNAL_ERROR, message); + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, message, 0); if (logfile) - _cupsLangPrintf(logfile, "%s\n", message); + _cupsLangPuts(logfile, message); unlink(authfile); @@ -676,17 +827,17 @@ cupsAdminExportSamba( /* - * '_cupsAdminGetServerSettings()' - Get settings from the server. + * 'cupsAdminGetServerSettings()' - Get settings from the server. * * The returned settings should be freed with cupsFreeOptions() when * you are done with them. * - * @since CUPS 1.2@ + * @since CUPS 1.3/OS X 10.5@ */ int /* O - 1 on success, 0 on failure */ -_cupsAdminGetServerSettings( - http_t *http, /* I - Connection to server */ +cupsAdminGetServerSettings( + http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ int *num_settings, /* O - Number of settings */ cups_option_t **settings) /* O - Settings */ { @@ -705,9 +856,65 @@ _cupsAdminGetServerSettings( * Range check input... */ + if (!http) + { + /* + * See if we are connected to the same server... + */ + + if (cg->http) + { + /* + * Compare the connection hostname, port, and encryption settings to + * the cached defaults; these were initialized the first time we + * connected... + */ + + if (strcmp(cg->http->hostname, cg->server) || + cg->ipp_port != httpAddrPort(cg->http->hostaddr) || + (cg->http->encryption != cg->encryption && + cg->http->encryption == HTTP_ENCRYPTION_NEVER)) + { + /* + * Need to close the current connection because something has changed... + */ + + httpClose(cg->http); + cg->http = NULL; + } + } + + /* + * (Re)connect as needed... + */ + + if (!cg->http) + { + if ((cg->http = httpConnect2(cupsServer(), ippPort(), NULL, AF_UNSPEC, + cupsEncryption(), 1, 0, NULL)) == NULL) + { + if (errno) + _cupsSetError(IPP_STATUS_ERROR_SERVICE_UNAVAILABLE, NULL, 0); + else + _cupsSetError(IPP_STATUS_ERROR_SERVICE_UNAVAILABLE, + _("Unable to connect to host."), 1); + + if (num_settings) + *num_settings = 0; + + if (settings) + *settings = NULL; + + return (0); + } + } + + http = cg->http; + } + if (!http || !num_settings || !settings) { - _cupsSetError(IPP_INTERNAL_ERROR, NULL); + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0); if (num_settings) *num_settings = 0; @@ -726,7 +933,7 @@ _cupsAdminGetServerSettings( */ if ((status = get_cupsd_conf(http, cg, cg->cupsd_update, cupsdconf, - sizeof(cupsdconf), &remote)) == HTTP_OK) + sizeof(cupsdconf), &remote)) == HTTP_STATUS_OK) { if ((cupsd = cupsFileOpen(cupsdconf, "r")) == NULL) { @@ -734,9 +941,9 @@ _cupsAdminGetServerSettings( snprintf(message, sizeof(message), - _cupsLangString(cupsLangDefault(), _("open of %s failed: %s")), + _cupsLangString(cupsLangDefault(), _("Open of %s failed: %s")), cupsdconf, strerror(errno)); - _cupsSetError(IPP_INTERNAL_ERROR, message); + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, message, 0); } } else @@ -750,9 +957,8 @@ _cupsAdminGetServerSettings( int remote_access = 0, /* Remote access allowed? */ remote_admin = 0, /* Remote administration allowed? */ + remote_any = 0, /* Remote access from anywhere allowed? */ browsing = 1, /* Browsing enabled? */ - browse_allow = 1, /* Browse address set? */ - browse_address = 0, /* Browse address set? */ cancel_policy = 1, /* Cancel-job policy set? */ debug_logging = 0; /* LogLevel debug set? */ int linenum = 0, /* Line number in file */ @@ -769,10 +975,10 @@ _cupsAdminGetServerSettings( while (cupsFileGetConf(cupsd, line, sizeof(line), &value, &linenum)) { - if (!value) - continue; + if (!value && strncmp(line, "")) + else if (!_cups_strcasecmp(line, "")) { in_policy = 0; } - else if (!strcasecmp(line, "")) + else if (!_cups_strcasecmp(line, "")) { in_cancel_job = 0; } - else if (!strcasecmp(line, "Require") && in_cancel_job) + else if (!_cups_strcasecmp(line, "Require") && in_cancel_job) { cancel_policy = 0; } - else if (!strcasecmp(line, "")) + else if (!_cups_strcasecmp(line, "")) { in_admin_location = 0; in_location = 0; } - else if (!strcasecmp(line, "Allow") && in_admin_location && - strcasecmp(value, "localhost") && strcasecmp(value, "127.0.0.1") + else if (!_cups_strcasecmp(line, "Allow") && value && + _cups_strcasecmp(value, "localhost") && + _cups_strcasecmp(value, "127.0.0.1") #ifdef AF_LOCAL && *value != '/' #endif /* AF_LOCAL */ @@ -881,9 +1079,18 @@ _cupsAdminGetServerSettings( #endif /* AF_INET6 */ ) { - remote_admin = 1; + if (in_admin_location) + remote_admin = 1; + else if (!_cups_strcasecmp(value, "all")) + remote_any = 1; } - else if (line[0] != '<' && !in_location && !in_policy) + else if (line[0] != '<' && !in_location && !in_policy && + _cups_strcasecmp(line, "Allow") && + _cups_strcasecmp(line, "AuthType") && + _cups_strcasecmp(line, "Deny") && + _cups_strcasecmp(line, "Order") && + _cups_strcasecmp(line, "Require") && + _cups_strcasecmp(line, "Satisfy")) cg->cupsd_num_settings = cupsAddOption(line, value, cg->cupsd_num_settings, &(cg->cupsd_settings)); @@ -902,15 +1109,14 @@ _cupsAdminGetServerSettings( cg->cupsd_num_settings, &(cg->cupsd_settings)); - cg->cupsd_num_settings = cupsAddOption(CUPS_SERVER_REMOTE_PRINTERS, - (browsing && browse_allow) ? - "1" : "0", + cg->cupsd_num_settings = cupsAddOption(CUPS_SERVER_REMOTE_ANY, + remote_any ? "1" : "0", cg->cupsd_num_settings, &(cg->cupsd_settings)); cg->cupsd_num_settings = cupsAddOption(CUPS_SERVER_SHARE_PRINTERS, - (remote_access && browsing && - browse_address) ? "1" : "0", + (remote_access && browsing) ? "1" : + "0", cg->cupsd_num_settings, &(cg->cupsd_settings)); @@ -919,7 +1125,7 @@ _cupsAdminGetServerSettings( cg->cupsd_num_settings, &(cg->cupsd_settings)); } - else if (status != HTTP_NOT_MODIFIED) + else if (status != HTTP_STATUS_NOT_MODIFIED) invalidate_cupsd_cache(cg); /* @@ -940,14 +1146,14 @@ _cupsAdminGetServerSettings( /* - * '_cupsAdminSetServerSettings()' - Set settings on the server. + * 'cupsAdminSetServerSettings()' - Set settings on the server. * - * @since CUPS 1.2@ + * @since CUPS 1.3/OS X 10.5@ */ int /* O - 1 on success, 0 on failure */ -_cupsAdminSetServerSettings( - http_t *http, /* I - Connection to server */ +cupsAdminSetServerSettings( + http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ int num_settings, /* I - Number of settings */ cups_option_t *settings) /* I - Settings */ { @@ -971,9 +1177,9 @@ _cupsAdminSetServerSettings( in_conf_location, /* In the /admin/conf location? */ in_root_location; /* In the / location? */ const char *val; /* Setting value */ - int remote_printers, /* Show remote printers */ - share_printers, /* Share local printers */ + int share_printers, /* Share local printers */ remote_admin, /* Remote administration allowed? */ + remote_any, /* Remote access from anywhere? */ user_cancel_any, /* Cancel-job policy set? */ debug_logging; /* LogLevel debug set? */ int wrote_port_listen, /* Wrote the port/listen lines? */ @@ -985,6 +1191,10 @@ _cupsAdminSetServerSettings( wrote_root_location; /* Wrote the / location? */ int indent; /* Indentation */ int cupsd_num_settings; /* New number of settings */ + int old_share_printers, /* Share local printers */ + old_remote_admin, /* Remote administration allowed? */ + old_user_cancel_any, /* Cancel-job policy set? */ + old_debug_logging; /* LogLevel debug set? */ cups_option_t *cupsd_settings, /* New settings */ *setting; /* Current setting */ _cups_globals_t *cg = _cupsGlobals(); /* Global data */ @@ -994,9 +1204,12 @@ _cupsAdminSetServerSettings( * Range check input... */ + if (!http) + http = _cupsConnect(); + if (!http || !num_settings || !settings) { - _cupsSetError(IPP_INTERNAL_ERROR, NULL); + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0); return (0); } @@ -1005,51 +1218,163 @@ _cupsAdminSetServerSettings( * Get the cupsd.conf file... */ - if ((status = get_cupsd_conf(http, cg, 0, cupsdconf, sizeof(cupsdconf), - &remote)) == HTTP_OK) + if (get_cupsd_conf(http, cg, 0, cupsdconf, sizeof(cupsdconf), + &remote) == HTTP_STATUS_OK) { if ((cupsd = cupsFileOpen(cupsdconf, "r")) == NULL) { - _cupsSetError(IPP_INTERNAL_ERROR, strerror(errno)); + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, NULL, 0); return (0); } } else return (0); + /* + * Get current settings... + */ + + if (!cupsAdminGetServerSettings(http, &cupsd_num_settings, + &cupsd_settings)) + return (0); + + if ((val = cupsGetOption(CUPS_SERVER_DEBUG_LOGGING, cupsd_num_settings, + cupsd_settings)) != NULL) + old_debug_logging = atoi(val); + else + old_debug_logging = 0; + + DEBUG_printf(("1cupsAdminSetServerSettings: old debug_logging=%d", + old_debug_logging)); + + if ((val = cupsGetOption(CUPS_SERVER_REMOTE_ADMIN, cupsd_num_settings, + cupsd_settings)) != NULL) + old_remote_admin = atoi(val); + else + old_remote_admin = 0; + + DEBUG_printf(("1cupsAdminSetServerSettings: old remote_admin=%d", + old_remote_admin)); + + if ((val = cupsGetOption(CUPS_SERVER_REMOTE_ANY, cupsd_num_settings, + cupsd_settings)) != NULL) + remote_any = atoi(val); + else + remote_any = 0; + + DEBUG_printf(("1cupsAdminSetServerSettings: old remote_any=%d", + remote_any)); + + if ((val = cupsGetOption(CUPS_SERVER_SHARE_PRINTERS, cupsd_num_settings, + cupsd_settings)) != NULL) + old_share_printers = atoi(val); + else + old_share_printers = 0; + + DEBUG_printf(("1cupsAdminSetServerSettings: old share_printers=%d", + old_share_printers)); + + if ((val = cupsGetOption(CUPS_SERVER_USER_CANCEL_ANY, cupsd_num_settings, + cupsd_settings)) != NULL) + old_user_cancel_any = atoi(val); + else + old_user_cancel_any = 0; + + DEBUG_printf(("1cupsAdminSetServerSettings: old user_cancel_any=%d", + old_user_cancel_any)); + + cupsFreeOptions(cupsd_num_settings, cupsd_settings); + /* * Get basic settings... */ if ((val = cupsGetOption(CUPS_SERVER_DEBUG_LOGGING, num_settings, settings)) != NULL) + { debug_logging = atoi(val); + + if (debug_logging == old_debug_logging) + { + /* + * No change to this setting... + */ + + debug_logging = -1; + } + } else - debug_logging = 0; + debug_logging = -1; + + DEBUG_printf(("1cupsAdminSetServerSettings: debug_logging=%d", + debug_logging)); + + if ((val = cupsGetOption(CUPS_SERVER_REMOTE_ANY, num_settings, + settings)) != NULL) + remote_any = atoi(val); + + DEBUG_printf(("1cupsAdminSetServerSettings: remote_any=%d", + remote_any)); if ((val = cupsGetOption(CUPS_SERVER_REMOTE_ADMIN, num_settings, settings)) != NULL) + { remote_admin = atoi(val); - else - remote_admin = 0; - if ((val = cupsGetOption(CUPS_SERVER_REMOTE_PRINTERS, num_settings, - settings)) != NULL) - remote_printers = atoi(val); + if (remote_admin == old_remote_admin) + { + /* + * No change to this setting... + */ + + remote_admin = -1; + } + } else - remote_printers = 1; + remote_admin = -1; + + DEBUG_printf(("1cupsAdminSetServerSettings: remote_admin=%d", + remote_admin)); if ((val = cupsGetOption(CUPS_SERVER_SHARE_PRINTERS, num_settings, settings)) != NULL) + { share_printers = atoi(val); + + if (share_printers == old_share_printers) + { + /* + * No change to this setting... + */ + + share_printers = -1; + } + } else - share_printers = 0; + share_printers = -1; + + DEBUG_printf(("1cupsAdminSetServerSettings: share_printers=%d", + share_printers)); if ((val = cupsGetOption(CUPS_SERVER_USER_CANCEL_ANY, num_settings, settings)) != NULL) + { user_cancel_any = atoi(val); + + if (user_cancel_any == old_user_cancel_any) + { + /* + * No change to this setting... + */ + + user_cancel_any = -1; + } + } else - user_cancel_any = 0; + user_cancel_any = -1; + + DEBUG_printf(("1cupsAdminSetServerSettings: user_cancel_any=%d", + user_cancel_any)); /* * Create a temporary file for the new cupsd.conf file... @@ -1062,7 +1387,7 @@ _cupsAdminSetServerSettings( if (remote) unlink(cupsdconf); - _cupsSetError(IPP_INTERNAL_ERROR, strerror(errno)); + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, NULL, 0); return (0); } @@ -1101,13 +1426,14 @@ _cupsAdminSetServerSettings( while (cupsFileGetConf(cupsd, line, sizeof(line), &value, &linenum)) { - if (!strcasecmp(line, "Port") || !strcasecmp(line, "Listen")) + if ((!_cups_strcasecmp(line, "Port") || !_cups_strcasecmp(line, "Listen")) && + (remote_admin >= 0 || remote_any > 0 || share_printers >= 0)) { if (!wrote_port_listen) { wrote_port_listen = 1; - if (share_printers || remote_admin) + if (remote_admin > 0 || remote_any > 0 || share_printers > 0) { cupsFilePuts(temp, "# Allow remote access\n"); cupsFilePrintf(temp, "Port %d\n", server_port); @@ -1125,50 +1451,54 @@ _cupsAdminSetServerSettings( cupsFilePuts(temp, "Listen " CUPS_DEFAULT_DOMAINSOCKET "\n"); #endif /* CUPS_DEFAULT_DOMAINSOCKET */ } - else if (value && value[0] == '/' && - strcmp(CUPS_DEFAULT_DOMAINSOCKET, value)) + else if (value && value[0] == '/' +#ifdef CUPS_DEFAULT_DOMAINSOCKET + && strcmp(CUPS_DEFAULT_DOMAINSOCKET, value) +#endif /* CUPS_DEFAULT_DOMAINSOCKET */ + ) cupsFilePrintf(temp, "Listen %s\n", value); } - else if (!strcasecmp(line, "Browsing") || - !strcasecmp(line, "BrowseAddress") || - !strcasecmp(line, "BrowseAllow") || - !strcasecmp(line, "BrowseDeny") || - !strcasecmp(line, "BrowseOrder")) + else if ((!_cups_strcasecmp(line, "Browsing") || + !_cups_strcasecmp(line, "BrowseLocalProtocols")) && + share_printers >= 0) { if (!wrote_browsing) { + int new_share_printers = (share_printers > 0 || + (share_printers == -1 && + old_share_printers > 0)); + wrote_browsing = 1; - if (remote_printers || share_printers) + if (new_share_printers) { - if (remote_printers && share_printers) - cupsFilePuts(temp, - "# Enable printer sharing and shared printers.\n"); - else if (remote_printers) - cupsFilePuts(temp, - "# Show shared printers on the local network.\n"); - else - cupsFilePuts(temp, - "# Share local printers on the local network.\n"); + const char *localp = cupsGetOption("BrowseLocalProtocols", + num_settings, settings); + + if (!localp || !localp[0]) + localp = cupsGetOption("BrowseLocalProtocols", cupsd_num_settings, + cupsd_settings); + cupsFilePuts(temp, "# Share local printers on the local network.\n"); cupsFilePuts(temp, "Browsing On\n"); - cupsFilePuts(temp, "BrowseOrder allow,deny\n"); - if (remote_printers) - cupsFilePuts(temp, "BrowseAllow @LOCAL\n"); + if (!localp) + localp = CUPS_DEFAULT_BROWSE_LOCAL_PROTOCOLS; + + cupsFilePrintf(temp, "BrowseLocalProtocols %s\n", localp); - if (share_printers) - cupsFilePuts(temp, "BrowseAddress @LOCAL\n"); + cupsd_num_settings = cupsAddOption("BrowseLocalProtocols", localp, + cupsd_num_settings, + &cupsd_settings); } else { - cupsFilePuts(temp, - "# Disable printer sharing and shared printers.\n"); + cupsFilePuts(temp, "# Disable printer sharing.\n"); cupsFilePuts(temp, "Browsing Off\n"); } } } - else if (!strcasecmp(line, "LogLevel")) + else if (!_cups_strcasecmp(line, "LogLevel") && debug_logging >= 0) { wrote_loglevel = 1; @@ -1181,18 +1511,18 @@ _cupsAdminSetServerSettings( else { cupsFilePuts(temp, "# Show general information in error_log.\n"); - cupsFilePuts(temp, "LogLevel info\n"); + cupsFilePuts(temp, "LogLevel " CUPS_DEFAULT_LOG_LEVEL "\n"); } } - else if (!strcasecmp(line, "\n", line, value); indent += 2; } - else if (!strcasecmp(line, "")) + else if (!_cups_strcasecmp(line, "")) { indent -= 2; if (!wrote_policy && in_default_policy) @@ -1204,8 +1534,8 @@ _cupsAdminSetServerSettings( "cancel a job...\n" " \n" " Order deny,allow\n" - " Allow @SYSTEM\n" - " Allow @OWNER\n" + " Require user @OWNER " + CUPS_DEFAULT_PRINTOPERATOR_AUTH "\n" " \n"); } @@ -1214,7 +1544,7 @@ _cupsAdminSetServerSettings( cupsFilePuts(temp, "\n"); } - else if (!strcasecmp(line, "\n", line, value); } - else if (!strcasecmp(line, "")) + else if (!_cups_strcasecmp(line, "")) { in_location = 0; indent -= 2; - if (in_admin_location) + if (in_admin_location && remote_admin >= 0) { wrote_admin_location = 1; if (remote_admin) cupsFilePuts(temp, " # Allow remote administration...\n"); - else + else if (remote_admin == 0) cupsFilePuts(temp, " # Restrict access to the admin pages...\n"); cupsFilePuts(temp, " Order allow,deny\n"); if (remote_admin) - cupsFilePuts(temp, " Allow @LOCAL\n"); - else - cupsFilePuts(temp, " Allow localhost\n"); + cupsFilePrintf(temp, " Allow %s\n", + remote_any > 0 ? "all" : "@LOCAL"); } - else if (in_conf_location) + else if (in_conf_location && remote_admin >= 0) { wrote_conf_location = 1; @@ -1261,30 +1590,31 @@ _cupsAdminSetServerSettings( cupsFilePuts(temp, " Order allow,deny\n"); if (remote_admin) - cupsFilePuts(temp, " Allow @LOCAL\n"); - else - cupsFilePuts(temp, " Allow localhost\n"); + cupsFilePrintf(temp, " Allow %s\n", + remote_any > 0 ? "all" : "@LOCAL"); } - else if (in_root_location) + else if (in_root_location && + (remote_admin >= 0 || remote_any > 0 || share_printers >= 0)) { wrote_root_location = 1; - if (remote_admin && share_printers) + if (remote_admin > 0 && share_printers > 0) cupsFilePuts(temp, " # Allow shared printing and remote " "administration...\n"); - else if (remote_admin) + else if (remote_admin > 0) cupsFilePuts(temp, " # Allow remote administration...\n"); - else if (share_printers) + else if (share_printers > 0) cupsFilePuts(temp, " # Allow shared printing...\n"); + else if (remote_any > 0) + cupsFilePuts(temp, " # Allow remote access...\n"); else cupsFilePuts(temp, " # Restrict access to the server...\n"); cupsFilePuts(temp, " Order allow,deny\n"); - if (remote_admin || share_printers) - cupsFilePuts(temp, " Allow @LOCAL\n"); - else - cupsFilePuts(temp, " Allow localhost\n"); + if (remote_admin > 0 || remote_any > 0 || share_printers > 0) + cupsFilePrintf(temp, " Allow %s\n", + remote_any > 0 ? "all" : "@LOCAL"); } in_admin_location = 0; @@ -1293,80 +1623,86 @@ _cupsAdminSetServerSettings( cupsFilePuts(temp, "\n"); } - else if (!strcasecmp(line, "= 0) { - for (valptr = value; !isspace(*valptr & 255) && *valptr; valptr ++); + /* + * Don't write anything for this limit section... + */ - if (*valptr) - *valptr++ = '\0'; + in_cancel_job = 2; + } + else + { + cupsFilePrintf(temp, "%*s%s", indent, "", line); - if (!strcasecmp(value, "cancel-job")) + while (*value) { - /* - * Write everything except for this definition... - */ + for (valptr = value; *valptr && !_cups_isspace(*valptr); valptr ++); - in_cancel_job = 1; + if (*valptr) + *valptr++ = '\0'; + + if (!_cups_strcasecmp(value, "cancel-job") && user_cancel_any >= 0) + { + /* + * Write everything except for this definition... + */ + + in_cancel_job = 1; + } + else + cupsFilePrintf(temp, " %s", value); + + for (value = valptr; _cups_isspace(*value); value ++); } - else - cupsFilePrintf(temp, " %s", value); - for (value = valptr; isspace(*value & 255); value ++); + cupsFilePuts(temp, ">\n"); } - - cupsFilePuts(temp, ">\n"); } + else + cupsFilePrintf(temp, "%*s%s %s>\n", indent, "", line, value); + + indent += 2; } - else if (!strcasecmp(line, "") && in_cancel_job) + else if (!_cups_strcasecmp(line, "") && in_cancel_job) { indent -= 2; if (in_cancel_job == 1) - cupsFilePuts(temp, " \n"); + cupsFilePuts(temp, " \n"); wrote_policy = 1; if (!user_cancel_any) cupsFilePuts(temp, " # Only the owner or an administrator can cancel " - "a job...\n" - " \n" - " Order deny,allow\n" - " Require user @OWNER @SYSTEM\n" + "a job...\n" + " \n" + " Order deny,allow\n" + " Require user @OWNER " + CUPS_DEFAULT_PRINTOPERATOR_AUTH "\n" " \n"); in_cancel_job = 0; } - else if ((in_admin_location || in_conf_location || in_root_location) && - (!strcasecmp(line, "Allow") || !strcasecmp(line, "Deny") || - !strcasecmp(line, "Order"))) + else if ((((in_admin_location || in_conf_location || in_root_location) && + (remote_admin >= 0 || remote_any > 0)) || + (in_root_location && share_printers >= 0)) && + (!_cups_strcasecmp(line, "Allow") || !_cups_strcasecmp(line, "Deny") || + !_cups_strcasecmp(line, "Order"))) continue; else if (in_cancel_job == 2) continue; - else if (!strcasecmp(line, "\n", line, value); else if (line[0] == '<') { if (value) @@ -1383,14 +1719,13 @@ _cupsAdminSetServerSettings( } } else if (!in_policy && !in_location && - (val = cupsGetOption(line, num_settings, settings)) != NULL && - !cupsGetOption(line, cupsd_num_settings, cupsd_settings)) + (val = cupsGetOption(line, num_settings, settings)) != NULL) { /* - * Add this directive to the list of directives we have written... + * Replace this directive's value with the new one... */ - cupsd_num_settings = cupsAddOption(line, value, cupsd_num_settings, + cupsd_num_settings = cupsAddOption(line, val, cupsd_num_settings, &cupsd_settings); /* @@ -1398,7 +1733,7 @@ _cupsAdminSetServerSettings( * only support setting root directives, not in sections... */ - cupsFilePrintf(temp, "%s %s\n", line, value); + cupsFilePrintf(temp, "%s %s\n", line, val); } else if (value) { @@ -1407,7 +1742,7 @@ _cupsAdminSetServerSettings( /* * Record the non-policy, non-location directives that we find * in the server settings, since we cache this info and record it - * in _cupsAdminGetServerSettings()... + * in cupsAdminGetServerSettings()... */ cupsd_num_settings = cupsAddOption(line, value, cupsd_num_settings, @@ -1424,25 +1759,12 @@ _cupsAdminSetServerSettings( * Write any missing info... */ - if (!wrote_browsing) + if (!wrote_browsing && share_printers >= 0) { - if (remote_printers || share_printers) + if (share_printers > 0) { - if (remote_printers && share_printers) - cupsFilePuts(temp, "# Enable printer sharing and shared printers.\n"); - else if (remote_printers) - cupsFilePuts(temp, "# Show shared printers on the local network.\n"); - else - cupsFilePuts(temp, "# Share local printers on the local network.\n"); - + cupsFilePuts(temp, "# Share local printers on the local network.\n"); cupsFilePuts(temp, "Browsing On\n"); - cupsFilePuts(temp, "BrowseOrder allow,deny\n"); - - if (remote_printers) - cupsFilePuts(temp, "BrowseAllow @LOCAL\n"); - - if (share_printers) - cupsFilePuts(temp, "BrowseAddress @LOCAL\n"); } else { @@ -1451,7 +1773,7 @@ _cupsAdminSetServerSettings( } } - if (!wrote_loglevel) + if (!wrote_loglevel && debug_logging >= 0) { if (debug_logging) { @@ -1461,13 +1783,14 @@ _cupsAdminSetServerSettings( else { cupsFilePuts(temp, "# Show general information in error_log.\n"); - cupsFilePuts(temp, "LogLevel info\n"); + cupsFilePuts(temp, "LogLevel " CUPS_DEFAULT_LOG_LEVEL "\n"); } } - if (!wrote_port_listen) + if (!wrote_port_listen && + (remote_admin >= 0 || remote_any > 0 || share_printers >= 0)) { - if (share_printers || remote_admin) + if (remote_admin > 0 || remote_any > 0 || share_printers > 0) { cupsFilePuts(temp, "# Allow remote access\n"); cupsFilePrintf(temp, "Port %d\n", ippPort()); @@ -1485,30 +1808,31 @@ _cupsAdminSetServerSettings( #endif /* CUPS_DEFAULT_DOMAINSOCKET */ } - if (!wrote_root_location) + if (!wrote_root_location && + (remote_admin >= 0 || remote_any > 0 || share_printers >= 0)) { - if (remote_admin && share_printers) + if (remote_admin > 0 && share_printers > 0) cupsFilePuts(temp, "# Allow shared printing and remote administration...\n"); - else if (remote_admin) + else if (remote_admin > 0) cupsFilePuts(temp, "# Allow remote administration...\n"); - else if (share_printers) + else if (share_printers > 0) cupsFilePuts(temp, "# Allow shared printing...\n"); + else if (remote_any > 0) + cupsFilePuts(temp, "# Allow remote access...\n"); else cupsFilePuts(temp, "# Restrict access to the server...\n"); cupsFilePuts(temp, "\n" " Order allow,deny\n"); - if (remote_admin || share_printers) - cupsFilePuts(temp, " Allow @LOCAL\n"); - else - cupsFilePuts(temp, " Allow localhost\n"); + if (remote_admin > 0 || remote_any > 0 || share_printers > 0) + cupsFilePrintf(temp, " Allow %s\n", remote_any > 0 ? "all" : "@LOCAL"); cupsFilePuts(temp, "\n"); } - if (!wrote_admin_location) + if (!wrote_admin_location && remote_admin >= 0) { if (remote_admin) cupsFilePuts(temp, "# Allow remote administration...\n"); @@ -1519,14 +1843,12 @@ _cupsAdminSetServerSettings( " Order allow,deny\n"); if (remote_admin) - cupsFilePuts(temp, " Allow @LOCAL\n"); - else - cupsFilePuts(temp, " Allow localhost\n"); + cupsFilePrintf(temp, " Allow %s\n", remote_any > 0 ? "all" : "@LOCAL"); cupsFilePuts(temp, "\n"); } - if (!wrote_conf_location) + if (!wrote_conf_location && remote_admin >= 0) { if (remote_admin) cupsFilePuts(temp, @@ -1535,23 +1857,21 @@ _cupsAdminSetServerSettings( cupsFilePuts(temp, "# Restrict access to the configuration files...\n"); cupsFilePuts(temp, "\n" - " AuthType Basic\n" + " AuthType Default\n" " Require user @SYSTEM\n" " Order allow,deny\n"); if (remote_admin) - cupsFilePuts(temp, " Allow @LOCAL\n"); - else - cupsFilePuts(temp, " Allow localhost\n"); + cupsFilePrintf(temp, " Allow %s\n", remote_any > 0 ? "all" : "@LOCAL"); cupsFilePuts(temp, "\n"); } - if (!wrote_policy) + if (!wrote_policy && user_cancel_any >= 0) { cupsFilePuts(temp, "\n" " # Job-related operations must be done by the owner " - "or an adminstrator...\n" + "or an administrator...\n" " \n" " # All administration operations require an " - "adminstrator to authenticate...\n" + "administrator to authenticate...\n" " \n" - " AuthType Basic\n" + " AuthType Default\n" " Require user @SYSTEM\n" " Order deny,allow\n" "\n"); @@ -1582,8 +1902,9 @@ _cupsAdminSetServerSettings( cupsFilePuts(temp, " # Only the owner or an administrator can cancel " "a job...\n" " \n" - " Require user @OWNER @SYSTEM\n" " Order deny,allow\n" + " Require user @OWNER " + CUPS_DEFAULT_PRINTOPERATOR_AUTH "\n" " \n"); cupsFilePuts(temp, " \n" @@ -1594,6 +1915,8 @@ _cupsAdminSetServerSettings( for (i = num_settings, setting = settings; i > 0; i --, setting ++) if (setting->name[0] != '_' && + _cups_strcasecmp(setting->name, "Listen") && + _cups_strcasecmp(setting->name, "Port") && !cupsGetOption(setting->name, cupsd_num_settings, cupsd_settings)) { /* @@ -1604,8 +1927,8 @@ _cupsAdminSetServerSettings( cupsd_num_settings, &cupsd_settings); /* - * Write the new value in its place, without indentation since we - * only support setting root directives, not in sections... + * Write the new value, without indentation since we only support + * setting root directives, not in sections... */ cupsFilePrintf(temp, "%s %s\n", setting->name, setting->value); @@ -1620,28 +1943,52 @@ _cupsAdminSetServerSettings( status = cupsPutFile(http, "/admin/conf/cupsd.conf", tempfile); - if (status == HTTP_CREATED) + if (status == HTTP_STATUS_CREATED) { /* * Updated OK, add the basic settings... */ - cupsd_num_settings = cupsAddOption(CUPS_SERVER_DEBUG_LOGGING, - debug_logging ? "1" : "0", - cupsd_num_settings, &cupsd_settings); - cupsd_num_settings = cupsAddOption(CUPS_SERVER_REMOTE_ADMIN, - remote_admin ? "1" : "0", - cupsd_num_settings, &cupsd_settings); - cupsd_num_settings = cupsAddOption(CUPS_SERVER_REMOTE_PRINTERS, - remote_printers ? "1" : "0", - cupsd_num_settings, &cupsd_settings); - cupsd_num_settings = cupsAddOption(CUPS_SERVER_SHARE_PRINTERS, - share_printers ? "1" : "0", - cupsd_num_settings, &cupsd_settings); - cupsd_num_settings = cupsAddOption(CUPS_SERVER_USER_CANCEL_ANY, - user_cancel_any ? "1" : "0", + if (debug_logging >= 0) + cupsd_num_settings = cupsAddOption(CUPS_SERVER_DEBUG_LOGGING, + debug_logging ? "1" : "0", + cupsd_num_settings, &cupsd_settings); + else + cupsd_num_settings = cupsAddOption(CUPS_SERVER_DEBUG_LOGGING, + old_debug_logging ? "1" : "0", + cupsd_num_settings, &cupsd_settings); + + if (remote_admin >= 0) + cupsd_num_settings = cupsAddOption(CUPS_SERVER_REMOTE_ADMIN, + remote_admin ? "1" : "0", + cupsd_num_settings, &cupsd_settings); + else + cupsd_num_settings = cupsAddOption(CUPS_SERVER_REMOTE_ADMIN, + old_remote_admin ? "1" : "0", + cupsd_num_settings, &cupsd_settings); + + cupsd_num_settings = cupsAddOption(CUPS_SERVER_REMOTE_ANY, + remote_any ? "1" : "0", cupsd_num_settings, &cupsd_settings); + if (share_printers >= 0) + cupsd_num_settings = cupsAddOption(CUPS_SERVER_SHARE_PRINTERS, + share_printers ? "1" : "0", + cupsd_num_settings, &cupsd_settings); + else + cupsd_num_settings = cupsAddOption(CUPS_SERVER_SHARE_PRINTERS, + old_share_printers ? "1" : "0", + cupsd_num_settings, &cupsd_settings); + + if (user_cancel_any >= 0) + cupsd_num_settings = cupsAddOption(CUPS_SERVER_USER_CANCEL_ANY, + user_cancel_any ? "1" : "0", + cupsd_num_settings, &cupsd_settings); + else + cupsd_num_settings = cupsAddOption(CUPS_SERVER_USER_CANCEL_ANY, + old_user_cancel_any ? "1" : "0", + cupsd_num_settings, &cupsd_settings); + /* * Save the new values... */ @@ -1666,7 +2013,7 @@ _cupsAdminSetServerSettings( unlink(tempfile); - return (status == HTTP_CREATED); + return (status == HTTP_STATUS_CREATED); } @@ -1681,13 +2028,17 @@ do_samba_command(const char *command, /* I - Command to run */ const char *authfile, /* I - Samba authentication file */ FILE *logfile) /* I - Optional log file */ { +#ifdef WIN32 + return (1); /* Always fail on Windows... */ + +#else int status; /* Status of command */ int pid; /* Process ID of child */ if (logfile) _cupsLangPrintf(logfile, - _("Running command: %s %s -N -A %s -c \'%s\'\n"), + _("Running command: %s %s -N -A %s -c \'%s\'"), command, address, authfile, subcmd); if ((pid = fork()) == 0) @@ -1696,18 +2047,23 @@ do_samba_command(const char *command, /* I - Command to run */ * Child goes here, redirect stdin/out/err and execute the command... */ - close(0); - open("/dev/null", O_RDONLY); + int fd = open("/dev/null", O_RDONLY); - close(1); + if (fd > 0) + { + dup2(fd, 0); + close(fd); + } if (logfile) - dup(fileno(logfile)); - else - open("/dev/null", O_WRONLY); + dup2(fileno(logfile), 1); + else if ((fd = open("/dev/null", O_WRONLY)) > 1) + { + dup2(fd, 1); + close(fd); + } - close(2); - dup(1); + dup2(1, 2); execlp(command, command, address, "-N", "-A", authfile, "-c", subcmd, (char *)0); @@ -1718,7 +2074,7 @@ do_samba_command(const char *command, /* I - Command to run */ status = -1; if (logfile) - _cupsLangPrintf(logfile, _("Unable to run \"%s\": %s\n"), + _cupsLangPrintf(logfile, _("Unable to run \"%s\": %s"), command, strerror(errno)); } else @@ -1731,14 +2087,15 @@ do_samba_command(const char *command, /* I - Command to run */ } if (logfile) - _cupsLangPuts(logfile, "\n"); + _cupsLangPuts(logfile, ""); - DEBUG_printf(("status=%d\n", status)); + DEBUG_printf(("9do_samba_command: status=%d", status)); if (WIFEXITED(status)) return (WEXITSTATUS(status)); else return (-WTERMSIG(status)); +#endif /* WIN32 */ } @@ -1752,11 +2109,13 @@ get_cupsd_conf( _cups_globals_t *cg, /* I - Global data */ time_t last_update, /* I - Last update time for file */ char *name, /* I - Filename buffer */ - int namesize, /* I - Size of filename buffer */ + size_t namesize, /* I - Size of filename buffer */ int *remote) /* O - Remote file? */ { int fd; /* Temporary file descriptor */ +#ifndef WIN32 struct stat info; /* cupsd.conf file information */ +#endif /* WIN32 */ http_status_t status; /* Status of getting cupsd.conf */ char host[HTTP_MAX_HOST]; /* Hostname for connection */ @@ -1767,13 +2126,14 @@ get_cupsd_conf( httpGetHostname(http, host, sizeof(host)); - if (strcasecmp(cg->cupsd_hostname, host)) + if (_cups_strcasecmp(cg->cupsd_hostname, host)) invalidate_cupsd_cache(cg); snprintf(name, namesize, "%s/cupsd.conf", cg->cups_serverroot); *remote = 0; - if (!strcasecmp(host, "localhost") && !access(name, R_OK)) +#ifndef WIN32 + if (!_cups_strcasecmp(host, "localhost") && !access(name, R_OK)) { /* * Read the local file rather than using HTTP... @@ -1787,32 +2147,33 @@ get_cupsd_conf( snprintf(message, sizeof(message), _cupsLangString(cupsLangDefault(), _("stat of %s failed: %s")), name, strerror(errno)); - _cupsSetError(IPP_INTERNAL_ERROR, message); + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, message, 0); *name = '\0'; - return (HTTP_SERVER_ERROR); + return (HTTP_STATUS_SERVER_ERROR); } else if (last_update && info.st_mtime <= last_update) - status = HTTP_NOT_MODIFIED; + status = HTTP_STATUS_NOT_MODIFIED; else - status = HTTP_OK; + status = HTTP_STATUS_OK; } else +#endif /* !WIN32 */ { /* * Read cupsd.conf via a HTTP GET request... */ - if ((fd = cupsTempFd(name, namesize)) < 0) + if ((fd = cupsTempFd(name, (int)namesize)) < 0) { *name = '\0'; - _cupsSetError(IPP_INTERNAL_ERROR, strerror(errno)); + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, NULL, 0); invalidate_cupsd_cache(cg); - return (HTTP_SERVER_ERROR); + return (HTTP_STATUS_SERVER_ERROR); } *remote = 1; @@ -1827,7 +2188,7 @@ get_cupsd_conf( close(fd); - if (status != HTTP_OK) + if (status != HTTP_STATUS_OK) { unlink(name); *name = '\0'; @@ -1965,5 +2326,5 @@ write_option(cups_file_t *dstfp, /* I - PPD file */ /* - * End of "$Id: adminutil.c 5970 2006-09-19 20:11:08Z mike $". + * End of "$Id$". */