#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))
sprintf(hesiod_dir, "%s/hesiod", DCM_DIR);
#ifsql INGRES
- EXEC SQL CONNECT sms;
+ EXEC SQL CONNECT moira;
+ EXEC SQL SET LOCKMODE SESSION WHERE LEVEL=TABLE, READLOCK=SHARED;
#endsql
#ifsql INFORMIX
- EXEC SQL DATABASE sms;
+ EXEC SQL DATABASE moira;
#endsql
changed = do_passwd();
{
EXEC SQL BEGIN DECLARE SECTION;
int id;
- char name[33];
+ char name[41];
EXEC SQL END DECLARE SECTION;
if (machines)
machines = create_hash(1000);
EXEC SQL DECLARE m_cursor CURSOR FOR
- SELECT NAME, MACH_ID
- FROM MACHINE;
+ SELECT name, mach_id
+ FROM machine
+ WHERE status = 1
+ ORDER BY mach_id;
EXEC SQL OPEN m_cursor;
while (1) {
EXEC SQL FETCH m_cursor INTO :name, :id;
if (sqlca.sqlcode != 0) break;
hash_store(machines, id, strsave(strtrim(name)));
}
- if (sqlca.sqlcode < 0) {
- com_err(whoami, MR_INGRES_ERR, " code %d\n", sqlca.sqlcode);
- critical_alert("DCM", "Hesiod build encountered DATABASE ERROR %d",
- sqlca.sqlcode);
- exit(MR_INGRES_ERR);
- }
+ if (sqlca.sqlcode < 0) db_error(sqlca.sqlcode);
EXEC SQL CLOSE m_cursor;
#ifsql INGRES
+ EXEC SQL COMMIT;
#endsql
#ifsql INFORMIX
EXEC SQL COMMIT WORK;
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) {
EXEC SQL FETCH u_cursor INTO :login, :uid, :shell, :fullname, :nn,
login, shell);
fprintf(uout, "%d.uid\tHS CNAME %s.passwd\n", uid, login);
}
- if (ptype[0] == 'P' && (mach = hash_lookup(machines, pid))) {
+ if (pid != 0 && (mach = hash_lookup(machines, pid))) {
fprintf(bout, "%s.pobox\tHS %s \"POP %s %s\"\n",
login, HTYPE, mach, login);
}
}
- if (sqlca.sqlcode < 0) {
- com_err(whoami, MR_INGRES_ERR, " code %d\n", sqlca.sqlcode);
- critical_alert("DCM", "Hesiod build encountered DATABASE ERROR %d",
- sqlca.sqlcode);
- exit(MR_INGRES_ERR);
- }
+ if (sqlca.sqlcode < 0) db_error(sqlca.sqlcode);
EXEC SQL CLOSE u_cursor;
#ifsql INGRES
+ EXEC SQL COMMIT;
#endsql
#ifsql INFORMIX
EXEC SQL COMMIT WORK;
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 */
/* make space for group list */
groups = create_hash(15001);
+ /* The following WHENEVER is declarative, not executed,
+ * and applies for the remainder of this file only.
+ */
EXEC SQL WHENEVER SQLERROR GOTO sqlerr;
/* get lock records */
EXEC SQL DECLARE l_cursor CURSOR FOR
SELECT name, gid, list_id
- FROM list
- WHERE grp != 0 AND active != 0;
+ FROM list
+ WHERE grouplist != 0 AND active != 0
+ ORDER BY list_id;
EXEC SQL OPEN l_cursor;
while (1) {
EXEC SQL FETCH l_cursor INTO :name, :gid, :lid;
users = create_hash(12001);
EXEC SQL DECLARE u_cursor2 CURSOR FOR
SELECT users_id, login
- FROM users
- WHERE status = 1;
+ FROM users
+ WHERE status = 1
+ ORDER BY users_id;
EXEC SQL OPEN u_cursor2;
while (1) {
EXEC SQL FETCH u_cursor2 INTO :id, :name;
EXEC SQL DECLARE i_cursor CURSOR FOR
SELECT list_id, member_id
- FROM imembers
- WHERE member_type = "USER";
+ FROM imembers
+ WHERE member_type = 'USER'
+ ORDER BY list_id;
EXEC SQL OPEN i_cursor;
while (1) {
EXEC SQL FETCH i_cursor INTO :lid, :id;
}
EXEC SQL CLOSE i_cursor;
#ifsql INGRES
+ EXEC SQL COMMIT;
#endsql
#ifsql INFORMIX
EXEC SQL COMMIT WORK;
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);
}
fix_file(loutf);
return(1);
sqlerr:
- com_err(whoami, MR_INGRES_ERR, " code %d\n", sqlca.sqlcode);
- critical_alert("DCM", "Hesiod build encountered DATABASE ERROR %d",
- sqlca.sqlcode);
- exit(MR_INGRES_ERR);
+ db_error(sqlca.sqlcode);
+ return(0);
}
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];
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
- FROM filesys;
+ FROM filesys
+ ORDER BY filsys_id;
EXEC SQL OPEN f_cursor;
while (1) {
EXEC SQL FETCH f_cursor INTO :name, :type, :loc, :id, :access,
} 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;
SELECT DISTINCT f.type, f.name, f.mach_id, f.access, f.mount,
f.comments, 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;
+ WHERE f.filsys_id = g.filsys_id AND g.group_id = :fid
+ ORDER BY key, label;
EXEC SQL OPEN f_cursor2;
while (1) {
EXEC SQL FETCH f_cursor2 INTO :type, :loc, :id, :access,:mount,
}
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
- WHERE type = "FILESYS";
+ FROM alias
+ WHERE type = 'FILESYS';
EXEC SQL OPEN a_cursor;
while (1) {
EXEC SQL FETCH a_cursor INTO :name, :trans;
}
EXEC SQL CLOSE a_cursor;
#ifsql INGRES
+ EXEC SQL COMMIT;
#endsql
#ifsql INFORMIX
EXEC SQL COMMIT WORK;
fix_file(outf);
return(1);
sqlerr:
- com_err(whoami, MR_INGRES_ERR, " code %d\n", sqlca.sqlcode);
- critical_alert("DCM", "Hesiod build encountered DATABASE ERROR %d",
- sqlca.sqlcode);
- exit(MR_INGRES_ERR);
+ db_error(sqlca.sqlcode);
+ return(0);
}
do_cluster()
{
FILE *out;
- char outf[64], outft[64], *mach, machbuf[33], *p;
+ char outf[64], outft[64], *mach, machbuf[41], *p;
struct stat sb;
time_t ftime;
EXEC SQL BEGIN DECLARE SECTION;
int flag1, flag2, flag3, flag4, maxmach, maxclu, mid, cid, id;
- char name[33], label2[17], data[33];
+ char name[41], label2[17], data[33];
EXEC SQL END DECLARE SECTION;
set_mask **machs, *ms, *ps;
int oneclu;
EXEC SQL DECLARE p_cursor CURSOR FOR
SELECT mach_id, clu_id
- FROM mcmap;
+ FROM mcmap
+ ORDER BY mach_id;
EXEC SQL OPEN p_cursor;
while (1) {
EXEC SQL FETCH p_cursor INTO :mid, :cid;
}
free(machs);
#ifsql INGRES
+ EXEC SQL COMMIT;
#endsql
#ifsql INFORMIX
EXEC SQL COMMIT WORK;
fix_file(outf);
return(1);
sqlerr:
- com_err(whoami, MR_INGRES_ERR, " code %d\n", sqlca.sqlcode);
- critical_alert("DCM", "Hesiod build encountered DATABASE ERROR %d",
- sqlca.sqlcode);
- exit(MR_INGRES_ERR);
+ db_error(sqlca.sqlcode);
+ return(0);
}
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);
}
}
EXEC SQL CLOSE p_cursor2;
#ifsql INGRES
+ EXEC SQL COMMIT;
#endsql
#ifsql INFORMIX
EXEC SQL COMMIT WORK;
fix_file(outf);
return(1);
sqlerr:
- com_err(whoami, MR_INGRES_ERR, " code %d\n", sqlca.sqlcode);
- critical_alert("DCM", "Hesiod build encountered DATABASE ERROR %d",
- sqlca.sqlcode);
- exit(MR_INGRES_ERR);
+ db_error(sqlca.sqlcode);
+ return(0);
}
EXEC SQL DECLARE a_cursor2 CURSOR FOR
SELECT name, trans
FROM alias
- WHERE type = "PALLADIUM";
+ WHERE type = 'PALLADIUM';
EXEC SQL OPEN a_cursor2;
while (1) {
EXEC SQL FETCH a_cursor2 INTO :name, :trans;
}
EXEC SQL CLOSE a_cursor2;
#ifsql INGRES
+ EXEC SQL COMMIT;
#endsql
#ifsql INFORMIX
EXEC SQL COMMIT WORK;
fix_file(outf);
return(1);
sqlerr:
- com_err(whoami, MR_INGRES_ERR, " code %d\n", sqlca.sqlcode);
- critical_alert("DCM", "Hesiod build encountered DATABASE ERROR %d",
- sqlca.sqlcode);
- exit(MR_INGRES_ERR);
+ db_error(sqlca.sqlcode);
+ return(0);
}
}
EXEC SQL CLOSE s_cursor;
#ifsql INGRES
+ EXEC SQL COMMIT;
#endsql
#ifsql INFORMIX
EXEC SQL COMMIT WORK;
fix_file(outf);
return(1);
sqlerr:
- com_err(whoami, MR_INGRES_ERR, " code %d\n", sqlca.sqlcode);
- critical_alert("DCM", "Hesiod build encountered DATABASE ERROR %d",
- sqlca.sqlcode);
- exit(MR_INGRES_ERR);
+ db_error(sqlca.sqlcode);
+ return(0);
}
do_service()
EXEC SQL DECLARE a_cursor3 CURSOR FOR
SELECT name, trans
FROM alias
- WHERE type = "SERVICE";
+ WHERE type = 'SERVICE';
EXEC SQL OPEN a_cursor3;
while (1) {
EXEC SQL FETCH a_cursor3 INTO :service, :altserv;
}
EXEC SQL CLOSE a_cursor3;
#ifsql INGRES
+ EXEC SQL COMMIT;
#endsql
#ifsql INFORMIX
EXEC SQL COMMIT WORK;
fix_file(outf);
return(1);
sqlerr:
- com_err(whoami, MR_INGRES_ERR, " code %d\n", sqlca.sqlcode);
- critical_alert("DCM", "Hesiod build encountered DATABASE ERROR %d",
- sqlca.sqlcode);
- exit(MR_INGRES_ERR);
+ db_error(sqlca.sqlcode);
+ return(0);
}