char *whoami = "nfs.gen";
char *malloc(), *strsave();
char nfs_dir[64];
+struct hash *users, *groups;
+
main(argc, argv)
int argc;
sprintf(nfs_dir, "%s/nfs", 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_nfs();
int do_nfs()
{
EXEC SQL BEGIN DECLARE SECTION;
- char machname[33], listname[33];
+ char machname[41], listname[33];
EXEC SQL END DECLARE SECTION;
struct save_queue *machs, *lists;
int changed;
machs = sq_create();
lists = sq_create();
+ /* The following is declarative, not executed,
+ * and so is dependent on where it is in the file,
+ * not in the order of execution of statements.
+ */
EXEC SQL WHENEVER SQLERROR GOTO sqlerr;
EXEC SQL DECLARE s_cursor CURSOR FOR
SELECT m.name, s.value3
FROM machine m, serverhosts s
- WHERE m.mach_id = s.mach_id AND s.service = "NFS" AND s.enable != 0;
+ WHERE m.mach_id = s.mach_id AND s.service = 'NFS' AND s.enable != 0;
EXEC SQL OPEN s_cursor;
while (1) {
EXEC SQL FETCH s_cursor INTO :machname, :listname;
EXEC SQL CLOSE s_cursor;
changed = do_lists(lists);
+ EXEC SQL COMMIT;
changed += do_machs(machs);
return(changed);
sqlerr:
struct save_queue *lists;
{
char file[64], *u;
- struct hash *users, *do_everyone();
struct stat sb;
FILE *fd;
EXEC SQL BEGIN DECLARE SECTION;
EXEC SQL END DECLARE SECTION;
sprintf(file, "%s/list-", nfs_dir);
+ /*
if (stat(file, &sb) == 0) {
if ((ModDiff (&flag1, "users", sb.st_mtime)) ||
(ModDiff (&flag2, "list", sb.st_mtime)) ||
return(0);
}
}
+ */
/* get locks */
EXEC SQL SELECT modtime INTO :lname FROM list WHERE list_id = 0;
/* build the list of everyone, and store it in a file whose name
* corresponds to the empty list.
*/
- users = do_everyone();
+ do_everyone();
fprintf(stderr, "Building specific lists\n");
/* now do each of the lists used by an NFS server */
SELECT m.member_id
FROM imembers m, list l
WHERE m.list_id=l.list_id AND l.name = :listname AND
- m.member_type="USER";
+ m.member_type='USER'
+ ORDER BY member_id;
EXEC SQL OPEN m_cursor;
while (1) {
EXEC SQL FETCH m_cursor INTO :id;
};
-struct hash *do_everyone()
+do_everyone()
{
char buf[BUFSIZ], *l;
- struct hash *groups, *users;
struct user *u;
struct grp *g;
struct bucket *b, **p;
EXEC SQL DECLARE l_cursor CURSOR FOR
SELECT gid, list_id
FROM list
- WHERE grp <> 0 AND active != 0;
+ WHERE grouplist != 0 AND active != 0
+ ORDER BY list_id;
EXEC SQL OPEN l_cursor;
while (1) {
EXEC SQL FETCH l_cursor INTO :gid, :lid;
EXEC SQL DECLARE u_cursor CURSOR FOR
SELECT users_id, login, uid
FROM users
- WHERE status = 1;
+ WHERE status = 1
+ ORDER BY users_id;
EXEC SQL OPEN u_cursor;
while (1) {
EXEC SQL FETCH u_cursor INTO :id, :name, :uid;
EXEC SQL DECLARE m_cursor2 CURSOR FOR
SELECT list_id, member_id
FROM imembers
- WHERE member_type = "USER";
+ WHERE member_type = 'USER'
+ ORDER BY list_id;
EXEC SQL OPEN m_cursor2;
while (1) {
EXEC SQL FETCH m_cursor2 INTO :lid, :id;
fclose(fd);
free(groups);
- return(users);
+ return(1);
sqlerr:
com_err(whoami, MR_INGRES_ERR, " code %d\n", sqlca.sqlcode);
critical_alert("DCM", "NFS build encountered DATABASE ERROR %d",
/* acquire locks on machines & filesystems */
EXEC SQL SELECT modtime INTO :listname FROM users WHERE users_id = 0;
- EXEC SQL SELECT modtime INTO :listname FROM machine WHERE users_id = 0;
+ EXEC SQL SELECT modtime INTO :listname FROM machine WHERE mach_id = 0;
EXEC SQL SELECT modtime INTO :listname FROM filesys WHERE filsys_id = 0;
machines = create_hash(100);
EXEC SQL SELECT s.value3, m.mach_id
INTO :listname, :id
FROM serverhosts s, machine m
- WHERE s.mach_id = m.mach_id AND m.name = :machname;
+ WHERE s.mach_id = m.mach_id AND m.name = :machname AND
+ s.service = 'NFS';
strtrim(machname);
sprintf(f1, "%s/list-%s", nfs_dir, strtrim(listname));
sprintf(f2, "%s/%s.cred", nfs_dir, machname);
fd = stdin;
EXEC SQL DECLARE q_cursor CURSOR FOR
- SELECT DISTINCT q.quota, u.uid, q.phys_id, n.device, n.mach_id
- FROM quota q, users u, nfsphys n
- WHERE u.users_id = q.entity_id AND n.nfsphys_id = q.phys_id AND
- q.phys_id != 0 AND n.status < 16 AND q.type = "USER"
- ORDER BY mach_id, phys_id, uid;
+ SELECT DISTINCT q.quota, q.entity_id, q.phys_id, n.device, n.mach_id
+ FROM quota q, nfsphys n
+ WHERE n.nfsphys_id = q.phys_id AND q.phys_id != 0 AND
+ n.status < 16 AND q.type = 'USER'
+ ORDER BY n.mach_id, q.phys_id, q.entity_id;
EXEC SQL OPEN q_cursor;
while (1) {
EXEC SQL FETCH q_cursor INTO :quota, :uid, :flag1, :dev, :flag2;
if (sqlca.sqlcode != 0) break;
if (flag1 != olddev || flag2 != oldmach) {
- fclose(fd);
+ if (quotasum)
+ fprintf(fd, "%d %d\n", prevuid, quotasum);
+ if (flag2 == 0 || !hash_lookup(machines, flag2))
+ continue;
+ if (fd != stdin)
+ fclose(fd);
olddev = flag1;
oldmach = flag2;
while (cp = index(dev, '/')) *cp = '@';
quotasum = 0;
}
if (uid != prevuid) {
+ if ((cp = hash_lookup(users, prevuid)) &&
+ (cp = index(cp, ':')))
+ prevuid = atoi(cp+1);
if (quotasum)
fprintf(fd, "%d %d\n", prevuid, quotasum);
prevuid = uid;
}
}
EXEC SQL CLOSE q_cursor;
+ if ((cp = hash_lookup(users, prevuid)) &&
+ (cp = index(cp, ':')))
+ prevuid = atoi(cp+1);
if (quotasum)
fprintf(fd, "%d %d\n", prevuid, quotasum);
if (fd != stdin && fclose(fd) == EOF) {
olddev = oldmach = -1;
fd = stdin;
EXEC SQL DECLARE q_cursor2 CURSOR FOR
- SELECT DISTINCT q.quota, l.gid, q.phys_id, n.device, n.mach_id, n.status
- FROM quota q, list l, nfsphys n
- WHERE l.list_id = q.entity_id AND n.nfsphys_id = q.phys_id AND
- q.phys_id != 0 AND n.status > 15 AND q.type = "GROUP"
- ORDER BY mach_id, phys_id, gid;
+ SELECT DISTINCT q.quota, q.entity_id, q.phys_id, n.device, n.mach_id,
+ n.status
+ FROM quota q, nfsphys n
+ WHERE n.nfsphys_id = q.phys_id AND q.phys_id != 0 AND
+ n.status > 15 AND q.type = 'GROUP'
+ ORDER BY mach_id, phys_id, entity_id;
EXEC SQL OPEN q_cursor2;
while (1) {
EXEC SQL FETCH q_cursor2 INTO :quota, :gid, :flag1, :dev,
:flag2, :flag3;
if (sqlca.sqlcode != 0) break;
if (flag1 != olddev || flag2 != oldmach) {
- fclose(fd);
+ if (quotasum)
+ fprintf(fd, "%d %d\n", prevuid, quotasum);
+ if (flag2 == 0 || !hash_lookup(machines, flag2))
+ continue;
+ if (fd != stdin)
+ fclose(fd);
olddev = flag1;
oldmach = flag2;
while (cp = index(dev, '/')) *cp = '@';
quotasum = 0;
}
if (gid != prevuid) {
+ if (cp = hash_lookup(groups, prevuid))
+ prevuid = atoi(cp + 1);
if (quotasum)
fprintf(fd, "%d %d\n", prevuid, quotasum);
prevuid = gid;
}
}
EXEC SQL CLOSE q_cursor2;
+ if (cp = hash_lookup(groups, prevuid))
+ prevuid = atoi(cp + 1);
if (quotasum)
fprintf(fd, "%d %d\n", prevuid, quotasum);
if (fd != stdin && fclose(fd) == EOF) {
}
olddev = oldmach = -1;
+ fd = stdin;
EXEC SQL DECLARE q_cursor3 CURSOR FOR
SELECT DISTINCT f.name, f.lockertype, u.uid, l.gid, f.phys_id,
WHERE u.users_id = f.owner AND
l.list_id = f.owners AND
f.createflg != 0 AND f.phys_id != 0 AND
- f.type = "NFS" AND
+ f.type = 'NFS' AND
f.phys_id = n.nfsphys_id
ORDER BY mach_id, phys_id;
EXEC SQL OPEN q_cursor3;
:flag2, :dev;
if (sqlca.sqlcode != 0) break;
if (flag1 != olddev || flag2 != oldmach) {
- fclose(fd);
+ if (fd != stdin)
+ fclose(fd);
olddev = flag1;
oldmach = flag2;
while (cp = index(dev, '/')) *cp = '@';