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