]> andersk Git - moira.git/blame - clients/moira/printer.c
use CODE=ANSI_C option to proc
[moira.git] / clients / moira / printer.c
CommitLineData
cc5b487a 1#if (!defined(lint) && !defined(SABER))
2 static char rcsid_module_c[] = "$Header$";
7798ebc3 3#endif
cc5b487a 4
59ec8dae 5/* This is the file printer.c for the Moira Client, which allows users
6 * to quickly and easily maintain most parts of the Moira database.
cc5b487a 7 * It Contains: Functions for handling the printers.
5eaef520 8 *
cc5b487a 9 * Created: 8/16/88
10 * By: Theodore Y. Ts'o
11 *
12 * $Source$
13 * $Author$
14 * $Header$
5eaef520 15 *
cc5b487a 16 * Copyright 1988 by the Massachusetts Institute of Technology.
17 *
5eaef520 18 * For further information on copyright and distribution
cc5b487a 19 * see the file mit-copyright.h
20 */
21
22#include <stdio.h>
24419c79 23#include <string.h>
cc5b487a 24#include <ctype.h>
8defc06b 25#include <moira.h>
26#include <moira_site.h>
cc5b487a 27#include <menu.h>
28
29#include "mit-copyright.h"
30#include "defs.h"
31#include "f_defs.h"
32#include "globals.h"
cc5b487a 33
cc5b487a 34#define DEFAULT_MACHINE "E40-PRINT-SERVER-1.MIT.EDU"
35
36/* Function Name: SetDefaults
37 * Description: sets the default values for filesystem additions.
5eaef520 38 * Arguments: info - an array of char pointers to recieve defaults.
cc5b487a 39 * Returns: char ** (this array, now filled).
40 */
41
5eaef520 42static char **SetDefaults(char **info, char *name)
cc5b487a 43{
5eaef520 44 char spool_dir[256];
45
46 strcpy(spool_dir, "/usr/spool/printer/");
47 strcat(spool_dir, name);
48
49 info[PCAP_NAME] = Strsave(name);
50 info[PCAP_SPOOL_HOST] = Strsave(DEFAULT_MACHINE);
51 info[PCAP_SPOOL_DIR] = Strsave(spool_dir);
52 info[PCAP_RPRINTER] = Strsave(name);
53 info[PCAP_QSERVER] = Strsave("[NONE]");
54 info[PCAP_AUTH] = Strsave("1");
55 info[PCAP_PRICE] = Strsave("10");
56 info[PCAP_COMMENTS] = Strsave("");
57 info[PCAP_MODTIME] = info[PCAP_MODBY] = info[PCAP_MODWITH] = NULL;
58
59 info[PCAP_END] = NULL;
60 return info;
cc5b487a 61}
62
63/* Function Name: GetPcapInfo
64 * Description: Stores the info in a queue.
65 * Arguments: name - name of the item to get information on.
66 * Returns: a pointer to the first element in the queue or null
67 * if printer not found.
68 */
69
5eaef520 70static struct qelem *GetPcapInfo(char *name)
cc5b487a 71{
5eaef520 72 int stat;
73 struct qelem *elem = NULL;
74
75 if ((stat = do_mr_query("get_printcap_entry", 1, &name,
76 StoreInfo, (char *)&elem)))
77 {
78 com_err(program_name, stat, " in GetPcapInfo");
79 return NULL;
cc5b487a 80 }
5eaef520 81 return QueueTop(elem);
cc5b487a 82}
83
84/* Function Name: PrintPcapInfo
85 * Description: Yet another specialized print function.
86 * Arguments: info - all info about this Printer.
87 * Returns: none
88 */
89
5eaef520 90static void PrintPcapInfo(char **info)
cc5b487a 91{
5eaef520 92 char buf[BUFSIZ];
93
94 if (!info) /* If no informaion */
95 {
96 Put_message("PrintPcapInfo called with null info!");
97 return;
cc5b487a 98 }
5eaef520 99 sprintf(buf, "Printer: %-35s Spool host: %s", info[PCAP_NAME],
100 info[PCAP_SPOOL_HOST]);
101 Put_message(buf);
102 sprintf(buf, "Spool directory: %-27s Remote Printer Name: %s",
103 info[PCAP_SPOOL_DIR], info[PCAP_RPRINTER]);
104 Put_message(buf);
105 sprintf(buf, "Authentication: %-3s Price/page: %-3s Quota Server: %s",
106 atoi(info[PCAP_AUTH]) ? "yes" : "no",
107 info[PCAP_PRICE], info[PCAP_QSERVER]);
108 Put_message(buf);
109 sprintf(buf, "Comments: %s", info[PCAP_COMMENTS]);
110 Put_message(buf);
111 sprintf(buf, MOD_FORMAT, info[PCAP_MODBY], info[PCAP_MODTIME],
112 info[PCAP_MODWITH]);
113 Put_message(buf);
cc5b487a 114}
115
116/* Function Name: AskPcapInfo.
5eaef520 117 * Description: This function askes the user for information about a
cc5b487a 118 * printer and saves it into a structure.
119 * Arguments: info - a pointer the the structure to put the
120 * info into.
121 * Returns: none.
122 */
123
5eaef520 124static char **AskPcapInfo(char **info)
cc5b487a 125{
5eaef520 126 char temp_buf[BUFSIZ];
127
128 Put_message("");
129 sprintf(temp_buf, "Printcap entry for %s.", info[PCAP_NAME]);
130 Put_message(temp_buf);
131 Put_message("");
132
133 if (GetValueFromUser("Printer Server", &info[PCAP_SPOOL_HOST]) == SUB_ERROR)
134 return NULL;
135 info[PCAP_SPOOL_HOST] = canonicalize_hostname(info[PCAP_SPOOL_HOST]);
136 if (GetValueFromUser("Spool Directory", &info[PCAP_SPOOL_DIR]) ==
137 SUB_ERROR)
138 return NULL;
139 if (GetValueFromUser("Remote Printer Name", &info[PCAP_RPRINTER]) ==
140 SUB_ERROR)
141 return NULL;
142 if (GetValueFromUser("Quotaserver for this printer", &info[PCAP_QSERVER]) ==
143 SUB_ERROR)
144 return NULL;
145 info[PCAP_QSERVER] = canonicalize_hostname(info[PCAP_QSERVER]);
146 if (GetYesNoValueFromUser("Authentication required", &info[PCAP_AUTH]) ==
147 SUB_ERROR)
148 return NULL;
149 if (GetValueFromUser("Price/page", &info[PCAP_PRICE]) == SUB_ERROR)
150 return NULL;
151 if (GetValueFromUser("Comments", &info[PCAP_COMMENTS]) == SUB_ERROR)
152 return NULL;
153
154 FreeAndClear(&info[PCAP_MODTIME], TRUE);
155 FreeAndClear(&info[PCAP_MODBY], TRUE);
156 FreeAndClear(&info[PCAP_MODWITH], TRUE);
157
158 return info;
cc5b487a 159}
160
161/* ---------------- Printer Menu ------------------ */
162
163/* Function Name: GetPcap
164 * Description: Get Printcap information
165 * Arguments: argc, argv - name of filsys in argv[1].
166 * Returns: DM_NORMAL.
167 */
168
5eaef520 169int GetPcap(int argc, char **argv)
cc5b487a 170{
5eaef520 171 struct qelem *top;
cc5b487a 172
5eaef520 173 top = GetPcapInfo(argv[1]); /* get info. */
174 Loop(top, (void *) PrintPcapInfo);
175 FreeQueue(top); /* clean the queue. */
176 return DM_NORMAL;
cc5b487a 177}
178
179/* Function Name: RealDeletePcap
180 * Description: Does the real deletion work.
181 * Arguments: info - array of char *'s containing all useful info.
5eaef520 182 * one_item - a Boolean that is true if only one item
cc5b487a 183 * in queue that dumped us here.
184 * Returns: none.
185 */
186
5eaef520 187void RealDeletePcap(char **info, Bool one_item)
cc5b487a 188{
5eaef520 189 int stat;
cc5b487a 190
5eaef520 191 if ((stat = do_mr_query("delete_printcap_entry", 1,
192 &info[PCAP_NAME], Scream, NULL)))
193 com_err(program_name, stat, " printcap entry not deleted.");
194 else
195 Put_message("Printcap entry deleted.");
cc5b487a 196}
197
198/* Function Name: DeletePcap
199 * Description: Delete a printcap entry given its name.
200 * Arguments: argc, argv - argv[1] is the name of the printer.
201 * Returns: none.
202 */
203
5eaef520 204int DeletePcap(int argc, char **argv)
cc5b487a 205{
5eaef520 206 struct qelem *elem = GetPcapInfo(argv[1]);
207 QueryLoop(elem, PrintPcapInfo, RealDeletePcap, "Delete Printer");
cc5b487a 208
5eaef520 209 FreeQueue(elem);
210 return DM_NORMAL;
cc5b487a 211}
212
213/* Function Name: AddPcap
214 * Description: Add a printcap entry
215 * Arguments: arc, argv - name of printer in argv[1].
216 * Returns: DM_NORMAL.
217 */
218
5eaef520 219int AddPcap(int argc, char **argv)
cc5b487a 220{
5eaef520 221 char *info[MAX_ARGS_SIZE], **args;
222 int stat;
223
224 if (!ValidName(argv[1]))
225 return DM_NORMAL;
226
227 if (!(stat = do_mr_query("get_printcap_entry", 1, argv + 1,
228 NullFunc, NULL)))
229 {
230 Put_message ("A Printer by that name already exists.");
231 return DM_NORMAL;
232 }
233 else if (stat != MR_NO_MATCH)
234 {
235 com_err(program_name, stat, " in AddPcap");
236 return DM_NORMAL;
b7fbb301 237 }
cc5b487a 238
5eaef520 239 args = AskPcapInfo(SetDefaults(info, argv[1]));
240 if (!args)
241 {
242 Put_message("Aborted.");
243 return DM_NORMAL;
244 }
245
246 if ((stat = do_mr_query("add_printcap_entry", CountArgs(args), args,
247 NullFunc, NULL)))
248 com_err(program_name, stat, " in AddPcap");
cc5b487a 249
5eaef520 250 FreeInfo(info);
251 return DM_NORMAL;
cc5b487a 252}
253
254
f03f1f1b 255/* Function Name: ChangePcap
256 * Description: Do the work of changing a pcap
257 * Arguments: argc, argv - printcap info
5eaef520 258 * Returns:
f03f1f1b 259 */
260
5eaef520 261int ChangePcap(char **info, Bool one_item)
f03f1f1b 262{
5eaef520 263 int stat;
264 char **oldinfo;
265
266 oldinfo = CopyInfo(info);
267 if (!AskPcapInfo(info))
268 return DM_QUIT;
269 if ((stat = do_mr_query("delete_printcap_entry", 1, &info[PCAP_NAME],
270 Scream, NULL)))
271 {
272 com_err(program_name, stat, " printcap entry not deleted.");
273 return DM_NORMAL;
f03f1f1b 274 }
5eaef520 275 if ((stat = do_mr_query("add_printcap_entry", CountArgs(info), info,
276 NullFunc, NULL)))
277 {
278 com_err(program_name, stat, " in ChngPcap");
279 if ((stat = do_mr_query("add_printcap_entry", CountArgs(oldinfo) - 3,
280 oldinfo, NullFunc, NULL)))
281 com_err(program_name, stat, " while attempting to put old info back");
b98304a9 282 }
5eaef520 283 FreeInfo(oldinfo);
284 return DM_NORMAL;
f03f1f1b 285}
286
287
288/* Function Name: ChngPcap
289 * Description: Update the printcap information
290 * Arguments: argc, argv - name of printer in argv[1].
291 * Returns: DM_NORMAL.
292 */
293
5eaef520 294int ChngPcap(int argc, char **argv)
f03f1f1b 295{
5eaef520 296 struct qelem *elem = GetPcapInfo(argv[1]);
297 QueryLoop(elem, NullPrint, ChangePcap, "Change the printer");
298 FreeQueue(elem);
299 return DM_NORMAL;
f03f1f1b 300}
1b2e1580 301
302
303/* Function Name: SetPdDefaults
304 * Description: sets the default values for palladium additions.
5eaef520 305 * Arguments: info - an array of char pointers to recieve defaults.
1b2e1580 306 * Returns: char ** (this array, now filled).
307 */
308
5eaef520 309static char **SetPdDefaults(char **info, char *name)
1b2e1580 310{
5eaef520 311 info[PD_NAME] = Strsave(name);
312 info[PD_IDENT] = Strsave("10000");
313 info[PD_HOST] = Strsave(DEFAULT_MACHINE);
314 info[PD_MODTIME] = info[PD_MODBY] = info[PD_MODWITH] = NULL;
1b2e1580 315
5eaef520 316 info[PD_END] = NULL;
317 return info;
1b2e1580 318}
319
320/* Function Name: AskPalladiumInfo.
5eaef520 321 * Description: This function askes the user for information about a
1b2e1580 322 * printer and saves it into a structure.
323 * Arguments: info - a pointer the the structure to put the
324 * info into.
325 * Returns: none.
326 */
327
5eaef520 328static char **AskPalladiumInfo(char **info)
1b2e1580 329{
5eaef520 330 char temp_buf[BUFSIZ];
331
332 Put_message("");
333 sprintf(temp_buf, "Palladium Server/Supervisor entry for %s.",
334 info[PD_NAME]);
335 Put_message(temp_buf);
336 Put_message("");
337
338 if (GetValueFromUser("RPC Program Number", &info[PD_IDENT]) == SUB_ERROR)
339 return NULL;
340 if (GetValueFromUser("Print Server/Supervisor Host", &info[PD_HOST]) ==
341 SUB_ERROR)
342 return NULL;
343 info[PD_HOST] = canonicalize_hostname(info[PD_HOST]);
344
345 FreeAndClear(&info[PD_MODTIME], TRUE);
346 FreeAndClear(&info[PD_MODBY], TRUE);
347 FreeAndClear(&info[PD_MODWITH], TRUE);
348
349 return info;
1b2e1580 350}
351
352
353/* Function Name: PrintPalladiumInfo
354 * Description: Yet another specialized print function.
355 * Arguments: info - all info about this Printer.
356 * Returns: none
357 */
358
5eaef520 359static void PrintPalladiumInfo(char **info)
1b2e1580 360{
5eaef520 361 char buf[BUFSIZ];
362
363 if (!info) /* If no informaion */
364 {
365 Put_message("PrintPalladiumInfo called with null info!");
366 return;
1b2e1580 367 }
368
5eaef520 369 sprintf(buf, "Name: %-24s Program #: %s Host: %s",
370 info[PD_NAME], info[PD_IDENT], info[PD_HOST]);
371 Put_message(buf);
372 sprintf(buf, MOD_FORMAT, info[PD_MODBY], info[PD_MODTIME],
373 info[PD_MODWITH]);
374 Put_message(buf);
1b2e1580 375}
376
377
5eaef520 378static struct qelem *GetPalladiumInfo(char *name)
1b2e1580 379{
5eaef520 380 int status;
381 struct qelem *elem = NULL;
1b2e1580 382
5eaef520 383 if ((status = do_mr_query("get_palladium", 1, &name, StoreInfo, &elem)))
384 {
385 com_err(program_name, status, " in GetPalladiumInfo");
386 return NULL;
1b2e1580 387 }
5eaef520 388 return QueueTop(elem);
1b2e1580 389}
390
391
5eaef520 392int ChangePalladium(char **info, Bool one_item)
1b2e1580 393{
5eaef520 394 int status;
395
396 if (!AskPalladiumInfo(info))
397 return DM_QUIT;
398 if ((status = do_mr_query("delete_palladium", 1, &info[PD_NAME],
399 Scream, NULL)))
400 {
401 com_err(program_name, status, " palladium entry not deleted.");
402 return DM_NORMAL;
1b2e1580 403 }
5eaef520 404 if ((status = do_mr_query("add_palladium", CountArgs(info), info,
405 NullFunc, NULL)))
406 com_err(program_name, status, " in ChngPalladium");
407 return DM_NORMAL;
1b2e1580 408}
409
410
411/* Function Name: RealDeletePalladium
412 * Description: Does the real deletion work.
413 * Arguments: info - array of char *'s containing all useful info.
5eaef520 414 * one_item - a Boolean that is true if only one item
1b2e1580 415 * in queue that dumped us here.
416 * Returns: none.
417 */
418
5eaef520 419void RealDeletePalladium(char **info, Bool one_item)
1b2e1580 420{
5eaef520 421 int stat;
1b2e1580 422
5eaef520 423 if ((stat = do_mr_query("delete_palladium", 1,
424 &info[PD_NAME], Scream, NULL)))
425 com_err(program_name, stat, " palladium entry not deleted.");
426 else
427 Put_message("Palladium entry deleted.");
1b2e1580 428}
429
430
5eaef520 431int GetPalladium(int argc, char **argv)
1b2e1580 432{
5eaef520 433 struct qelem *top;
1b2e1580 434
5eaef520 435 top = GetPalladiumInfo(argv[1]);
436 Loop(top, PrintPalladiumInfo);
437 FreeQueue(top);
438 return DM_NORMAL;
1b2e1580 439}
440
441
5eaef520 442int AddPalladium(int argc, char **argv)
1b2e1580 443{
5eaef520 444 char *info[MAX_ARGS_SIZE], **args;
445 int status;
446
447 if (!ValidName(argv[1]))
448 return DM_NORMAL;
449
450 if (!(status = do_mr_query("get_palladium", 1, &argv[1], NullFunc, NULL)))
451 {
452 Put_message("A server or supervisor by that name already exists.");
453 return DM_NORMAL;
454 }
455 else if (status != MR_NO_MATCH)
456 {
457 com_err(program_name, status, " in AddPalladium");
458 return DM_NORMAL;
1b2e1580 459 }
460
5eaef520 461 args = AskPalladiumInfo(SetPdDefaults(info, argv[1]));
462 if (!args)
463 {
464 Put_message("Aborted.");
465 return DM_NORMAL;
b7fbb301 466 }
1b2e1580 467
5eaef520 468 if ((status = do_mr_query("add_palladium", CountArgs(args), args,
469 Scream, NULL)))
470 com_err(program_name, status, " in AddPalladium");
1b2e1580 471
5eaef520 472 FreeInfo(info);
473 return DM_NORMAL;
1b2e1580 474}
475
476
5eaef520 477int ChngPalladium(int argc, char **argv)
1b2e1580 478{
5eaef520 479 struct qelem *elem = GetPalladiumInfo(argv[1]);
480 QueryLoop(elem, NullPrint, ChangePalladium, "Change the server/supervisor");
481 FreeQueue(elem);
482 return DM_NORMAL;
1b2e1580 483}
484
485
5eaef520 486int DeletePalladium(int argc, char **argv)
1b2e1580 487{
5eaef520 488 struct qelem *elem = GetPalladiumInfo(argv[1]);
489 QueryLoop(elem, PrintPalladiumInfo, RealDeletePalladium,
490 "Delete server/supervisor");
491 FreeQueue(elem);
492 return DM_NORMAL;
1b2e1580 493}
494
5eaef520 495int ShowPalladiumAlias(int argc, char **argv)
1b2e1580 496{
5eaef520 497 struct qelem *elem = NULL;
498 char *qargv[3], buf[BUFSIZ];
499 int status;
500
501 qargv[0] = argv[1];
502 qargv[1] = "PALLADIUM";
503 qargv[2] = argv[2];
504 if ((status = do_mr_query("get_alias", 3, qargv, StoreInfo, &elem)))
505 {
506 com_err(program_name, status, " in ShowPalladiumAlias");
507 return DM_NORMAL;
1b2e1580 508 }
5eaef520 509 elem = QueueTop(elem);
510 Put_message("");
511 while (elem)
512 {
513 char **info = (char **) elem->q_data;
514 sprintf(buf, "Printer: %-16s Server/Supervisor: %s", info[0], info[2]);
515 Put_message(buf);
516 elem = elem->q_forw;
1b2e1580 517 }
518
5eaef520 519 FreeQueue(QueueTop(elem));
520 return DM_NORMAL;
1b2e1580 521}
522
5eaef520 523int AddPalladiumAlias(int argc, char **argv)
1b2e1580 524{
5eaef520 525 int status;
526 char *qargv[3];
527
528 qargv[0] = argv[1];
529 qargv[1] = "PALLADIUM";
530 qargv[2] = argv[2];
531 if ((status = do_mr_query("add_alias", 3, qargv, Scream, NULL)))
532 com_err(program_name, status, " in AddPalladiumAlias");
533 return DM_NORMAL;
1b2e1580 534}
535
5eaef520 536int DeletePalladiumAlias(int argc, char **argv)
1b2e1580 537{
5eaef520 538 int status;
539 char *qargv[3];
540
541 qargv[0] = argv[1];
542 qargv[1] = "PALLADIUM";
543 qargv[2] = argv[2];
544 if ((status = do_mr_query("delete_alias", 3, qargv, Scream, NULL)))
545 com_err(program_name, status, " in DeletePalladiumAlias");
546 return DM_NORMAL;
1b2e1580 547}
This page took 0.227978 seconds and 5 git commands to generate.