1/* 2 * "$Id: cupsaccept.c 2875 2010-11-30 03:22:54Z msweet $" 3 * 4 * "cupsaccept", "cupsdisable", "cupsenable", and "cupsreject" commands for 5 * CUPS. 6 * 7 * Copyright 2007-2010 by Apple Inc. 8 * Copyright 1997-2006 by Easy Software Products. 9 * 10 * These coded instructions, statements, and computer programs are the 11 * property of Apple Inc. and are protected by Federal copyright 12 * law. Distribution and use rights are outlined in the file "LICENSE.txt" 13 * which should have been included with this file. If this file is 14 * file is missing or damaged, see the license at "http://www.cups.org/". 15 * 16 * Contents: 17 * 18 * main() - Parse options and accept/reject jobs or disable/enable printers. 19 */ 20 21/* 22 * Include necessary headers... 23 */ 24 25#include <cups/cups-private.h> 26 27 28/* 29 * 'main()' - Parse options and accept/reject jobs or disable/enable printers. 30 */ 31 32int /* O - Exit status */ 33main(int argc, /* I - Number of command-line arguments */ 34 char *argv[]) /* I - Command-line arguments */ 35{ 36 int i; /* Looping var */ 37 char *command, /* Command to do */ 38 uri[1024], /* Printer URI */ 39 *reason; /* Reason for reject/disable */ 40 ipp_t *request; /* IPP request */ 41 ipp_op_t op; /* Operation */ 42 int cancel; /* Cancel jobs? */ 43 44 45 _cupsSetLocale(argv); 46 47 /* 48 * See what operation we're supposed to do... 49 */ 50 51 if ((command = strrchr(argv[0], '/')) != NULL) 52 command ++; 53 else 54 command = argv[0]; 55 56 cancel = 0; 57 58 if (!strcmp(command, "cupsaccept") || !strcmp(command, "accept")) 59 op = CUPS_ACCEPT_JOBS; 60 else if (!strcmp(command, "cupsreject") || !strcmp(command, "reject")) 61 op = CUPS_REJECT_JOBS; 62 else if (!strcmp(command, "cupsdisable") || !strcmp(command, "disable")) 63 op = IPP_PAUSE_PRINTER; 64 else if (!strcmp(command, "cupsenable") || !strcmp(command, "enable")) 65 op = IPP_RESUME_PRINTER; 66 else 67 { 68 _cupsLangPrintf(stderr, _("%s: Don't know what to do."), command); 69 return (1); 70 } 71 72 reason = NULL; 73 74 /* 75 * Process command-line arguments... 76 */ 77 78 for (i = 1; i < argc; i ++) 79 if (argv[i][0] == '-') 80 { 81 switch (argv[i][1]) 82 { 83 case 'E' : /* Encrypt */ 84#ifdef HAVE_SSL 85 cupsSetEncryption(HTTP_ENCRYPT_REQUIRED); 86#else 87 _cupsLangPrintf(stderr, 88 _("%s: Sorry, no encryption support."), command); 89#endif /* HAVE_SSL */ 90 break; 91 92 case 'U' : /* Username */ 93 if (argv[i][2] != '\0') 94 cupsSetUser(argv[i] + 2); 95 else 96 { 97 i ++; 98 if (i >= argc) 99 { 100 _cupsLangPrintf(stderr, 101 _("%s: Error - expected username after " 102 "\"-U\" option."), command); 103 return (1); 104 } 105 106 cupsSetUser(argv[i]); 107 } 108 break; 109 110 case 'c' : /* Cancel jobs */ 111 cancel = 1; 112 break; 113 114 case 'h' : /* Connect to host */ 115 if (argv[i][2] != '\0') 116 cupsSetServer(argv[i] + 2); 117 else 118 { 119 i ++; 120 if (i >= argc) 121 { 122 _cupsLangPrintf(stderr, 123 _("%s: Error - expected hostname after " 124 "\"-h\" option."), command); 125 return (1); 126 } 127 128 cupsSetServer(argv[i]); 129 } 130 break; 131 132 case 'r' : /* Reason for cancellation */ 133 if (argv[i][2] != '\0') 134 reason = argv[i] + 2; 135 else 136 { 137 i ++; 138 if (i >= argc) 139 { 140 _cupsLangPrintf(stderr, 141 _("%s: Error - expected reason text after " 142 "\"-r\" option."), command); 143 return (1); 144 } 145 146 reason = argv[i]; 147 } 148 break; 149 150 case '-' : 151 if (!strcmp(argv[i], "--hold")) 152 op = IPP_HOLD_NEW_JOBS; 153 else if (!strcmp(argv[i], "--release")) 154 op = IPP_RELEASE_HELD_NEW_JOBS; 155 else 156 { 157 _cupsLangPrintf(stderr, _("%s: Error - unknown option \"%s\"."), 158 command, argv[i]); 159 return (1); 160 } 161 break; 162 163 default : 164 _cupsLangPrintf(stderr, _("%s: Error - unknown option \"%c\"."), 165 command, argv[i][1]); 166 return (1); 167 } 168 } 169 else 170 { 171 /* 172 * Accept/disable/enable/reject a destination... 173 */ 174 175 request = ippNewRequest(op); 176 177 httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, 178 "localhost", 0, "/printers/%s", argv[i]); 179 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, 180 "printer-uri", NULL, uri); 181 182 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, 183 "requesting-user-name", NULL, cupsUser()); 184 185 if (reason != NULL) 186 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_TEXT, 187 "printer-state-message", NULL, reason); 188 189 /* 190 * Do the request and get back a response... 191 */ 192 193 ippDelete(cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/admin/")); 194 195 if (cupsLastError() > IPP_OK_CONFLICT) 196 { 197 _cupsLangPrintf(stderr, 198 _("%s: Operation failed: %s"), 199 command, ippErrorString(cupsLastError())); 200 return (1); 201 } 202 203 /* 204 * Cancel all jobs if requested... 205 */ 206 207 if (cancel) 208 { 209 /* 210 * Build an IPP_PURGE_JOBS request, which requires the following 211 * attributes: 212 * 213 * attributes-charset 214 * attributes-natural-language 215 * printer-uri 216 */ 217 218 request = ippNewRequest(IPP_PURGE_JOBS); 219 220 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, 221 "printer-uri", NULL, uri); 222 223 ippDelete(cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/admin/")); 224 225 if (cupsLastError() > IPP_OK_CONFLICT) 226 { 227 _cupsLangPrintf(stderr, "%s: %s", command, cupsLastErrorString()); 228 return (1); 229 } 230 } 231 } 232 233 return (0); 234} 235 236 237/* 238 * End of "$Id: cupsaccept.c 2875 2010-11-30 03:22:54Z msweet $". 239 */ 240