]> andersk Git - moira.git/blobdiff - gen/hesiod.dc
detect ingres error -37000 as a deadlock
[moira.git] / gen / hesiod.dc
index 68aacfae0c49e19e8d1d7fba05a3a95ef63e194d..13c8bf079ea3157aa6b93ecdbbd4d0f512f9b825 100644 (file)
@@ -26,6 +26,11 @@ EXEC SQL INCLUDE sqlca;
 #define HTYPE "TXT"
 #endif
 
+/* max number of bytes of a data record that can be returned in a hesiod 
+ * query.  This is 512 - overhead (~66) [derived empirically]
+ */
+#define MAXHESSIZE 446
+
 char hesiod_dir[64];
 
 #define min(x,y)       ((x) < (y) ? (x) : (y))
@@ -197,7 +202,7 @@ do_passwd()
       SELECT login, uid, shell, fullname, nickname, office_addr,
             office_phone, home_phone, users_id, pop_id, potype, status
       FROM users
-      WHERE status = 1 or status = 6
+      WHERE status = 1 or status = 5 or status = 6
       ORDER BY users_id;
     EXEC SQL OPEN u_cursor;
     while (1) {
@@ -263,7 +268,7 @@ do_groups()
     time_t ftime;
     EXEC SQL BEGIN DECLARE SECTION;
     char name[33];
-    int gid, id, lid, flag1, flag2, flag3;
+    int gid, id, lid, flag1, flag2, flag3, len;
     EXEC SQL END DECLARE SECTION;
 
     /* open files */
@@ -388,10 +393,18 @@ do_groups()
              continue;
            fprintf(lout, "%s.grplist\tHS %s \"",
                    ((struct user *)b->data)->name, HTYPE);
+           len = 0;
            for (; g; g = g->next) {
-               fputs(g->lid, lout);
-               if (g->next)
-                 putc(':', lout);
+               if (len + strlen(g->lid) + 1 < MAXHESSIZE) {
+                   fputs(g->lid, lout);
+                   if (g->next)
+                     putc(':', lout);
+                   len += strlen(g->lid) + 1;
+               } else {
+                   com_err(whoami, 0, "truncated grp list for user %s",
+                           ((struct user *)b->data)->name);
+                   break;
+               }
            }
            fputs("\"\n", lout);
        }
@@ -420,7 +433,7 @@ do_filsys()
     register char *p;
     struct stat sb;
     time_t ftime;
-    struct save_queue *sq, *sq_create();
+    struct save_queue *sq, *sq2, *sq_create();
     EXEC SQL BEGIN DECLARE SECTION;
     char name[33], type[9], loc[81], access[2], mount[33], trans[257];
     char comments[65];
@@ -454,6 +467,7 @@ do_filsys()
     fprintf(stderr, "Building filsys.db\n");
     get_mach();
     sq = sq_create();
+    sq2 = sq_create();
 
     EXEC SQL DECLARE f_cursor CURSOR FOR
       SELECT label, type, name, mach_id, access, mount, comments, filsys_id
@@ -481,6 +495,9 @@ do_filsys()
        } else if (!strcmp(type, "FSGROUP")) {
            sprintf(trans, "%s:%d", strtrim(name), fid);
            sq_save_data(sq, strsave(trans));
+       } else if (!strcmp(type, "MUL")) {
+           sprintf(trans, "%s:%d", strtrim(name), fid);
+           sq_save_data(sq2, strsave(trans));
        }
     }
     EXEC SQL CLOSE f_cursor;
@@ -521,6 +538,27 @@ do_filsys()
     }
     sq_destroy(sq);
 
+    while (sq_get_data(sq2, &group)) {
+        fid = atoi(index(group, ':') + 1);
+        *index(group, ':') = 0;
+        fprintf(out, "%s.filsys\tHS %s \"MUL", group, HTYPE);
+       EXEC SQL DECLARE f_cursor3 CURSOR FOR
+           SELECT DISTINCT f.label, g.key
+           FROM filesys f, fsgroup g
+           WHERE f.filsys_id = g.filsys_id AND g.group_id = :fid
+           ORDER BY key, label;
+       EXEC SQL OPEN f_cursor3;
+       while (1) {
+           EXEC SQL FETCH f_cursor3 INTO :name, :trans;
+           if (sqlca.sqlcode != 0) break;
+            fprintf(out, " %s", strtrim(name));
+       }
+       EXEC SQL CLOSE f_cursor3;
+        fprintf(out, "\"\n");
+        free(group);
+    }
+    sq_destroy(sq2);
+
     EXEC SQL DECLARE a_cursor CURSOR FOR
       SELECT name, trans
       FROM alias
@@ -757,15 +795,17 @@ do_printcap()
     time_t ftime;
     EXEC SQL BEGIN DECLARE SECTION;
     char name[17], rp[17], sd[33];
-    int flag, ka, pc, rm, rq;
+    int flag1, flag2, ka, pc, rm, rq;
     EXEC SQL END DECLARE SECTION;
 
     sprintf(outf, "%s/printcap.db", hesiod_dir);
 
     if (stat(outf, &sb) == 0) {
        ftime = sb.st_mtime;
-       if (ModDiff (&flag, "printcap", ftime)) exit (MR_DATE);
-       if (flag < 0) {
+       if (ModDiff (&flag1, "printcap", ftime)
+           || ModDiff (&flag2, "machine", ftime))
+         exit (MR_DATE);
+       if (flag1 < 0 && flag2 < 0) {
            fprintf(stderr, "File printcap.db does not need to be rebuilt.\n");
            return(0);
       }
This page took 0.034294 seconds and 4 git commands to generate.