]> andersk Git - moira.git/blobdiff - gen/hesiod.pc
EXCHANGE changes.
[moira.git] / gen / hesiod.pc
index f8459f3331f584720149f1a5dc990ded0841bf17..c07fa43ff1341698880d95797390a4f691735669 100644 (file)
@@ -29,7 +29,7 @@ RCSID("$Header$");
 #define HTYPE "TXT"
 #endif
 #ifndef HCLASS
-#define HCLASS "IN"
+#define HCLASS ""
 #endif
 
 #ifndef HESIOD_SUBDIR
@@ -37,9 +37,10 @@ RCSID("$Header$");
 #endif
 
 /* max number of bytes of a data record that can be returned in a hesiod
- * query.  This is 512 - overhead (~66) [derived empirically]
+ * query.  This is 512 - overhead (~78) [derived empirically]
+ * (it used to be 446 with older versions of bind)
  */
-#define MAXHESSIZE 446
+#define MAXHESSIZE 256
 
 char hesiod_dir[MAXPATHLEN];
 
@@ -175,6 +176,8 @@ int valid(char *name)
 
   for (sawdot = 1; *name; name++)
     {
+      if (*name == '$')
+       return 0;
       if (*name == '.')
        {
          if (sawdot)
@@ -194,37 +197,20 @@ int do_passwd(void)
   FILE *pout, *uout, *bout;
   char poutf[MAXPATHLEN], uoutf[MAXPATHLEN], poutft[MAXPATHLEN];
   char uoutft[MAXPATHLEN], boutf[MAXPATHLEN], boutft[MAXPATHLEN];
-  struct stat psb, usb, bsb;
-  time_t ftime;
   struct user *u;
   char *mach;
   EXEC SQL BEGIN DECLARE SECTION;
   char login[USERS_LOGIN_SIZE], shell[USERS_SHELL_SIZE];
   char fullname[USERS_FULLNAME_SIZE], oa[USERS_OFFICE_ADDR_SIZE];
   char op[USERS_OFFICE_PHONE_SIZE], hp[USERS_HOME_PHONE_SIZE];
-  char nn[USERS_NICKNAME_SIZE], ptype[USERS_POTYPE_SIZE];
-  int uid, flag1, flag2, id, pid, status;
+  char nn[USERS_NICKNAME_SIZE], potype[USERS_POTYPE_SIZE];
+  int uid, id, pid, iid, eid, mid, status;
   EXEC SQL END DECLARE SECTION;
 
   sprintf(poutf, "%s/passwd.db", hesiod_dir);
   sprintf(uoutf, "%s/uid.db", hesiod_dir);
   sprintf(boutf, "%s/pobox.db", hesiod_dir);
 
-  if (stat(poutf, &psb) == 0 && stat(uoutf, &usb) == 0 &&
-      stat(boutf, &bsb) == 0)
-    {
-      ftime = min(min(psb.st_mtime, usb.st_mtime), bsb.st_mtime);
-      if (ModDiff (&flag1, "users", ftime) ||
-         ModDiff (&flag2, "machine", ftime))
-       exit(MR_DATE);
-      if (flag1 < 0 && flag2 < 0)
-       {
-         fprintf(stderr, "Files passwd.db, uid.db, and pobox.db "
-                 "do not need to be rebuilt.\n");
-         return 0;
-       }
-    }
-
   sprintf(poutft, "%s~", poutf);
   pout = fopen(poutft, "w");
   if (!pout)
@@ -253,7 +239,8 @@ int do_passwd(void)
   users = create_hash(12001);
   EXEC SQL DECLARE u_cursor CURSOR FOR
     SELECT login, unix_uid, shell, fullname, nickname, office_addr,
-    office_phone, home_phone, users_id, pop_id, potype, status
+    office_phone, home_phone, users_id, potype, pop_id, imap_id, exchange_id,
+    status
     FROM users
     WHERE status = 1 OR status = 2 OR status = 5 OR status = 6
     ORDER BY users_id;
@@ -261,7 +248,7 @@ int do_passwd(void)
   while (1)
     {
       EXEC SQL FETCH u_cursor INTO :login, :uid, :shell, :fullname, :nn,
-       :oa, :op, :hp, :id, :pid, :ptype, :status;
+       :oa, :op, :hp, :id, :potype, :pid, :iid, :eid, :status;
       if (sqlca.sqlcode)
        break;
       strtrim(login);
@@ -271,18 +258,40 @@ int do_passwd(void)
       dequote(op);
       dequote(hp);
       dequote(shell);
+      dequote(potype);
       u = malloc(sizeof(struct user));
       strcpy(u->name, login);
       u->lists = NULL;
       hash_store(users, id, u);
-      if (status == 1)
+      if (status == 1 || status == 2)
        {
          fprintf(pout, "%s.passwd\t%s %s \"%s:*:%d:101:%s,%s,%s,%s,%s:/mit/%s:%s\"\n",
                  login, HCLASS, HTYPE, login, uid, fullname, nn, oa,
                  op, hp, login, shell);
          fprintf(uout, "%d.uid\t%s CNAME %s.passwd\n", uid, HCLASS, login);
        }
-      if (pid != 0 && (mach = hash_lookup(machines, pid)))
+
+      if (eid != 0)
+       {
+         /* eid will be for EXCHANGE.MIT.EDU, but we need to convert it to
+          * IMAP.EXCHANGE.MIT.EDU.
+          */
+         EXEC SQL SELECT mach_id INTO :eid FROM machine WHERE
+           name = 'IMAP.EXCHANGE.MIT.EDU';
+         if (sqlca.sqlcode == 0)
+             pid = eid;
+       }
+
+      if (iid != 0)
+       {
+         EXEC SQL SELECT mach_id INTO :mid FROM filesys
+           WHERE filsys_id = :iid AND type = 'IMAP';
+         if (sqlca.sqlcode == 0)
+           pid = mid;
+       }
+
+      if ((strcmp(potype, "NONE") != 0) &&  pid != 0 &&
+         (mach = hash_lookup(machines, pid)))
        {
          fprintf(bout, "%s.pobox\t%s %s \"POP %s %s\"\n",
                  login, HCLASS, HTYPE, mach, login);
@@ -314,11 +323,9 @@ int do_groups(void)
   struct bucket *b, **p;
   struct grp *g;
   struct user *u;
-  struct stat isb, gsb, lsb;
-  time_t ftime;
   EXEC SQL BEGIN DECLARE SECTION;
   char name[LIST_NAME_SIZE];
-  int gid, id, lid, flag1, flag2, flag3, len;
+  int gid, id, lid, len;
   EXEC SQL END DECLARE SECTION;
 
   /* open files */
@@ -326,22 +333,6 @@ int do_groups(void)
   sprintf(goutf, "%s/group.db", hesiod_dir);
   sprintf(loutf, "%s/grplist.db", hesiod_dir);
 
-  if (stat(ioutf, &isb) == 0 && stat(goutf, &gsb) == 0 &&
-      stat(loutf, &lsb) == 0)
-    {
-      ftime = min(isb.st_mtime, min(gsb.st_mtime, lsb.st_mtime));
-      if (ModDiff (&flag1, "users", ftime) ||
-         ModDiff (&flag2, "list", ftime) ||
-         ModDiff (&flag3, "imembers", ftime))
-       exit(MR_DATE);
-      if (flag1 < 0 && flag2 < 0 && flag3 < 0)
-       {
-         fprintf(stderr, "Files gid.db, group.db and grplist.db "
-                 "do not need to be rebuilt.\n");
-         return 0;
-       }
-    }
-
   sprintf(buf, "%s~", ioutf);
   iout = fopen(buf, "w");
   if (!iout)
@@ -408,8 +399,7 @@ int do_groups(void)
       EXEC SQL DECLARE u_cursor2 CURSOR FOR
        SELECT users_id, login
        FROM users
-       WHERE status = 1 OR status = 2
-       ORDER BY users_id;
+       WHERE status = 1 OR status = 2;
       EXEC SQL OPEN u_cursor2;
       while (1)
        {
@@ -425,10 +415,10 @@ int do_groups(void)
     }
 
   EXEC SQL DECLARE i_cursor CURSOR FOR
-    SELECT list_id, member_id
-    FROM imembers
-    WHERE member_type = 'USER'
-    ORDER BY list_id;
+    SELECT m.list_id, m.member_id
+    FROM imembers m, list l 
+    WHERE m.member_type = 'USER'
+    AND m.list_id = l.list_id AND l.grouplist = 1 AND l.nfsgroup = 1;
   EXEC SQL OPEN i_cursor;
   while (1)
     {
@@ -495,8 +485,6 @@ int do_filsys(void)
 {
   FILE *out;
   char outf[MAXPATHLEN], outft[MAXPATHLEN], *mach, *group;
-  struct stat sb;
-  time_t ftime;
   struct save_queue *sq, *sq2;
   EXEC SQL BEGIN DECLARE SECTION;
   char name[FILESYS_LABEL_SIZE], type[FILESYS_TYPE_SIZE];
@@ -504,31 +492,11 @@ int do_filsys(void)
   char mount[FILESYS_MOUNT_SIZE], comments[FILESYS_COMMENTS_SIZE];
   char key[FSGROUP_KEY_SIZE];
   char aname[ALIAS_NAME_SIZE], trans[ALIAS_TRANS_SIZE];
-  int flag1, flag2, flag3, flag4, id, fid;
+  int flag, id, fid;
   EXEC SQL END DECLARE SECTION;
 
   sprintf(outf, "%s/filsys.db", hesiod_dir);
 
-  if (stat(outf, &sb) == 0)
-    {
-      ftime = sb.st_mtime;
-
-      if (ModDiff(&flag1, "filesys", ftime))
-       exit(MR_DATE);
-      if (ModDiff(&flag2, "machine", ftime))
-       exit(MR_DATE);
-      if (ModDiff(&flag3, "alias", ftime))
-       exit(MR_DATE);
-      if (ModDiff(&flag4, "fsgroup", ftime))
-       exit(MR_DATE);
-
-      if (flag1 < 0 && flag2 < 0 && flag3 < 0 && flag4 < 0)
-       {
-         fprintf(stderr, "File filsys.db does not need to be rebuilt.\n");
-         return 0;
-       }
-    }
-
   sprintf(outft, "%s~", outf);
   out = fopen(outft, "w");
   if (!out)
@@ -604,7 +572,7 @@ int do_filsys(void)
        WHERE f.filsys_id = g.filsys_id AND g.group_id = :fid
        ORDER BY key, label;
       EXEC SQL OPEN f_cursor2;
-      for (flag1 = 1; ; flag1++)
+      for (flag = 1; ; flag++)
        {
          EXEC SQL FETCH f_cursor2 INTO :type, :loc, :id, :access, :mount,
            :comments, :name, :key;
@@ -617,14 +585,14 @@ int do_filsys(void)
                {
                  fprintf(out, "%s.filsys\t%s %s \"%s %s %s %s %s %d\"\n",
                          group, HCLASS, HTYPE, type, strtrim(loc), mach,
-                         strtrim(access), strtrim(mount), flag1);
+                         strtrim(access), strtrim(mount), flag);
                }
            }
          else if (!strcmp(type, "AFS"))
            {
              fprintf(out, "%s.filsys\t%s %s \"AFS %s %s %s %d\"\n",
                      group, HCLASS, HTYPE, strtrim(loc), strtrim(access),
-                     strtrim(mount), flag1);
+                     strtrim(mount), flag);
            }
          else if (!strcmp(type, "ERR"))
            {
@@ -712,10 +680,8 @@ int do_cluster(void)
   FILE *out;
   char outf[MAXPATHLEN], outft[MAXPATHLEN], *mach;
   char machbuf[MACHINE_NAME_SIZE], clubuf[CLUSTERS_NAME_SIZE], *p;
-  struct stat sb;
-  time_t ftime;
   EXEC SQL BEGIN DECLARE SECTION;
-  int flag1, flag2, flag3, flag4, maxmach, maxclu, mid, cid, id;
+  int maxmach, maxclu, mid, cid, id;
   char name[CLUSTERS_NAME_SIZE];
   char label[SVC_SERV_LABEL_SIZE], data[SVC_SERV_CLUSTER_SIZE];
   EXEC SQL END DECLARE SECTION;
@@ -723,21 +689,6 @@ int do_cluster(void)
 
   sprintf(outf, "%s/cluster.db", hesiod_dir);
 
-  if (stat(outf, &sb) == 0)
-    {
-      ftime = sb.st_mtime;
-      if (ModDiff (&flag1, "clusters", ftime)
-         || ModDiff (&flag2, "machine", ftime)
-         || ModDiff (&flag3, "mcmap", ftime)
-         || ModDiff (&flag4, "svc", ftime))
-       exit(MR_DATE);
-      if (flag1 < 0 && flag2 < 0 && flag3 < 0 && flag4 < 0)
-       {
-         fprintf(stderr, "File cluster.db does not need to be rebuilt.\n");
-         return 0;
-       }
-    }
-
   sprintf(outft, "%s~", outf);
   out = fopen(outft, "w");
   if (!out)
@@ -897,31 +848,16 @@ int do_printcap(void)
 {
   FILE *out;
   char outf[MAXPATHLEN], outft[MAXPATHLEN];
-  struct stat sb;
-  time_t ftime;
   EXEC SQL BEGIN DECLARE SECTION;
   char name[PRINTERS_NAME_SIZE], duplexname[PRINTERS_DUPLEXNAME_SIZE];
   char rp[PRINTERS_RP_SIZE], type[PRINTERS_TYPE_SIZE];
-  char duplexrp[PRINTERS_RP_SIZE];
-  int flag1, flag2, ka, pc, rm, rq;
+  char duplexrp[PRINTERS_RP_SIZE], pskind[PRINTSERVERS_KIND_SIZE];
+  int ka, rm, mc;
   EXEC SQL END DECLARE SECTION;
-  char *rmname, *rqname;
+  char *rmname;
 
   sprintf(outf, "%s/printcap.db", hesiod_dir);
 
-  if (stat(outf, &sb) == 0)
-    {
-      ftime = sb.st_mtime;
-      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;
-       }
-    }
-
   sprintf(outft, "%s~", outf);
   out = fopen(outft, "w");
   if (!out)
@@ -934,28 +870,37 @@ int do_printcap(void)
   get_mach();
 
   EXEC SQL DECLARE p_cursor2 CURSOR FOR
-    SELECT name, duplexname, type, rp, rm, ka, pc, rq
-    FROM printers;
+    SELECT p.name, p.duplexname, p.type, p.rp, p.rm, p.ka, p.mc, ps.kind
+    FROM printers p, printservers ps
+    WHERE p.rm = ps.mach_id;
   EXEC SQL OPEN p_cursor2;
   while (1)
     {
       EXEC SQL FETCH p_cursor2 INTO :name, :duplexname, :type,
-       :rp, :rm, :ka, :pc, :rq;
+       :rp, :rm, :ka, :mc, :pskind;
       if (sqlca.sqlcode)
        break;
       if (!(rmname = hash_lookup(machines, rm)))
        continue;
-      rqname = rq ? hash_lookup(machines, rq) : NULL;
       strtrim(name);
       if (!valid(name))
        continue;
       strtrim(rp);
-      fprintf(out, "%s.pcap\t%s %s \"%s:rp=%s:rm=%s:ka#%d:pc#%d",
-             name, HCLASS, HTYPE, name, rp, rmname, ka, pc);
-      if (rqname)
-       fprintf(out, ":rq=%s\"\n", rqname);
-      else
-       fputs("\"\n", out);
+      fprintf(out, "%s.pcap\t%s %s \"%s:rp=%s:rm=%s:ka#%d:mc#%d:",
+             name, HCLASS, HTYPE, name, rp, rmname, ka, mc);
+
+      strtrim(pskind);
+      if (!strcmp(pskind, "BSD"))
+       fprintf(out, "auth=none:remote_support=RQM:");
+      else if (!strcmp(pskind, "ATHENA"))
+       {
+         fprintf(out, "auth=%s:az:remote_support=RQM:",
+                 ka ? "kerberos4" : "none");
+       }
+      else if (!strcmp(pskind, "LPRNG"))
+       fprintf(out, "auth=kerberos5:xn:");
+
+      fputs("\"\n", out);
 
       strtrim(duplexname);
       if (!valid(duplexname))
@@ -968,13 +913,21 @@ int do_printcap(void)
        }
       else
        strcpy(duplexrp, duplexname);
-      fprintf(out, "%s.pcap\t%s %s \"%s:rp=%s:rm=%s:ka#%d:pc#%d",
+      fprintf(out, "%s.pcap\t%s %s \"%s:rp=%s:rm=%s:ka#%d:mc#%d:",
              duplexname, HCLASS, HTYPE, duplexname, duplexrp,
-             rmname, ka, pc);
-      if (rqname)
-       fprintf(out, ":rq=%s\"\n", rqname);
-      else
-       fputs("\"\n", out);
+             rmname, ka, mc);
+
+      if (!strcmp(pskind, "BSD"))
+       fprintf(out, "auth=none:remote_support=RQM:");
+      else if (!strcmp(pskind, "ATHENA"))
+       {
+         fprintf(out, "auth=%s:az:remote_support=RQM:",
+                 ka ? "kerberos4" : "none");
+       }
+      else if (!strcmp(pskind, "LPRNG"))
+       fprintf(out, "auth=kerberos5:xn:");
+
+      fputs("\"\n", out);
     }
   EXEC SQL CLOSE p_cursor2;
 
@@ -997,28 +950,13 @@ int do_sloc(void)
 {
   FILE *out;
   char outf[MAXPATHLEN], outft[MAXPATHLEN], *mach;
-  struct stat sb;
-  time_t ftime;
   EXEC SQL BEGIN DECLARE SECTION;
   char service[SERVERHOSTS_SERVICE_SIZE];
-  int flag1, flag2, id;
+  int id;
   EXEC SQL END DECLARE SECTION;
 
   sprintf(outf, "%s/sloc.db", hesiod_dir);
 
-  if (stat(outf, &sb) == 0)
-    {
-      ftime = sb.st_mtime;
-      if ((ModDiff (&flag1, "serverhosts", ftime)) ||
-         (ModDiff (&flag2, "machine", ftime)))
-       exit(MR_DATE);
-      if (flag1 < 0 && flag2 < 0)
-       {
-         fprintf(stderr, "File sloc.db does not need to be rebuilt.\n");
-         return 0;
-       }
-    }
-
   sprintf(outft, "%s~", outf);
   out = fopen(outft, "w");
   if (!out)
@@ -1065,28 +1003,14 @@ int do_service(void)
 {
   FILE *out;
   char outf[MAXPATHLEN], outft[MAXPATHLEN];
-  struct stat sb;
-  time_t ftime;
   EXEC SQL BEGIN DECLARE SECTION;
   char service[SERVICES_NAME_SIZE], protocol[SERVICES_PROTOCOL_SIZE];
   char aname[ALIAS_NAME_SIZE], trans[ALIAS_TRANS_SIZE];
-  int port, flag1;
+  int port;
   EXEC SQL END DECLARE SECTION;
 
   sprintf(outf, "%s/service.db", hesiod_dir);
 
-  if (stat(outf, &sb) == 0)
-    {
-      ftime = sb.st_mtime;
-      if (ModDiff (&flag1, "services", ftime))
-       exit(MR_DATE);
-      if (flag1 < 0)
-       {
-         fprintf(stderr, "File service.db does not need to be rebuilt.\n");
-         return 0;
-       }
-    }
-
   sprintf(outft, "%s~", outf);
   out = fopen(outft, "w");
   if (!out)
This page took 0.054721 seconds and 4 git commands to generate.