/* * "lprm" command for CUPS. * * Copyright © 2007-2018 by Apple Inc. * Copyright © 1997-2006 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. */ /* * Include necessary headers... */ #include /* * Local functions... */ static void usage(void) _CUPS_NORETURN; /* * 'main()' - Parse options and cancel jobs. */ int /* O - Exit status */ main(int argc, /* I - Number of command-line arguments */ char *argv[]) /* I - Command-line arguments */ { int i; /* Looping var */ int job_id; /* Job ID */ const char *name; /* Destination printer */ char *instance, /* Pointer to instance name */ *opt; /* Option pointer */ cups_dest_t *dest, /* Destination */ *defdest; /* Default destination */ int did_cancel; /* Did we cancel something? */ _cupsSetLocale(argv); /* * Setup to cancel individual print jobs... */ did_cancel = 0; defdest = cupsGetNamedDest(CUPS_HTTP_DEFAULT, NULL, NULL); name = defdest ? defdest->name : NULL; /* * Process command-line arguments... */ for (i = 1; i < argc; i ++) { if (!strcmp(argv[i], "--help")) usage(); else if (argv[i][0] == '-' && argv[i][1] != '\0') { for (opt = argv[i] + 1; *opt; opt ++) { switch (*opt) { case 'E' : /* Encrypt */ #ifdef HAVE_SSL cupsSetEncryption(HTTP_ENCRYPT_REQUIRED); #else _cupsLangPrintf(stderr, _("%s: Sorry, no encryption support."), argv[0]); #endif /* HAVE_SSL */ break; case 'P' : /* Cancel jobs on a printer */ if (opt[1] != '\0') { name = opt + 1; opt += strlen(opt) - 1; } else { i ++; name = argv[i]; } if ((instance = strchr(name, '/')) != NULL) *instance = '\0'; if ((dest = cupsGetNamedDest(CUPS_HTTP_DEFAULT, name, NULL)) == NULL) { _cupsLangPrintf(stderr, _("%s: Error - unknown destination \"%s\"."), argv[0], name); goto error; } cupsFreeDests(1, dest); break; case 'U' : /* Username */ if (opt[1] != '\0') { cupsSetUser(opt + 1); opt += strlen(opt) - 1; } else { i ++; if (i >= argc) { _cupsLangPrintf(stderr, _("%s: Error - expected username after \"-U\" option."), argv[0]); usage(); } cupsSetUser(argv[i]); } break; case 'h' : /* Connect to host */ if (opt[1] != '\0') { cupsSetServer(opt + 1); opt += strlen(opt) - 1; } else { i ++; if (i >= argc) { _cupsLangPrintf(stderr, _("%s: Error - expected hostname after \"-h\" option."), argv[0]); usage(); } else cupsSetServer(argv[i]); } if (defdest) cupsFreeDests(1, defdest); defdest = cupsGetNamedDest(CUPS_HTTP_DEFAULT, NULL, NULL); name = defdest ? defdest->name : NULL; break; default : _cupsLangPrintf(stderr, _("%s: Error - unknown option \"%c\"."), argv[0], *opt); usage(); } } } else { /* * Cancel a job or printer... */ if ((dest = cupsGetNamedDest(CUPS_HTTP_DEFAULT, argv[i], NULL)) != NULL) cupsFreeDests(1, dest); if (dest) { name = argv[i]; job_id = 0; } else if (isdigit(argv[i][0] & 255)) { name = NULL; job_id = atoi(argv[i]); } else if (!strcmp(argv[i], "-")) { /* * Cancel all jobs */ job_id = -1; } else { _cupsLangPrintf(stderr, _("%s: Error - unknown destination \"%s\"."), argv[0], argv[i]); goto error; } if (cupsCancelJob2(CUPS_HTTP_DEFAULT, name, job_id, 0) != IPP_OK) { _cupsLangPrintf(stderr, "%s: %s", argv[0], cupsLastErrorString()); goto error; } did_cancel = 1; } } /* * If nothing has been canceled yet, cancel the current job on the specified * (or default) printer... */ if (!did_cancel && cupsCancelJob2(CUPS_HTTP_DEFAULT, name, 0, 0) != IPP_OK) { _cupsLangPrintf(stderr, "%s: %s", argv[0], cupsLastErrorString()); goto error; } if (defdest) cupsFreeDests(1, defdest); return (0); /* * If we get here there was an error, so clean up... */ error: if (defdest) cupsFreeDests(1, defdest); return (1); } /* * 'usage()' - Show program usage and exit. */ static void usage(void) { _cupsLangPuts(stdout, _("Usage: lprm [options] [id]\n" " lprm [options] -")); _cupsLangPuts(stdout, _("Options:")); _cupsLangPuts(stdout, _("- Cancel all jobs")); _cupsLangPuts(stdout, _("-E Encrypt the connection to the server")); _cupsLangPuts(stdout, _("-h server[:port] Connect to the named server and port")); _cupsLangPuts(stdout, _("-P destination Specify the destination")); _cupsLangPuts(stdout, _("-U username Specify the username to use for authentication")); exit(1); }