]> andersk Git - moira.git/blobdiff - server/qsetup.pc
Include object ids in args for incremental programs.
[moira.git] / server / qsetup.pc
index b398ca784ebbbc059a1bb6b37e0b23902644df9a..ab50d669732360ca055b8ac5bd4490b85330dce4 100644 (file)
@@ -62,9 +62,18 @@ int setup_ausr(struct query *q, char *argv[], client *cl)
   else
     row = 1;
 
-  if (strlen(argv[row + 2]) + strlen(argv[row + 3]) +
-      strlen(argv[row + 4]) + 2 > USERS_FULLNAME_SIZE)
-    return MR_ARG_TOO_LONG;
+  if (q->version > 2)
+    {
+      if (strlen(argv[row + 3]) + strlen(argv[row + 4]) +
+         strlen(argv[row + 5]) + 2 > USERS_FULLNAME_SIZE)
+       return MR_ARG_TOO_LONG;
+    }
+  else
+    {
+      if (strlen(argv[row + 2]) + strlen(argv[row + 3]) +
+         strlen(argv[row + 4]) + 2 > USERS_FULLNAME_SIZE)
+       return MR_ARG_TOO_LONG;
+    }
 
   if (!strcmp(argv[row], UNIQUE_UID) || atoi(argv[row]) == -1)
     {
@@ -211,6 +220,10 @@ int setup_dmac(struct query *q, char *argv[], client *cl)
     return MR_IN_USE;
 
   EXEC SQL DELETE FROM mcmap WHERE mach_id = :id;
+  if (dbms_errno)
+    return mr_errcode;
+
+  EXEC SQL DELETE FROM mcntmap WHERE mach_id = :id;
   if (dbms_errno)
     return mr_errcode;
   return MR_SUCCESS;
@@ -267,12 +280,15 @@ int setup_dclu(struct query *q, char *argv[], client *cl)
  * a -1 there.  Remember that this is also used for ulis, with the indexes
  * at 6 & 7.  Also check that the list name does not contain uppercase
  * characters, control characters, @, or :.
+ *
+ *  Newlines in list descriptions do bad things to the aliases file
+ *  moira generates, so make sure the description doesn't contain any, too.
  */
 
 static int badlistchars[] = {
   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* ^@ - ^O */
   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* ^P - ^_ */
-  1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, /* SPACE - / */
+  1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, /* SPACE - / */
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, /* 0 - ? */
   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* @ - O */
   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, /* P - _ */
@@ -292,7 +308,7 @@ int setup_alis(struct query *q, char *argv[], client *cl)
 {
   EXEC SQL BEGIN DECLARE SECTION;
   int ngid, cnt;
-  char *name;
+  char *name, *desc;
   EXEC SQL END DECLARE SECTION;
   unsigned char *p;
   int idx, err;
@@ -303,6 +319,13 @@ int setup_alis(struct query *q, char *argv[], client *cl)
     idx = 1;
   name = argv[idx];
 
+  if (q->version == 2)
+    desc = argv[9 + idx];
+  else if (q->version == 3)
+    desc = argv[10 + idx];
+  else if (q->version >= 4)
+    desc = argv[12 + idx];
+
   if (idx == 1)
     {
       EXEC SQL BEGIN DECLARE SECTION;
@@ -319,6 +342,12 @@ int setup_alis(struct query *q, char *argv[], client *cl)
        return MR_BAD_CHAR;
     }
 
+  for (p = (unsigned char *) desc; *p; p++)
+    {
+      if (*p == '\n')
+       return MR_BAD_CHAR;
+    }
+
   /* Check that it doesn't conflict with a pre-existing weirdly-cased
    * name. */
   EXEC SQL SELECT COUNT(name) INTO :cnt FROM list
@@ -390,6 +419,11 @@ int setup_dlis(struct query *q, char *argv[], client *cl)
   if (cnt > 0)
     return MR_IN_USE;
 
+  EXEC SQL SELECT COUNT(name) INTO :cnt FROM list
+    WHERE memacl_id = :id AND memacl_type = 'LIST' AND list_id != :id;
+  if (cnt > 0)
+    return MR_IN_USE;
+
   EXEC SQL SELECT COUNT(name) INTO :cnt FROM servers
     WHERE acl_id = :id AND acl_type = 'LIST';
   if (cnt > 0)
@@ -409,7 +443,8 @@ int setup_dlis(struct query *q, char *argv[], client *cl)
     WHERE z.xmt_type = 'LIST' AND z.xmt_id = :id
     OR z.sub_type = 'LIST' AND z.sub_id = :id
     OR z.iws_type = 'LIST' AND z.iws_id = :id
-    OR z.iui_type = 'LIST' AND z.iui_id = :id;
+    OR z.iui_type = 'LIST' AND z.iui_id = :id
+    OR z.owner_type = 'LIST' and z.owner_id = :id;
   if (cnt > 0)
     return MR_IN_USE;
 
@@ -848,7 +883,7 @@ int setup_ahst(struct query *q, char **argv, client *cl)
   int value, id, ssaddr, smask, shigh, slow, cnt;
   unsigned int saddr, mask, high, low;
   EXEC SQL END DECLARE SECTION;
-  int row;
+  int row, idx;
   struct in_addr addr;
 
   id = *(int *)argv[0];
@@ -863,6 +898,11 @@ int setup_ahst(struct query *q, char **argv, client *cl)
   else
     row = 0;
 
+  if (q->version < 6)
+    idx = 0;
+  else
+    idx = 1;
+
   /* Sanity check name, vendor, model, and os. */
   if ((row == 0 || strcasecmp(argv[1], oldname)) &&
       !hostname_check(argv[row]))
@@ -887,18 +927,18 @@ int setup_ahst(struct query *q, char **argv, client *cl)
     return MR_EXISTS;
 
   /* check address */
-  if (!strcmp(argv[9 + row], "unassigned"))
+  if (!strcmp(argv[9 + row + idx], "unassigned"))
     value = -1;
-  else if (!strcmp(argv[9 + row], "unique"))
+  else if (!strcmp(argv[9 + row + idx], "unique"))
     {
-      if (*(int *)argv[8 + row] == 0)
+      if (*(int *)argv[8 + row + idx] == 0)
        value = -1;
       else
        value = -2;
     }
   else
     {
-      value = ntohl(inet_addr(argv[9 + row]));
+      value = ntohl(inet_addr(argv[9 + row + idx]));
       if (value == -1)
        return MR_ADDRESS;
     }
@@ -909,7 +949,7 @@ int setup_ahst(struct query *q, char **argv, client *cl)
       /*
        * an address or unique was specified.
        */
-      id = *(int *)argv[8 + row];
+      id = *(int *)argv[8 + row + idx];
       EXEC SQL SELECT saddr, mask, high, low INTO :ssaddr, :smask,
        :shigh, :slow FROM subnet WHERE snet_id = :id;
       if (dbms_errno)
@@ -933,7 +973,7 @@ int setup_ahst(struct query *q, char **argv, client *cl)
           * link in an inet_addr() that returns an error for
           * this case.
           */
-         addr.s_addr = inet_addr(argv[9 + row]);
+         addr.s_addr = inet_addr(argv[9 + row + idx]);
          name = inet_ntoa(addr);
          EXEC SQL SELECT count(mach_id) INTO :cnt FROM machine
            WHERE address = :name;
@@ -985,13 +1025,13 @@ int setup_ahst(struct query *q, char **argv, client *cl)
        * we have an address in value. Convert it to a string and store it.
        */
       addr.s_addr = htonl(value);
-      strcpy(argv[9 + row], inet_ntoa(addr));
+      strcpy(argv[9 + row + idx], inet_ntoa(addr));
     }
   else
-    strcpy(argv[9 + row], "unassigned");
+    strcpy(argv[9 + row + idx], "unassigned");
 
   /* status checking */
-  value = atoi(argv[7 + row]);
+  value = atoi(argv[7 + row + idx]);
   if (row == 0 && !(value == 1 || value == 0))
     return MR_TYPE;
   if (row == 1)
@@ -1221,6 +1261,42 @@ int setup_dpsv(struct query *q, char **argv, client *cl)
   return MR_SUCCESS;
 }
 
+int setup_dcon(struct query *q, char *argv[], client *cl)
+{
+  EXEC SQL BEGIN DECLARE SECTION;
+  int id, cnt;
+  char containername[CONTAINERS_NAME_SIZE];
+  EXEC SQL END DECLARE SECTION;
+
+  id = *(int *)argv[0];
+  /* check to see if there are machines in this container */
+  EXEC SQL SELECT COUNT(mach_id) INTO :cnt FROM mcntmap
+    WHERE cnt_id = :id;
+  if (cnt > 0)
+    return MR_IN_USE;
+
+  /* check to see if there are subcontainers in this container */
+
+  /* get the container name */
+  
+  EXEC SQL SELECT name INTO :containername
+    FROM containers
+    WHERE cnt_id = :id; 
+
+  /* trim off the trailing spaces */
+   strcpy(containername, strtrim(containername));
+
+  EXEC SQL SELECT COUNT(cnt_id) INTO :cnt FROM containers
+    WHERE name LIKE :containername || '/' || '%';
+
+  if (cnt > 0)
+    return MR_IN_USE;
+
+  if (dbms_errno)
+    return mr_errcode;
+  return MR_SUCCESS;
+}
+
 /* hostname_check()
  * validate the rfc1035/rfc1123-ness of a hostname
  */
This page took 0.117295 seconds and 4 git commands to generate.