]> andersk Git - moira.git/blobdiff - server/qsupport.qc
added kerberos mapping routines; improved user status handling
[moira.git] / server / qsupport.qc
index a85f1693cbb2338c9b413aabbf3585f736e2bfd0..77d38bcc2ae9ee7d2ce768ec8972f83296338a24 100644 (file)
@@ -4,6 +4,8 @@
  *     $Header$
  *
  *     Copyright (C) 1987 by the Massachusetts Institute of Technology
+ *     For copying and distribution information, please see the file
+ *     <mit-copyright.h>.
  *
  */
 
 static char *rcsid_qsupport_qc = "$Header$";
 #endif lint
 
+#include <mit-copyright.h>
 #include "query.h"
 #include "sms_server.h"
 #include <ctype.h>
 
 
 extern char *whoami, *strsave();
-extern int  ingres_errno;
+extern int ingres_errno, sms_errcode;
 
 
 /* Specialized Access Routines */
@@ -101,8 +104,9 @@ access_list(q, argv, cl)
        return(status);
 
     /* if amtl or dmfl and list is public allow client to add or delete self */
-    if ((!strcmp("amtl", q->shortname) || !strcmp("dmfl", q->shortname)) &&
-       (flags && !strcmp("USER", argv[1]))) {
+    if (((!strcmp("amtl", q->shortname) && flags) ||
+        (!strcmp("dmfl", q->shortname))) &&
+       (!strcmp("USER", argv[1]))) {
        if (*(int *)argv[2] == client_id) return(SMS_SUCCESS);
     /* if update_list, don't allow them to change the GID */
     } else if (!strcmp("ulis", q->shortname)) {
@@ -359,8 +363,8 @@ int setup_dusr(q, argv)
       return(SMS_IN_USE);
 
 ##  repeat delete nfsquota where nfsquota.users_id = @id
-##  repeat retrieve (flag = any(members.member_id where members.member_id=@id
-##                      and members.member_type = "USER"))
+##  repeat retrieve (flag = any(imembers.member_id where imembers.member_id=@id
+##                      and imembers.member_type = "USER"))
     if (flag)
        return(SMS_IN_USE);
 ##  repeat retrieve (flag = any(filesys.label where filesys.owner=@id))
@@ -527,11 +531,11 @@ int setup_dlis(q, argv)
 ##  int flag, id;
 
     id = *(int *)argv[0];
-##  repeat retrieve (flag = any(members.member_id where members.member_id=@id
-##                      and members.member_type = "LIST"))
+##  repeat retrieve (flag = any(imembers.member_id where imembers.member_id=@id
+##                      and imembers.member_type = "LIST"))
     if (flag)
        return(SMS_IN_USE);
-##  repeat retrieve (flag = any(members.member_id where members.list_id=@id))
+##  repeat retrieve (flag = any(imembers.member_id where imembers.list_id=@id))
     if (flag)
        return(SMS_IN_USE);
 ##  repeat retrieve (flag = any(filesys.label where filesys.owners=@id))
@@ -700,7 +704,7 @@ setup_ufil(q, argv)
     char *name;
     char *access;
 ##{
-##  char dir[32];
+##  char dir[81];
     char caccess;
     register int status;
     register char *cp1;
@@ -729,8 +733,8 @@ setup_ufil(q, argv)
 ##}
 
 
-/* setup_dfil: free any quota records associated with a filesystem
- * when it is deleted.
+/* setup_dfil: free any quota records and fsgroup info associated with
+ * a filesystem when it is deleted.  Also adjust the allocation numbers.
  */
 
 setup_dfil(q, argv, cl)
@@ -748,6 +752,8 @@ setup_dfil(q, argv, cl)
 ##     where n.nfsphys_id = fs.phys_id and fs.filsys_id = @id
 
 ##  repeat delete q where q.filsys_id = @id
+##  repeat delete fsgroup where fsgroup.filsys_id = @id
+##  repeat delete fsgroup where fsgroup.group_id = @id
     return(SMS_SUCCESS);
 ##}
 
@@ -795,6 +801,19 @@ setup_dnfq(q, argv, cl)
 ##}
 
 
+/* setup_sshi: don't exclusive lock the machine table during
+ * set_server_host_internal.
+ */
+
+setup_sshi(q, argv, cl)
+    struct query  *q;
+    char **argv;
+    client *cl;
+##{
+##  set lockmode session where readlock = system
+##}
+
+
 \f
 /* FOLLOWUP ROUTINES */
 
@@ -889,25 +908,24 @@ set_pobox_modtime(q, argv, cl)
 ##}
 
 
-/* Sets the modtime on a machine record.  The machine name is in argv[0].
- * This routine is different from the generic set_modtime in that the
- * name is uppercased first.
+/* Like set_modtime, but uppercases the name first.
  */
 
-set_mach_modtime(q, argv, cl)
+set_uppercase_modtime(q, argv, cl)
     struct query *q;
     char **argv;
     client *cl;
 ##{
-##  char *host, *entity;
+##  char *name, *entity, *table;
 ##  int who;
 
     entity = cl->entity;
     who = cl->users_id;
+    table = q->rtable;
+    name = argv[0];
 
-    host = argv[0];
-##  repeat replace m (modtime = "now", modby = @who, modwith = @entity)
-##      where m.name = uppercase(@host)
+##  replace table (modtime = "now", modby = who, modwith = entity)
+##      where table.#name = uppercase(name)
     return(SMS_SUCCESS);
 ##}
 
@@ -1253,6 +1271,11 @@ followup_glin(q, sq, v, action, actarg, cl)
                strcpy(name, "???");
        } else if (!strcmp(type, "USER")) {
 ##         repeat retrieve (name = users.login) where users.users_id = @id
+##         inquire_equel(rowcount = "rowcount")
+           if (rowcount != 1)
+               strcpy(name, "???");
+       } else if (!strcmp(type, "KERBEROS")) {
+##         repeat retrieve (name = strings.string) where strings.string_id = @id
 ##         inquire_equel(rowcount = "rowcount")
            if (rowcount != 1)
                strcpy(name, "???");
@@ -1395,6 +1418,11 @@ followup_gzcl(q, sq, v, action, actarg, cl)
                  strcpy(name, "???");
            } else if (!strcmp(argv[i], "USER")) {
 ##             repeat retrieve (name = users.login) where users.users_id = @id
+##             inquire_equel(rowcount = "rowcount")
+               if (rowcount != 1)
+                 strcpy(name, "???");
+           } else if (!strcmp(argv[i], "KERBEROS")) {
+##             repeat retrieve (name = strings.string) where strings.string_id = @id
 ##             inquire_equel(rowcount = "rowcount")
                if (rowcount != 1)
                  strcpy(name, "???");
@@ -1456,6 +1484,11 @@ followup_gsha(q, sq, v, action, actarg, cl)
              strcpy(name, "???");
        } else if (!strcmp(argv[1], "USER")) {
 ##         repeat retrieve (name = users.login) where users.users_id = @id
+##         inquire_equel(rowcount = "rowcount")
+           if (rowcount != 1)
+             strcpy(name, "???");
+       } else if (!strcmp(argv[1], "KERBEROS")) {
+##         repeat retrieve (name = strings.string) where strings.string_id = @id
 ##         inquire_equel(rowcount = "rowcount")
            if (rowcount != 1)
              strcpy(name, "???");
@@ -1597,6 +1630,12 @@ get_list_info(q, aargv, cl, action, actarg)
        } else if (!strcmp(acl_type, "USER")) {
 ##         repeat retrieve (acl_name = users.#login)
 ##             where users.users_id = @acl_id
+##         inquire_equel(rowcount = "rowcount")
+           if (rowcount != 1)
+               strcpy(acl_name, "???");
+       } else if (!strcmp(acl_type, "KERBEROS")) {
+##         repeat retrieve (acl_name = strings.string)
+##             where strings.string_id = @acl_id
 ##         inquire_equel(rowcount = "rowcount")
            if (rowcount != 1)
                strcpy(acl_name, "???");
@@ -1623,6 +1662,204 @@ get_list_info(q, aargv, cl, action, actarg)
 ##}
 
 
+/* Add_member_to_list: do list flattening as we go!  MAXLISTDEPTH is
+ * how many different ancestors a member is allowed to have.
+ */
+
+#define MAXLISTDEPTH   100
+
+int add_member_to_list(q, argv, cl)
+    struct query *q;
+    char **argv;
+    client *cl;
+##{
+##  int id, lid, mid, exists, error;
+##  char *mtype, dtype[9];
+    int ancestors[MAXLISTDEPTH], acount, a;
+    int descendants[MAXLISTDEPTH], dcount, d;
+    char *dtypes[MAXLISTDEPTH];
+
+##  range of m is imembers
+    lid = *(int *)argv[0];
+    mtype = argv[1];
+    mid = *(int *)argv[2];
+##  repeat retrieve (exists = any(m.list_id where m.list_id=@lid and 
+##                        m.member_id = @mid and m.member_type = @mtype
+##                        and m.direct = 1))
+    if (exists)
+      return(SMS_EXISTS);
+    ancestors[0] = lid;
+    acount = 1;
+##  repeat retrieve (id = m.list_id)
+##     where m.member_id = @lid and m.member_type = "LIST" {
+       ancestors[acount++] = id;
+       if (acount >= MAXLISTDEPTH) {
+##         endretrieve
+       }
+##  }
+    if (acount >= MAXLISTDEPTH) {
+       return(SMS_INTERNAL);
+    }
+    descendants[0] = mid;
+    dtypes[0] = mtype;
+    dcount = 1;
+    error = 0;
+    if (!strcmp(mtype, "LIST")) {
+##     repeat retrieve (id = m.member_id, dtype = m.member_type)
+##       where m.list_id = @mid {
+           switch (dtype[0]) {
+           case 'L':
+               dtypes[dcount] = "LIST";
+               break;
+           case 'U':
+               dtypes[dcount] = "USER";
+               break;
+           case 'S':
+               dtypes[dcount] = "STRING";
+               break;
+           case 'K':
+               dtypes[dcount] = "KERBEROS";
+               break;
+           default:
+               error++;
+##             endretrieve
+           }
+           descendants[dcount++] = id;
+           if (dcount >= MAXLISTDEPTH) {
+               error++;
+##             endretrieve
+           }
+##     }
+       if (error)
+         return(SMS_INTERNAL);
+    }
+    for (a = 0; a < acount; a++) {
+       lid = ancestors[a];
+       for (d = 0; d < dcount; d++) {
+           mid = descendants[d];
+           mtype = dtypes[d];
+           if (mid == lid && !strcmp(mtype, "LIST")) {
+               return(SMS_LISTLOOP);
+           }
+##         repeat retrieve (exists = any(m.ref_count where m.list_id = @lid
+##                                      and m.member_id = @mid
+##                                      and m.member_type = @mtype))
+           if (exists) {
+               if (a == 0 && d == 0)
+##               replace m (ref_count = m.ref_count+1, direct = 1)
+##                          where m.list_id = lid and m.member_id = mid and
+##                          m.member_type = mtype
+               else
+##               replace m (ref_count = m.ref_count+1)
+##                          where m.list_id = lid and m.member_id = mid and
+##                          m.member_type = mtype
+           } else {
+               if (a == 0 && d == 0)
+##               append imembers (list_id=lid, member_id = mid, direct = 1,
+##                                member_type=mtype, ref_count = 1)
+               else
+##               append imembers (list_id=lid, member_id = mid,
+##                                member_type=mtype, ref_count = 1)
+           }
+       }
+    }
+    return(SMS_SUCCESS);
+##}
+
+
+/* Delete_member_from_list: do list flattening as we go!
+ */
+
+int delete_member_from_list(q, argv, cl)
+    struct query *q;
+    char **argv;
+    client *cl;
+##{
+##  int id, lid, mid, cnt, exists, error;
+##  char *mtype, dtype[9];
+    int ancestors[MAXLISTDEPTH], acount, a;
+    int descendants[MAXLISTDEPTH], dcount, d;
+    char *dtypes[MAXLISTDEPTH];
+
+##  range of m is imembers
+    lid = *(int *)argv[0];
+    mtype = argv[1];
+    mid = *(int *)argv[2];
+##  repeat retrieve (exists = any(m.list_id where m.list_id=@lid and 
+##                        m.member_id = @mid and m.member_type = @mtype
+##                        and m.direct = 1))
+    if (!exists)
+      return(SMS_NO_MATCH);
+    ancestors[0] = lid;
+    acount = 1;
+##  repeat retrieve (id = m.list_id)
+##     where m.member_id = @lid and m.member_type = "LIST" {
+       ancestors[acount++] = id;
+       if (acount >= MAXLISTDEPTH)
+##       endretrieve
+##  }
+    if (acount >= MAXLISTDEPTH)
+      return(SMS_INTERNAL);
+    descendants[0] = mid;
+    dtypes[0] = mtype;
+    dcount = 1;
+    error = 0;
+    if (!strcmp(mtype, "LIST")) {
+##     repeat retrieve (id = m.member_id, dtype = m.member_type)
+##       where m.list_id = @mid {
+           switch (dtype[0]) {
+           case 'L':
+               dtypes[dcount] = "LIST";
+               break;
+           case 'U':
+               dtypes[dcount] = "USER";
+               break;
+           case 'S':
+               dtypes[dcount] = "STRING";
+               break;
+           case 'K':
+               dtypes[dcount] = "KERBEROS";
+               break;
+           default:
+               error++;
+##             endretrieve
+           }
+           descendants[dcount++] = id;
+           if (dcount >= MAXLISTDEPTH)
+##           endretrieve
+##     }
+       if (error)
+         return(SMS_INTERNAL);
+    }
+    for (a = 0; a < acount; a++) {
+       lid = ancestors[a];
+       for (d = 0; d < dcount; d++) {
+           mid = descendants[d];
+           mtype = dtypes[d];
+           if (mid == lid && !strcmp(mtype, "LIST")) {
+               return(SMS_LISTLOOP);
+           }
+##         repeat retrieve (cnt = m.ref_count)
+##             where m.list_id = @lid and m.member_id = @mid
+##               and m.member_type = @mtype
+           if (cnt <= 1) {
+##             delete m where m.list_id = lid and m.member_id = mid and
+##                 m.member_type = mtype
+           } else if (a == 0 && d == 0) {
+##             replace m (ref_count = m.ref_count-1, direct = 0)
+##                 where m.list_id = lid and m.member_id = mid and
+##                 m.member_type = mtype
+           } else {
+##             replace m (ref_count = m.ref_count-1)
+##                 where m.list_id = lid and m.member_idn = mid and
+##                 m.member_type = mtype
+           }
+       }
+    }
+    return(SMS_SUCCESS);
+##}
+
+
 /* get_ace_use - given a type and a name, return a type and a name.
  * The ace_type is one of "LIST", "USER", "RLIST", or "RUSER" in argv[0],
  * and argv[1] will contain the ID of the entity in question.  The R*
@@ -1643,9 +1880,11 @@ int get_ace_use(q, argv, cl, action, actarg)
 ##  int aid, listid, id;
     struct save_queue *sq, *sq_create();
 
+##  range of m is imembers
     atype = argv[0];
     aid = *(int *)argv[1];
-    if (!strcmp(atype, "LIST") || !strcmp(atype, "USER")) {
+    if (!strcmp(atype, "LIST") || !strcmp(atype, "USER") ||
+       !strcmp(atype, "KERBEROS")) {
        return(get_ace_internal(atype, aid, action, actarg));
     }
 
@@ -1653,13 +1892,11 @@ int get_ace_use(q, argv, cl, action, actarg)
     if (!strcmp(atype, "RLIST")) {
        sq_save_data(sq, aid);
        /* get all the list_id's of containing lists */
-##     range of m is members
-       while (sq_get_data(sq, &id)) {
-##         repeat retrieve (listid = m.list_id)
+##     range of m is imembers
+##     repeat retrieve (listid = m.list_id)
 ##             where m.member_type = "LIST" and m.member_id = @id {
-             sq_save_unique_data(sq, listid);
-##         }
-         }
+           sq_save_unique_data(sq, listid);
+##     }
        /* now process each one */
        while (sq_get_data(sq, &id)) {
            if (get_ace_internal("LIST", id, action, actarg) == SMS_SUCCESS)
@@ -1668,18 +1905,10 @@ int get_ace_use(q, argv, cl, action, actarg)
     }
 
     if (!strcmp(atype, "RUSER")) {
-##     range of m is members
 ##     repeat retrieve (listid = m.list_id)
 ##             where m.member_type = "USER" and m.member_id = @aid {
            sq_save_data(sq, listid);
 ##     }
-       /* get all the list_id's of containing lists */
-       while (sq_get_data(sq, &id)) {
-##         repeat retrieve (listid = m.list_id)
-##             where m.member_type = "LIST" and m.member_id = @id {
-             sq_save_unique_data(sq, listid);
-##         }
-         }
        /* now process each one */
        while (sq_get_data(sq, &id)) {
            if (get_ace_internal("LIST", id, action, actarg) == SMS_SUCCESS)
@@ -1689,6 +1918,20 @@ int get_ace_use(q, argv, cl, action, actarg)
          found++;
     }
 
+    if (!strcmp(atype, "RKERBERO")) {
+##     repeat retrieve (listid = m.list_id)
+##             where m.member_type = "KERBEROS" and m.member_id = @aid {
+           sq_save_data(sq, listid);
+##     }
+       /* now process each one */
+       while (sq_get_data(sq, &id)) {
+           if (get_ace_internal("LIST", id, action, actarg) == SMS_SUCCESS)
+             found++;
+       }
+       if (get_ace_internal("KERBEROS", aid, action, actarg) == SMS_SUCCESS)
+         found++;
+    }
+
     sq_destroy(sq);    
     if (!found) return(SMS_NO_MATCH);
     return(SMS_SUCCESS);
@@ -1785,103 +2028,30 @@ int get_lists_of_member(q, argv, cl, action, actarg)
     int (*action)();
     int actarg;
 ##{
-    int found = 0;
+    int found = 0, direct = 1;
+    char *rargv[6];
 ##  char *atype;
 ##  int aid, listid, id;
-    struct save_queue *sq, *sq_create();
+##  char name[33], active[5], public[5], hidden[5], maillist[5], group[5];
 
     atype = argv[0];
     aid = *(int *)argv[1];
-    if (!strcmp(atype, "LIST") ||
-       !strcmp(atype, "USER") ||
-       !strcmp(atype, "STRING")) {
-      return(glom_internal(atype, aid, action, actarg));
-    }
-
-    sq = sq_create();
     if (!strcmp(atype, "RLIST")) {
-       sq_save_data(sq, aid);
-       /* get all the list_id's of containing lists */
-##     range of m is members
-       while (sq_get_data(sq, &id)) {
-##         repeat retrieve (listid = m.list_id)
-##             where m.member_type = "LIST" and m.member_id = @id {
-             sq_save_unique_data(sq, listid);
-##         }
-         }
-       /* now process each one */
-       while (sq_get_data(sq, &id)) {
-           if (glom_internal("LIST", id, action, actarg) == SMS_SUCCESS)
-             found++;
-       }
+       atype = "LIST";
+       direct = 0;
     }
-
     if (!strcmp(atype, "RUSER")) {
-##     range of m is members
-##     repeat retrieve (listid = m.list_id)
-##             where m.member_type = "USER" and m.member_id = @aid {
-           sq_save_data(sq, listid);
-##     }
-       /* get all the list_id's of containing lists */
-       while (sq_get_data(sq, &id)) {
-##         repeat retrieve (listid = m.list_id)
-##             where m.member_type = "LIST" and m.member_id = @id {
-             sq_save_unique_data(sq, listid);
-##         }
-         }
-       /* now process each one */
-       while (sq_get_data(sq, &id)) {
-           if (glom_internal("LIST", id, action, actarg) == SMS_SUCCESS)
-             found++;
-       }
-       if (glom_internal("USER", aid, action, actarg) == SMS_SUCCESS)
-         found++;
+       atype = "USER";
+       direct = 0;
     }
-
     if (!strcmp(atype, "RSTRING")) {
-##     range of m is members
-##     repeat retrieve (listid = m.list_id)
-##             where m.member_type = "STRING" and m.member_id = @aid {
-           sq_save_data(sq, listid);
-##     }
-       /* get all the list_id's of containing lists */
-       while (sq_get_data(sq, &id)) {
-##         repeat retrieve (listid = m.list_id)
-##             where m.member_type = "LIST" and m.member_id = @id {
-             sq_save_unique_data(sq, listid);
-##         }
-         }
-       /* now process each one */
-       while (sq_get_data(sq, &id)) {
-           if (glom_internal("LIST", id, action, actarg) == SMS_SUCCESS)
-             found++;
-       }
-       if (glom_internal("STRING", aid, action, actarg) == SMS_SUCCESS)
-         found++;
+       atype = "STRING";
+       direct = 0;
+    }
+    if (!strcmp(atype, "RKERBEROS")) {
+       atype = "KERBEROS";
+       direct = 0;
     }
-
-##  repeat replace tblstats (retrieves = tblstats.retrieves + 1)
-##     where tblstats.#table = "members"
-    sq_destroy(sq);    
-    if (!found) return(SMS_NO_MATCH);
-    return(SMS_SUCCESS);
-##}
-
-
-/* This looks up a single list, user, or string as a member.  atype must be
- * "USER", "LIST", or "STRING" and aid is the ID of the corresponding object.
- * This is used by get_lists_of_members above.
- */
-
-##glom_internal(atype, aid, action, actarg)
-##  char *atype;
-##  int aid;
-    int (*action)();
-    int actarg;
-##{
-    char *rargv[6];
-    int found = 0;
-##  char name[33], active[5], public[5], hidden[5], maillist[5], group[5];
 
     rargv[0] = name;
     rargv[1] = active;
@@ -1889,14 +2059,25 @@ int get_lists_of_member(q, argv, cl, action, actarg)
     rargv[3] = hidden;
     rargv[4] = maillist;
     rargv[5] = group;
-##  repeat retrieve (name = list.#name, active = text(list.#active), 
+    if (direct) {
+##    repeat retrieve (name = list.#name, active = text(list.#active), 
+##                  public = text(list.#public), hidden = text(list.#hidden),
+##                  maillist = text(list.#maillist), group = text(list.#group))
+##             where list.list_id = m.list_id and m.direct = 1 and
+##                   m.member_type = @atype and m.member_id = @aid {
+        (*action)(6, rargv, actarg);
+        found++;
+##    }
+    } else {
+##    repeat retrieve (name = list.#name, active = text(list.#active), 
 ##                  public = text(list.#public), hidden = text(list.#hidden),
 ##                  maillist = text(list.#maillist), group = text(list.#group))
 ##             where list.list_id = m.list_id and
 ##                   m.member_type = @atype and m.member_id = @aid {
         (*action)(6, rargv, actarg);
         found++;
-##  }
+##    }
+    }
 
     if (!found) return(SMS_NO_MATCH);
     return(SMS_SUCCESS);
@@ -1947,10 +2128,10 @@ get_members_of_list(q, argv, cl, action, actarg)
     targv[0] = "USER";
     targv[1] = member_name;
 
-##  range of m is members
+##  range of m is imembers
 ##  repeat retrieve (member_name = users.login)
 ##             where m.#list_id = @list_id and m.member_type = "USER"
-##                   and m.member_id = users.users_id
+##                   and m.member_id = users.users_id and m.direct = 1
 ##             sort by #member_name
 ##  {
         (*action)(2, targv, actarg);
@@ -1959,7 +2140,7 @@ get_members_of_list(q, argv, cl, action, actarg)
     targv[0] = "LIST";
 ##  repeat retrieve (member_name = list.name)
 ##             where m.#list_id = @list_id and m.member_type = "LIST"
-##                   and m.member_id = list.#list_id
+##                   and m.member_id = list.#list_id and m.direct = 1
 ##             sort by #member_name
 ##  {
         (*action)(2, targv, actarg);
@@ -1968,14 +2149,21 @@ get_members_of_list(q, argv, cl, action, actarg)
     targv[0] = "STRING";
 ##  repeat retrieve (member_name = strings.string)
 ##             where m.#list_id = @list_id and m.member_type = "STRING"
-##                   and m.member_id = strings.string_id
+##                   and m.member_id = strings.string_id and m.direct = 1
+##             sort by #member_name
+##  {
+        (*action)(2, targv, actarg);
+##  }
+
+    targv[0] = "KERBEROS";
+##  repeat retrieve (member_name = strings.string)
+##             where m.#list_id = @list_id and m.member_type = "KERBEROS"
+##                   and m.member_id = strings.string_id and m.direct = 1
 ##             sort by #member_name
 ##  {
         (*action)(2, targv, actarg);
 ##  }
 
-##  repeat replace tblstats (retrieves = tblstats.retrieves + 1)
-##     where tblstats.#table = "members"
     return(SMS_SUCCESS);
 ##}
 
@@ -1996,11 +2184,11 @@ int count_members_of_list(q, argv, cl, action, actarg)
 
     list = *(int *)argv[0];
     rargv[0] = countbuf;
-##  repeat retrieve (ct = count(members.list_id where members.list_id = @list))
+##  repeat retrieve (ct = count(imembers.list_id
+##                             where imembers.list_id = @list and
+##                                   imembers.direct = 1))
     sprintf(countbuf, "%d", ct);
     (*action)(1, rargv, actarg);
-##  repeat replace tblstats (retrieves = tblstats.retrieves + 1)
-##     where tblstats.#table = "members"
     return(SMS_SUCCESS);
 ##}
 
@@ -2164,15 +2352,14 @@ register_user(q, argv, cl)
 
     /* check new login name */
 ##  repeat retrieve (flag = any(u.#login where u.#login = @login))
-    if (flag)
-      return(SMS_IN_USE);
+    if (ingres_errno) return(sms_errcode);
+    if (flag) return(SMS_IN_USE);
 ##  repeat retrieve (flag = any(l.#name where l.#name = @login))
-    if (flag)
-      return(SMS_IN_USE);
-##  repeat retrieve (flag = any(filesys.#name where filesys.#name = @login))
-    if (flag)
-      return(SMS_IN_USE);
-    if (ingres_errno != 0) return(ingres_errno);
+    if (ingres_errno) return(sms_errcode);
+    if (flag) return(SMS_IN_USE);
+##  repeat retrieve (flag = any(filesys.#label where filesys.#label = @login))
+    if (ingres_errno) return(sms_errcode);
+    if (flag) return(SMS_IN_USE);
     com_err(whoami, 0, "new login name OK");
 
     /* choose place for pobox, put in mid */
@@ -2180,7 +2367,6 @@ register_user(q, argv, cl)
 ##    where sh.service = "POP" and m.mach_id = sh.mach_id and
 ##     sh.value2 - sh.value1 = max(sh.value2-sh.value1 where sh.service="POP")
 ##  inquire_equel(rowcount = "rowcount");
-    if (ingres_errno != 0) return(ingres_errno);
     if (rowcount == 0)
       return(SMS_NO_POBOX);
 
@@ -2191,7 +2377,6 @@ register_user(q, argv, cl)
 ##                   pmodwith=@entity)
 ##     where u.#users_id = @users_id
 ##  inquire_equel(rowcount = "rowcount");
-    if (ingres_errno != 0) return(ingres_errno);
     if (rowcount != 1)
       return(SMS_INTERNAL);
     set_pop_usage(mid, 1);
@@ -2205,7 +2390,6 @@ register_user(q, argv, cl)
       return(SMS_NO_ID);
 ##  repeat retrieve (list_id = values.value) where values.name = "list_id"
 ##  inquire_equel(rowcount = "rowcount");
-    if (ingres_errno != 0) return(ingres_errno);
     if (rowcount != 1)
       return(SMS_INTERNAL);
 ##  repeat append list (name = @login, #list_id = @list_id, active = 1,
@@ -2215,13 +2399,11 @@ register_user(q, argv, cl)
 ##                     modby = @who, modwith = @entity)
 ##     where values.name = "gid"
 ##  inquire_equel(rowcount = "rowcount");
-    if (ingres_errno != 0) return(ingres_errno);
     if (rowcount != 1)
       return(SMS_INTERNAL);
-##  repeat append members (#list_id = @list_id, member_type = "USER",
-##                        member_id = @users_id)
+##  repeat append imembers (#list_id = @list_id, member_type = "USER",
+##                        member_id = @users_id, ref_count = 1, direct = 1)
 ##  inquire_equel(rowcount = "rowcount");
-    if (ingres_errno != 0) return(ingres_errno);
     if (rowcount != 1)
       return(SMS_INTERNAL);
     com_err(whoami, 0, "group list created");
@@ -2240,7 +2422,6 @@ register_user(q, argv, cl)
            m_id = mid;
        }
 ##  }
-    if (ingres_errno != 0) return(ingres_errno);
     if (maxsize == 0)
       return(SMS_NO_FILESYS);
 
@@ -2257,7 +2438,6 @@ register_user(q, argv, cl)
 ##                        modby = @who, modwith = @entity)
 ##     where values.name = "filsys_id"
 ##  inquire_equel(rowcount = "rowcount");
-    if (ingres_errno != 0) return(ingres_errno);
     if (rowcount != 1)
       return(SMS_INTERNAL);
     com_err(whoami, 0, "filesys created on mach %d in %s/%s", m_id,
@@ -2266,7 +2446,6 @@ register_user(q, argv, cl)
     /* set quota */
 ##  repeat retrieve (quota = values.value) where values.name = "def_quota"
 ##  inquire_equel(rowcount = "rowcount");
-    if (ingres_errno != 0) return(ingres_errno);
     if (rowcount != 1)
       return(SMS_NO_QUOTA);
 ##  repeat append nfsquota (#users_id = @users_id, filsys_id = values.value,
@@ -2274,25 +2453,21 @@ register_user(q, argv, cl)
 ##                         modby = @who, modwith = @entity)
 ##     where values.name = "filsys_id"
 ##  inquire_equel(rowcount = "rowcount");
-    if (ingres_errno != 0) return(ingres_errno);
     if (rowcount != 1)
       return(SMS_INTERNAL);
 ##  repeat replace nfsphys (allocated = nfsphys.allocated + @quota)
 ##     where nfsphys.nfsphys_id = filesys.#phys_id and
 ##           filesys.filsys_id = values.value and values.name = "filsys_id"
 ##  inquire_equel(rowcount = "rowcount");
-    if (ingres_errno != 0) return(ingres_errno);
     if (rowcount != 1)
       return(SMS_INTERNAL);
     com_err(whoami, 0, "quota of %d assigned", quota);
 
 ##  repeat replace tblstats (updates = tblstats.updates + 1, modtime = "now")
 ##     where tblstats.table = "users"
-    if (ingres_errno != 0) return(ingres_errno);
 ##  repeat replace tblstats (appends = tblstats.appends + 1, modtime = "now")
 ##     where tblstats.table = "list" or tblstats.table = "filesys" or
 ##           tblstats.table = "nfsquota"
-    if (ingres_errno != 0) return(ingres_errno);
     return(SMS_SUCCESS);
 ##}
 
@@ -2353,6 +2528,7 @@ validate_row(q, argv, v)
     /* look for the record */
 ##  range of rvar is table
 ##  retrieve (rowcount = count(rvar.name where qual))
+    if (ingres_errno) return(sms_errcode);
     if (rowcount == 0) return(SMS_NO_MATCH);
     if (rowcount > 1) return(SMS_NOT_UNIQUE);
     return(SMS_EXISTS);
@@ -2419,6 +2595,9 @@ validate_fields(q, argv, vo, n)
            status = SMS_EXISTS;
            break;
 
+       case V_LOCK:
+           status = lock_table(vo);
+           break;
        }
 
        if (status != SMS_EXISTS) return(status);
@@ -2483,9 +2662,11 @@ validate_id(argv, vo)
     idfield = vo->idfield;
     if (!strcmp(namefield, "uid")) {
 ##    retrieve (id = table.idfield) where table.namefield = int4(name)
+      if (ingres_errno) return(sms_errcode);
 ##    inquire_equel (rowcount = "rowcount")
     } else {
 ##    retrieve (id = table.idfield) where table.namefield = name
+      if (ingres_errno) return(sms_errcode);
 ##    inquire_equel (rowcount = "rowcount")
     }
     if (rowcount != 1) return(vo->error);
@@ -2513,6 +2694,7 @@ validate_name(argv, vo)
     }
 ##  retrieve (rowcount = countu(table.namefield 
 ##            where table.namefield = name))
+    if (ingres_errno) return(sms_errcode);
     return ((rowcount == 1) ? SMS_EXISTS : vo->error);
 ##}
 
@@ -2556,12 +2738,14 @@ struct valobj *vo;
        if (!strcmp(argv[vo->index], argv[vo->index - 1]))
          return(SMS_EXISTS);
 ##     retrieve (id = any(table.namefield where table.namefield = name))
+       if (ingres_errno) return(sms_errcode);
        if (id)
          return(vo->error);
        else
          return(SMS_EXISTS);
     }
 ##  retrieve (id = table.idfield) where table.namefield = name
