mirror of https://gitee.com/openkylin/cups.git
244 lines
6.6 KiB
C
244 lines
6.6 KiB
C
|
/*
|
|||
|
* Scheduler control program for CUPS.
|
|||
|
*
|
|||
|
* Copyright © 2007-2019 by Apple Inc.
|
|||
|
* Copyright © 2006-2007 by Easy Software Products.
|
|||
|
*
|
|||
|
* Licensed under Apache License v2.0. See the file "LICENSE" for more
|
|||
|
* information.
|
|||
|
*/
|
|||
|
|
|||
|
/*
|
|||
|
* Include necessary headers...
|
|||
|
*/
|
|||
|
|
|||
|
#include <cups/cups-private.h>
|
|||
|
#include <cups/adminutil.h>
|
|||
|
|
|||
|
|
|||
|
/*
|
|||
|
* Local functions...
|
|||
|
*/
|
|||
|
|
|||
|
static void usage(const char *opt) _CUPS_NORETURN;
|
|||
|
|
|||
|
|
|||
|
/*
|
|||
|
* 'main()' - Get/set server settings.
|
|||
|
*/
|
|||
|
|
|||
|
int /* O - Exit status */
|
|||
|
main(int argc, /* I - Number of command-line args */
|
|||
|
char *argv[]) /* I - Command-line arguments */
|
|||
|
{
|
|||
|
int i, j, /* Looping vars */
|
|||
|
num_settings; /* Number of settings */
|
|||
|
cups_option_t *settings, /* Settings */
|
|||
|
*setting; /* Current setting */
|
|||
|
const char *opt; /* Current option character */
|
|||
|
http_t *http; /* Connection to server */
|
|||
|
static const char * const disallowed[] =
|
|||
|
{ /* List of disallowed directives for cupsd.conf */
|
|||
|
"AccessLog",
|
|||
|
"CacheDir",
|
|||
|
"ConfigFilePerm",
|
|||
|
"DataDir",
|
|||
|
"DocumentRoot",
|
|||
|
"ErrorLog",
|
|||
|
"FatalErrors",
|
|||
|
"FileDevice",
|
|||
|
"FontPath",
|
|||
|
"Group",
|
|||
|
"Listen",
|
|||
|
"LogFilePerm",
|
|||
|
"LPDConfigFile",
|
|||
|
"PageLog",
|
|||
|
"PassEnv",
|
|||
|
"Port",
|
|||
|
"Printcap",
|
|||
|
"PrintcapFormat",
|
|||
|
"RemoteRoot",
|
|||
|
"RequestRoot",
|
|||
|
"ServerBin",
|
|||
|
"ServerCertificate",
|
|||
|
"ServerKey",
|
|||
|
"ServerKeychain",
|
|||
|
"ServerRoot",
|
|||
|
"SetEnv",
|
|||
|
"SMBConfigFile",
|
|||
|
"StateDir",
|
|||
|
"SystemGroup",
|
|||
|
"SystemGroupAuthKey",
|
|||
|
"TempDir",
|
|||
|
"User"
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
/*
|
|||
|
* Process the command-line...
|
|||
|
*/
|
|||
|
|
|||
|
_cupsSetLocale(argv);
|
|||
|
|
|||
|
num_settings = 0;
|
|||
|
settings = NULL;
|
|||
|
|
|||
|
for (i = 1; i < argc; i ++)
|
|||
|
{
|
|||
|
if (!strcmp(argv[i], "--help"))
|
|||
|
usage(NULL);
|
|||
|
else if (argv[i][0] == '-')
|
|||
|
{
|
|||
|
if (argv[i][1] == '-')
|
|||
|
{
|
|||
|
if (!strcmp(argv[i], "--debug-logging"))
|
|||
|
num_settings = cupsAddOption(CUPS_SERVER_DEBUG_LOGGING, "1",
|
|||
|
num_settings, &settings);
|
|||
|
else if (!strcmp(argv[i], "--no-debug-logging"))
|
|||
|
num_settings = cupsAddOption(CUPS_SERVER_DEBUG_LOGGING, "0",
|
|||
|
num_settings, &settings);
|
|||
|
else if (!strcmp(argv[i], "--remote-admin"))
|
|||
|
num_settings = cupsAddOption(CUPS_SERVER_REMOTE_ADMIN, "1",
|
|||
|
num_settings, &settings);
|
|||
|
else if (!strcmp(argv[i], "--no-remote-admin"))
|
|||
|
num_settings = cupsAddOption(CUPS_SERVER_REMOTE_ADMIN, "0",
|
|||
|
num_settings, &settings);
|
|||
|
else if (!strcmp(argv[i], "--remote-any"))
|
|||
|
num_settings = cupsAddOption(CUPS_SERVER_REMOTE_ANY, "1",
|
|||
|
num_settings, &settings);
|
|||
|
else if (!strcmp(argv[i], "--no-remote-any"))
|
|||
|
num_settings = cupsAddOption(CUPS_SERVER_REMOTE_ANY, "0",
|
|||
|
num_settings, &settings);
|
|||
|
else if (!strcmp(argv[i], "--share-printers"))
|
|||
|
num_settings = cupsAddOption(CUPS_SERVER_SHARE_PRINTERS, "1",
|
|||
|
num_settings, &settings);
|
|||
|
else if (!strcmp(argv[i], "--no-share-printers"))
|
|||
|
num_settings = cupsAddOption(CUPS_SERVER_SHARE_PRINTERS, "0",
|
|||
|
num_settings, &settings);
|
|||
|
else if (!strcmp(argv[i], "--user-cancel-any"))
|
|||
|
num_settings = cupsAddOption(CUPS_SERVER_USER_CANCEL_ANY, "1",
|
|||
|
num_settings, &settings);
|
|||
|
else if (!strcmp(argv[i], "--no-user-cancel-any"))
|
|||
|
num_settings = cupsAddOption(CUPS_SERVER_USER_CANCEL_ANY, "0",
|
|||
|
num_settings, &settings);
|
|||
|
else
|
|||
|
usage(argv[i]);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
for (opt = argv[i] + 1; *opt; opt ++)
|
|||
|
switch (*opt)
|
|||
|
{
|
|||
|
case 'E' :
|
|||
|
cupsSetEncryption(HTTP_ENCRYPT_REQUIRED);
|
|||
|
break;
|
|||
|
|
|||
|
case 'U' :
|
|||
|
i ++;
|
|||
|
if (i >= argc)
|
|||
|
usage(NULL);
|
|||
|
|
|||
|
cupsSetUser(argv[i]);
|
|||
|
break;
|
|||
|
|
|||
|
case 'h' :
|
|||
|
i ++;
|
|||
|
if (i >= argc)
|
|||
|
usage(NULL);
|
|||
|
|
|||
|
cupsSetServer(argv[i]);
|
|||
|
break;
|
|||
|
|
|||
|
default :
|
|||
|
usage(opt);
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
else if (strchr(argv[i], '='))
|
|||
|
num_settings = cupsParseOptions(argv[i], num_settings, &settings);
|
|||
|
else
|
|||
|
usage(argv[i]);
|
|||
|
}
|
|||
|
|
|||
|
for (i = num_settings, setting = settings; i > 0; i --, setting ++)
|
|||
|
{
|
|||
|
for (j = 0; j < (int)(sizeof(disallowed) / sizeof(disallowed[0])); j ++)
|
|||
|
{
|
|||
|
if (!_cups_strcasecmp(setting->name, disallowed[j]))
|
|||
|
{
|
|||
|
_cupsLangPrintf(stderr, _("cupsctl: Cannot set %s directly."), disallowed[j]);
|
|||
|
return (1);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
* Connect to the server using the defaults...
|
|||
|
*/
|
|||
|
|
|||
|
if ((http = httpConnectEncrypt(cupsServer(), ippPort(),
|
|||
|
cupsEncryption())) == NULL)
|
|||
|
{
|
|||
|
_cupsLangPrintf(stderr, _("cupsctl: Unable to connect to server: %s"),
|
|||
|
strerror(errno));
|
|||
|
return (1);
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
* Set the current configuration if we have anything on the command-line...
|
|||
|
*/
|
|||
|
|
|||
|
if (num_settings > 0)
|
|||
|
{
|
|||
|
if (!cupsAdminSetServerSettings(http, num_settings, settings))
|
|||
|
{
|
|||
|
_cupsLangPrintf(stderr, "cupsctl: %s", cupsLastErrorString());
|
|||
|
return (1);
|
|||
|
}
|
|||
|
}
|
|||
|
else if (!cupsAdminGetServerSettings(http, &num_settings, &settings))
|
|||
|
{
|
|||
|
_cupsLangPrintf(stderr, "cupsctl: %s", cupsLastErrorString());
|
|||
|
return (1);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
for (i = 0; i < num_settings; i ++)
|
|||
|
_cupsLangPrintf(stdout, "%s=%s", settings[i].name, settings[i].value);
|
|||
|
}
|
|||
|
|
|||
|
cupsFreeOptions(num_settings, settings);
|
|||
|
return (0);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/*
|
|||
|
* 'usage()' - Show program usage.
|
|||
|
*/
|
|||
|
|
|||
|
static void
|
|||
|
usage(const char *opt) /* I - Option character/string */
|
|||
|
{
|
|||
|
if (opt)
|
|||
|
{
|
|||
|
if (*opt == '-')
|
|||
|
_cupsLangPrintf(stderr, _("cupsctl: Unknown option \"%s\""), opt);
|
|||
|
else
|
|||
|
_cupsLangPrintf(stderr, _("cupsctl: Unknown option \"-%c\""), *opt);
|
|||
|
}
|
|||
|
|
|||
|
_cupsLangPuts(stdout, _("Usage: cupsctl [options] [param=value ... paramN=valueN]"));
|
|||
|
_cupsLangPuts(stdout, _("Options:"));
|
|||
|
_cupsLangPuts(stdout, _("-E Encrypt the connection to the server"));
|
|||
|
_cupsLangPuts(stdout, _("-h server[:port] Connect to the named server and port"));
|
|||
|
_cupsLangPuts(stdout, _("-U username Specify username to use for authentication"));
|
|||
|
_cupsLangPuts(stdout, _("--[no-]debug-logging Turn debug logging on/off"));
|
|||
|
_cupsLangPuts(stdout, _("--[no-]remote-admin Turn remote administration on/off"));
|
|||
|
_cupsLangPuts(stdout, _("--[no-]remote-any Allow/prevent access from the Internet"));
|
|||
|
_cupsLangPuts(stdout, _("--[no-]share-printers Turn printer sharing on/off"));
|
|||
|
_cupsLangPuts(stdout, _("--[no-]user-cancel-any Allow/prevent users to cancel any job"));
|
|||
|
|
|||
|
exit(1);
|
|||
|
}
|