1 #if (!defined(lint) && !defined(SABER))
2 static char rcsid_module_c[] = "$Header$";
5 /* This is the file printer.c for the MOIRA Client, which allows a nieve
6 * user to quickly and easily maintain most parts of the MOIRA database.
7 * It Contains: Functions for handling the printers.
10 * By: Theodore Y. Ts'o
16 * Copyright 1988 by the Massachusetts Institute of Technology.
18 * For further information on copyright and distribution
19 * see the file mit-copyright.h
26 #include <moira_site.h>
29 #include "mit-copyright.h"
34 #define DEFAULT_MACHINE "E40-PRINT-SERVER-1.MIT.EDU"
36 /* Function Name: SetDefaults
37 * Description: sets the default values for filesystem additions.
38 * Arguments: info - an array of char pointers to recieve defaults.
39 * Returns: char ** (this array, now filled).
42 static char **SetDefaults(char **info, char *name)
46 strcpy(spool_dir, "/usr/spool/printer/");
47 strcat(spool_dir, name);
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;
59 info[PCAP_END] = NULL;
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.
70 static struct qelem *GetPcapInfo(char *name)
73 struct qelem *elem = NULL;
75 if ((stat = do_mr_query("get_printcap_entry", 1, &name,
76 StoreInfo, (char *)&elem)))
78 com_err(program_name, stat, " in GetPcapInfo");
81 return QueueTop(elem);
84 /* Function Name: PrintPcapInfo
85 * Description: Yet another specialized print function.
86 * Arguments: info - all info about this Printer.
90 static void PrintPcapInfo(char **info)
94 if (!info) /* If no informaion */
96 Put_message("PrintPcapInfo called with null info!");
99 sprintf(buf, "Printer: %-35s Spool host: %s", info[PCAP_NAME],
100 info[PCAP_SPOOL_HOST]);
102 sprintf(buf, "Spool directory: %-27s Remote Printer Name: %s",
103 info[PCAP_SPOOL_DIR], info[PCAP_RPRINTER]);
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]);
109 sprintf(buf, "Comments: %s", info[PCAP_COMMENTS]);
111 sprintf(buf, MOD_FORMAT, info[PCAP_MODBY], info[PCAP_MODTIME],
116 /* Function Name: AskPcapInfo.
117 * Description: This function askes the user for information about a
118 * printer and saves it into a structure.
119 * Arguments: info - a pointer the the structure to put the
124 static char **AskPcapInfo(char **info)
126 char temp_buf[BUFSIZ];
129 sprintf(temp_buf, "Printcap entry for %s.", info[PCAP_NAME]);
130 Put_message(temp_buf);
133 if (GetValueFromUser("Printer Server", &info[PCAP_SPOOL_HOST]) == SUB_ERROR)
135 info[PCAP_SPOOL_HOST] = canonicalize_hostname(info[PCAP_SPOOL_HOST]);
136 if (GetValueFromUser("Spool Directory", &info[PCAP_SPOOL_DIR]) ==
139 if (GetValueFromUser("Remote Printer Name", &info[PCAP_RPRINTER]) ==
142 if (GetValueFromUser("Quotaserver for this printer", &info[PCAP_QSERVER]) ==
145 info[PCAP_QSERVER] = canonicalize_hostname(info[PCAP_QSERVER]);
146 if (GetYesNoValueFromUser("Authentication required", &info[PCAP_AUTH]) ==
149 if (GetValueFromUser("Price/page", &info[PCAP_PRICE]) == SUB_ERROR)
151 if (GetValueFromUser("Comments", &info[PCAP_COMMENTS]) == SUB_ERROR)
154 FreeAndClear(&info[PCAP_MODTIME], TRUE);
155 FreeAndClear(&info[PCAP_MODBY], TRUE);
156 FreeAndClear(&info[PCAP_MODWITH], TRUE);
161 /* ---------------- Printer Menu ------------------ */
163 /* Function Name: GetPcap
164 * Description: Get Printcap information
165 * Arguments: argc, argv - name of filsys in argv[1].
166 * Returns: DM_NORMAL.
169 int GetPcap(int argc, char **argv)
173 top = GetPcapInfo(argv[1]); /* get info. */
174 Loop(top, (void *) PrintPcapInfo);
175 FreeQueue(top); /* clean the queue. */
179 /* Function Name: RealDeletePcap
180 * Description: Does the real deletion work.
181 * Arguments: info - array of char *'s containing all useful info.
182 * one_item - a Boolean that is true if only one item
183 * in queue that dumped us here.
187 void RealDeletePcap(char **info, Bool one_item)
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.");
195 Put_message("Printcap entry deleted.");
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.
204 int DeletePcap(int argc, char **argv)
206 struct qelem *elem = GetPcapInfo(argv[1]);
207 QueryLoop(elem, PrintPcapInfo, RealDeletePcap, "Delete Printer");
213 /* Function Name: AddPcap
214 * Description: Add a printcap entry
215 * Arguments: arc, argv - name of printer in argv[1].
216 * Returns: DM_NORMAL.
219 int AddPcap(int argc, char **argv)
221 char *info[MAX_ARGS_SIZE], **args;
224 if (!ValidName(argv[1]))
227 if (!(stat = do_mr_query("get_printcap_entry", 1, argv + 1,
230 Put_message ("A Printer by that name already exists.");
233 else if (stat != MR_NO_MATCH)
235 com_err(program_name, stat, " in AddPcap");
239 args = AskPcapInfo(SetDefaults(info, argv[1]));
242 Put_message("Aborted.");
246 if ((stat = do_mr_query("add_printcap_entry", CountArgs(args), args,
248 com_err(program_name, stat, " in AddPcap");
255 /* Function Name: ChangePcap
256 * Description: Do the work of changing a pcap
257 * Arguments: argc, argv - printcap info
261 int ChangePcap(char **info, Bool one_item)
266 oldinfo = CopyInfo(info);
267 if (!AskPcapInfo(info))
269 if ((stat = do_mr_query("delete_printcap_entry", 1, &info[PCAP_NAME],
272 com_err(program_name, stat, " printcap entry not deleted.");
275 if ((stat = do_mr_query("add_printcap_entry", CountArgs(info), info,
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");
288 /* Function Name: ChngPcap
289 * Description: Update the printcap information
290 * Arguments: argc, argv - name of printer in argv[1].
291 * Returns: DM_NORMAL.
294 int ChngPcap(int argc, char **argv)
296 struct qelem *elem = GetPcapInfo(argv[1]);
297 QueryLoop(elem, NullPrint, ChangePcap, "Change the printer");
303 /* Function Name: SetPdDefaults
304 * Description: sets the default values for palladium additions.
305 * Arguments: info - an array of char pointers to recieve defaults.
306 * Returns: char ** (this array, now filled).
309 static char **SetPdDefaults(char **info, char *name)
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;
320 /* Function Name: AskPalladiumInfo.
321 * Description: This function askes the user for information about a
322 * printer and saves it into a structure.
323 * Arguments: info - a pointer the the structure to put the
328 static char **AskPalladiumInfo(char **info)
330 char temp_buf[BUFSIZ];
333 sprintf(temp_buf, "Palladium Server/Supervisor entry for %s.",
335 Put_message(temp_buf);
338 if (GetValueFromUser("RPC Program Number", &info[PD_IDENT]) == SUB_ERROR)
340 if (GetValueFromUser("Print Server/Supervisor Host", &info[PD_HOST]) ==
343 info[PD_HOST] = canonicalize_hostname(info[PD_HOST]);
345 FreeAndClear(&info[PD_MODTIME], TRUE);
346 FreeAndClear(&info[PD_MODBY], TRUE);
347 FreeAndClear(&info[PD_MODWITH], TRUE);
353 /* Function Name: PrintPalladiumInfo
354 * Description: Yet another specialized print function.
355 * Arguments: info - all info about this Printer.
359 static void PrintPalladiumInfo(char **info)
363 if (!info) /* If no informaion */
365 Put_message("PrintPalladiumInfo called with null info!");
369 sprintf(buf, "Name: %-24s Program #: %s Host: %s",
370 info[PD_NAME], info[PD_IDENT], info[PD_HOST]);
372 sprintf(buf, MOD_FORMAT, info[PD_MODBY], info[PD_MODTIME],
378 static struct qelem *GetPalladiumInfo(char *name)
381 struct qelem *elem = NULL;
383 if ((status = do_mr_query("get_palladium", 1, &name, StoreInfo, &elem)))
385 com_err(program_name, status, " in GetPalladiumInfo");
388 return QueueTop(elem);
392 int ChangePalladium(char **info, Bool one_item)
396 if (!AskPalladiumInfo(info))
398 if ((status = do_mr_query("delete_palladium", 1, &info[PD_NAME],
401 com_err(program_name, status, " palladium entry not deleted.");
404 if ((status = do_mr_query("add_palladium", CountArgs(info), info,
406 com_err(program_name, status, " in ChngPalladium");
411 /* Function Name: RealDeletePalladium
412 * Description: Does the real deletion work.
413 * Arguments: info - array of char *'s containing all useful info.
414 * one_item - a Boolean that is true if only one item
415 * in queue that dumped us here.
419 void RealDeletePalladium(char **info, Bool one_item)
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.");
427 Put_message("Palladium entry deleted.");
431 int GetPalladium(int argc, char **argv)
435 top = GetPalladiumInfo(argv[1]);
436 Loop(top, PrintPalladiumInfo);
442 int AddPalladium(int argc, char **argv)
444 char *info[MAX_ARGS_SIZE], **args;
447 if (!ValidName(argv[1]))
450 if (!(status = do_mr_query("get_palladium", 1, &argv[1], NullFunc, NULL)))
452 Put_message("A server or supervisor by that name already exists.");
455 else if (status != MR_NO_MATCH)
457 com_err(program_name, status, " in AddPalladium");
461 args = AskPalladiumInfo(SetPdDefaults(info, argv[1]));
464 Put_message("Aborted.");
468 if ((status = do_mr_query("add_palladium", CountArgs(args), args,
470 com_err(program_name, status, " in AddPalladium");
477 int ChngPalladium(int argc, char **argv)
479 struct qelem *elem = GetPalladiumInfo(argv[1]);
480 QueryLoop(elem, NullPrint, ChangePalladium, "Change the server/supervisor");
486 int DeletePalladium(int argc, char **argv)
488 struct qelem *elem = GetPalladiumInfo(argv[1]);
489 QueryLoop(elem, PrintPalladiumInfo, RealDeletePalladium,
490 "Delete server/supervisor");
495 int ShowPalladiumAlias(int argc, char **argv)
497 struct qelem *elem = NULL;
498 char *qargv[3], buf[BUFSIZ];
502 qargv[1] = "PALLADIUM";
504 if ((status = do_mr_query("get_alias", 3, qargv, StoreInfo, &elem)))
506 com_err(program_name, status, " in ShowPalladiumAlias");
509 elem = QueueTop(elem);
513 char **info = (char **) elem->q_data;
514 sprintf(buf, "Printer: %-16s Server/Supervisor: %s", info[0], info[2]);
519 FreeQueue(QueueTop(elem));
523 int AddPalladiumAlias(int argc, char **argv)
529 qargv[1] = "PALLADIUM";
531 if ((status = do_mr_query("add_alias", 3, qargv, Scream, NULL)))
532 com_err(program_name, status, " in AddPalladiumAlias");
536 int DeletePalladiumAlias(int argc, char **argv)
542 qargv[1] = "PALLADIUM";
544 if ((status = do_mr_query("delete_alias", 3, qargv, Scream, NULL)))
545 com_err(program_name, status, " in DeletePalladiumAlias");