void RealDeletePrn(char **info, Bool one_item);
void ChangePrn(char **info, Bool one_item);
+void ChangePrintSrvLoop(char **info, Bool one);
extern int GetAliasValue(int argc, char **argv, void *retval);
int StoreHWAddr(int argc, char **argv, void *retval);
+static char *PrintPrintSrvInfo(char **info);
+static char **SetPrintSrvDefaults(char **info, char *name);
+static char **AskPrintSrvInfo(char **info);
+
#define BY_NAME 0
#define BY_ETHERNET 1
#define BY_HOSTNAME 2
info[PRN_RM] = strdup("[ANY]");
info[PRN_RP] = strdup(name);
info[PRN_RQ] = strdup("[NONE]");
- info[PRN_KA] = strdup("1");
+ info[PRN_KA] = strdup("0");
info[PRN_PC] = strdup("10");
info[PRN_AC] = strdup("[none]");
info[PRN_LPC_ACL] = strdup("[none]");
* Returns: none.
*/
-static char **AskPrnInfo(char **info)
+static char **AskPrnInfo(char **info, Bool name)
{
char temp_buf[BUFSIZ];
- char *args[3], *lpc_acl;
- char *s, *d;
+ char *args[3], *lpc_acl, *newname;
int status;
Put_message("");
Put_message(temp_buf);
Put_message("");
+ if (name)
+ {
+ while (1)
+ {
+ newname = strdup(info[PRN_NAME]);
+ if (GetValueFromUser("The new name for this printer? ", &newname) ==
+ SUB_ERROR)
+ return NULL;
+ if (ValidName(newname))
+ break;
+ }
+ }
if (GetTypeFromUser("Type of Printer", "printertype", &info[PRN_TYPE]) ==
SUB_ERROR)
return NULL;
FreeAndClear(&info[PRN_MODBY], TRUE);
FreeAndClear(&info[PRN_MODWITH], TRUE);
+ if (name)
+ SlipInNewName(info, newname);
+
return info;
}
struct mqelem *top;
top = GetPrnInfo(argv[1], BY_NAME); /* get info. */
- Loop(top, (void *) PrintPrnInfo);
+ Loop(top, (void (*)(char **)) PrintPrnInfo);
FreeQueue(top); /* clean the queue. */
return DM_NORMAL;
}
struct mqelem *top;
top = GetPrnInfo(argv[1], BY_ETHERNET); /* get info. */
- Loop(top, (void *) PrintPrnInfo);
+ Loop(top, (void (*)(char **)) PrintPrnInfo);
FreeQueue(top); /* clean the queue. */
return DM_NORMAL;
}
struct mqelem *top;
top = GetPrnInfo(argv[1], BY_HOSTNAME); /* get info. */
- Loop(top, (void *) PrintPrnInfo);
+ Loop(top, (void (*)(char **)) PrintPrnInfo);
FreeQueue(top); /* clean the queue. */
return DM_NORMAL;
}
struct mqelem *top;
top = GetPrnInfo(argv[1], BY_RM); /* get info. */
- Loop(top, (void *) PrintPrnInfo);
+ Loop(top, (void (*)(char **)) PrintPrnInfo);
FreeQueue(top); /* clean the queue. */
return DM_NORMAL;
}
struct mqelem *top;
top = GetPrnInfo(argv[1], BY_LOCATION); /* get info. */
- Loop(top, (void *) PrintPrnInfo);
+ Loop(top, (void (*)(char **)) PrintPrnInfo);
FreeQueue(top); /* clean the queue. */
return DM_NORMAL;
}
struct mqelem *top;
top = GetPrnInfo(argv[1], BY_CONTACT); /* get info. */
- Loop(top, (void *) PrintPrnInfo);
+ Loop(top, (void (*)(char **)) PrintPrnInfo);
FreeQueue(top); /* clean the queue. */
return DM_NORMAL;
}
return DM_NORMAL;
}
- args = AskPrnInfo(SetDefaults(info, argv[1]));
+ args = AskPrnInfo(SetDefaults(info, argv[1]), FALSE);
if (!args)
{
Put_message("Aborted.");
void ChangePrn(char **info, Bool one_item)
{
int stat;
- char **oldinfo;
- oldinfo = CopyInfo(info);
- if (!AskPrnInfo(info))
- return;
- if ((stat = do_mr_query("delete_printer", 1, &info[PRN_NAME], NULL, NULL)))
+ if (!AskPrnInfo(info, TRUE))
{
- com_err(program_name, stat, " printer not updated.");
+ Put_message("Aborted.");
return;
}
- if ((stat = do_mr_query("add_printer", CountArgs(info), info, NULL, NULL)))
- {
- com_err(program_name, stat, " in ChngPrn");
- if ((stat = do_mr_query("add_printer", CountArgs(oldinfo) - 3,
- oldinfo, NULL, NULL)))
- com_err(program_name, stat, " while attempting to put old info back");
- }
- FreeInfo(oldinfo);
- return;
+ if ((stat = do_mr_query("update_printer", CountArgs(info), info, NULL, NULL)))
+ com_err(program_name, stat, " in ChngPrn");
+ else
+ Put_message("Printer successfully updated.");
}
free(hwaddr);
return DM_NORMAL;
}
+
+
+int GetPrintSrv(int argc, char **argv)
+{
+ int stat;
+ struct mqelem *elem = NULL, *top;
+ char *name;
+
+ name = canonicalize_hostname(strdup(argv[1]));
+ stat = do_mr_query("get_print_server", 1, &name, StoreInfo, &elem);
+ if (stat)
+ {
+ com_err(program_name, stat, " in GetPrintSrv");
+ return DM_NORMAL;
+ }
+
+ top = QueueTop(elem);
+ Loop(top, (void (*)(char **)) PrintPrintSrvInfo);
+ FreeQueue(top); /* clean the queue. */
+ return DM_NORMAL;
+}
+
+static char *PrintPrintSrvInfo(char **info)
+{
+ char buf[BUFSIZ];
+
+ if (!info) /* If no informaion */
+ {
+ Put_message("PrintPrintSrvInfo called with null info!");
+ return NULL;
+ }
+ Put_message("");
+ sprintf(buf, "Hostname: %s", info[PRINTSERVER_HOST]);
+ Put_message(buf);
+ sprintf(buf, "Kind: %-10s Printer Types: %s", info[PRINTSERVER_KIND],
+ info[PRINTSERVER_TYPES]);
+ Put_message(buf);
+ if (!strcmp(info[PRINTSERVER_OWNER_TYPE], "NONE"))
+ sprintf(buf, "Owner: %-25s", info[PRINTSERVER_OWNER_TYPE]);
+ else
+ {
+ sprintf(buf, "Owner: %s %-*s", info[PRINTSERVER_OWNER_TYPE],
+ 24 - strlen(info[PRINTSERVER_OWNER_TYPE]),
+ info[PRINTSERVER_OWNER_NAME]);
+ }
+ strcat(buf, "LPC ACL: ");
+ strcat(buf, info[PRINTSERVER_LPC_ACL]);
+ Put_message(buf);
+ sprintf(buf, MOD_FORMAT, info[PRINTSERVER_MODBY], info[PRINTSERVER_MODTIME],
+ info[PRINTSERVER_MODWITH]);
+ Put_message(buf);
+
+ return info[PRINTSERVER_HOST];
+}
+
+static char **SetPrintSrvDefaults(char **info, char *name)
+{
+ info[PRINTSERVER_HOST] = strdup(name);
+ info[PRINTSERVER_KIND] = strdup("ATHENA");
+ info[PRINTSERVER_TYPES] = strdup("PRIVATE");
+ info[PRINTSERVER_OWNER_TYPE] = strdup("NONE");
+ info[PRINTSERVER_OWNER_NAME] = strdup("");
+ info[PRINTSERVER_LPC_ACL] = strdup("[none]");
+ info[PRINTSERVER_MODTIME] = info[PRINTSERVER_MODBY] =
+ info[PRINTSERVER_MODWITH] = NULL;
+
+ info[PRINTSERVER_END] = NULL;
+ return info;
+}
+
+static char **AskPrintSrvInfo(char **info)
+{
+ char buf[BUFSIZ];
+
+ Put_message("");
+ sprintf(buf, "Print Server entry for %s.", info[PRINTSERVER_HOST]);
+ Put_message(buf);
+ Put_message("");
+
+ if (GetTypeFromUser("Kind of LPD", "lpd_kind", &info[PRINTSERVER_KIND]) ==
+ SUB_ERROR)
+ return NULL;
+ if (GetValueFromUser("Printer types", &info[PRINTSERVER_TYPES]) == SUB_ERROR)
+ return NULL;
+ if (GetTypeFromUser("Owner type", "ace_type", &info[PRINTSERVER_OWNER_TYPE])
+ == SUB_ERROR)
+ return NULL;
+ if (strcmp(info[PRINTSERVER_OWNER_TYPE], "NONE") &&
+ GetValueFromUser("Owner Name", &info[PRINTSERVER_OWNER_NAME]) ==
+ SUB_ERROR)
+ return NULL;
+ if (GetValueFromUser("LPC ACL", &info[PRINTSERVER_LPC_ACL]) == SUB_ERROR)
+ return NULL;
+
+ FreeAndClear(&info[PRINTSERVER_MODTIME], TRUE);
+ FreeAndClear(&info[PRINTSERVER_MODBY], TRUE);
+ FreeAndClear(&info[PRINTSERVER_MODWITH], TRUE);
+
+ return info;
+}
+
+int AddPrintSrv(int argc, char **argv)
+{
+ char *info[MAX_ARGS_SIZE], **args, *name;
+ int stat;
+
+ name = canonicalize_hostname(strdup(argv[1]));
+
+ if (!(stat = do_mr_query("get_print_server", 1, &name, NULL, NULL)))
+ {
+ Put_message ("A print server record for that host already exists.");
+ free(name);
+ return DM_NORMAL;
+ }
+ else if (stat != MR_NO_MATCH)
+ {
+ com_err(program_name, stat, " in AddPrintSrv");
+ free(name);
+ return DM_NORMAL;
+ }
+
+ args = AskPrintSrvInfo(SetPrintSrvDefaults(info, name));
+ free(name);
+ if (!args)
+ {
+ Put_message("Aborted.");
+ return DM_NORMAL;
+ }
+
+ if ((stat = do_mr_query("add_print_server", CountArgs(args),
+ args, NULL, NULL)))
+ com_err(program_name, stat, " in AddPrintSrv");
+
+ FreeInfo(info);
+ return DM_NORMAL;
+}
+
+int ChangePrintSrv(int argc, char **argv)
+{
+ char *name;
+ struct mqelem *elem = NULL;
+ int stat;
+
+ name = canonicalize_hostname(strdup(argv[1]));
+ if ((stat = do_mr_query("get_print_server", 1, &name, StoreInfo, &elem)))
+ {
+ free(name);
+ com_err(program_name, stat, " in ChangePrintSrv");
+ return DM_NORMAL;
+ }
+ free(name);
+
+ QueryLoop(elem, NullPrint, ChangePrintSrvLoop, "Change the print server");
+ FreeQueue(elem);
+ return DM_NORMAL;
+}
+
+void ChangePrintSrvLoop(char **info, Bool one)
+{
+ int stat;
+
+ if (!AskPrintSrvInfo(info))
+ return;
+
+ if ((stat = do_mr_query("update_print_server", CountArgs(info),
+ info, NULL, NULL)))
+ com_err(program_name, stat, " in ChangePrintSrv");
+
+ FreeInfo(info);
+ return;
+}
+
+int DelPrintSrv(int argc, char **argv)
+{
+ int stat;
+ char *name;
+
+ name = canonicalize_hostname(strdup(argv[1]));
+
+ if ((stat = do_mr_query("delete_print_server", 1, &name, NULL, NULL)))
+ com_err(program_name, stat, " while deleting print server");
+ free(name);
+ return DM_NORMAL;
+}