]> andersk Git - moira.git/blobdiff - gen/hesiod.dc
detect ingres error -37000 as a deadlock
[moira.git] / gen / hesiod.dc
index 59a08257a4e74be48b16381a45d459c0d61812ef..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))
@@ -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);
        }
@@ -782,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.034659 seconds and 4 git commands to generate.