]> andersk Git - moira.git/blobdiff - clients/moira/printer.c
Use update_printer query, rather than implementing updates as a
[moira.git] / clients / moira / printer.c
index eac11cd228298b4e62571e89721e7ee6ab70f127..12d888ffedf2ccd8e054a9cdb07738aff54260c1 100644 (file)
@@ -27,9 +27,14 @@ RCSID("$Header$");
 
 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
@@ -63,7 +68,7 @@ static char **SetDefaults(char **info, char *name)
   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]");
@@ -198,11 +203,10 @@ static char *PrintPrnInfo(char **info)
  *     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("");
@@ -210,6 +214,18 @@ static char **AskPrnInfo(char **info)
   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;
@@ -263,6 +279,9 @@ static char **AskPrnInfo(char **info)
   FreeAndClear(&info[PRN_MODBY], TRUE);
   FreeAndClear(&info[PRN_MODWITH], TRUE);
 
+  if (name)
+    SlipInNewName(info, newname);
+
   return info;
 }
 
@@ -279,7 +298,7 @@ int GetPrn(int argc, char **argv)
   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;
 }
@@ -289,7 +308,7 @@ int GetPrnByEthernet(int argc, char **argv)
   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;
 }
@@ -299,7 +318,7 @@ int GetPrnByHostname(int argc, char **argv)
   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;
 }
@@ -309,7 +328,7 @@ int GetPrnByRM(int argc, char **argv)
   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;
 }
@@ -319,7 +338,7 @@ int GetPrnByLocation(int argc, char **argv)
   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;
 }
@@ -329,7 +348,7 @@ int GetPrnByContact(int argc, char **argv)
   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;
 }
@@ -395,7 +414,7 @@ int AddPrn(int argc, char **argv)
       return DM_NORMAL;
     }
 
-  args = AskPrnInfo(SetDefaults(info, argv[1]));
+  args = AskPrnInfo(SetDefaults(info, argv[1]), FALSE);
   if (!args)
     {
       Put_message("Aborted.");
@@ -422,25 +441,16 @@ int AddPrn(int argc, char **argv)
 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.");
 }
 
 
@@ -496,3 +506,187 @@ int UpdateHWAddr(int argc, char **argv)
   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;
+}
This page took 0.045291 seconds and 4 git commands to generate.