+    if (ingres_errno) return(sms_errcode);
     if (id == -1 || id == *(int *)argv[vo->index - 1])
       return(SMS_EXISTS);
     else
@@ -2591,6 +2775,7 @@ validate_type(argv, vo)
 ##  repeat retrieve (exists = any(a.trans where a.name = @typename and
 ##                                   a.type = "TYPE" and
 ##                                   a.trans = @value))
+    if (ingres_errno) return(sms_errcode);
     return (exists ? SMS_EXISTS : vo->error);
 ##}
 
@@ -2618,6 +2803,7 @@ validate_typedata(q, argv, vo)
     /* get corresponding data type associated with field type name */
 ##  repeat retrieve (data_type = alias.trans) 
 ##         where alias.#name = @field_type and alias.type = "TYPEDATA"
+    if (ingres_errno) return(sms_errcode);
 ##  inquire_equel (rowcount = "rowcount")
     if (rowcount != 1) return(SMS_TYPE);
 
@@ -2681,6 +2867,26 @@ validate_typedata(q, argv, vo)
 ##}
 
 
+/* Lock the table named by the validation object */
+
+lock_table(vo)
+struct valobj *vo;
+##{
+##  char *table, *idfield;
+##  int rowcount;
+
+    table = vo->table;
+    idfield = vo->idfield;
+##  replace table (modtime = "now") where table.idfield = 0
+    if (ingres_errno) return(sms_errcode);
+##  inquire_equel (rowcount = "rowcount")
+    if (rowcount != 1)
+      return(vo->error);
+    else
+      return(SMS_EXISTS);
+##}
+
+
 /* This looks up a login name and returns the SMS internal ID.  It is used
  * by authenticate to put the users_id in the client structure.
  */
This page took 0.071631 seconds and 4 git commands to generate.