[1397] in Moira
Re: zephyr.gen shouldn't coredump
daemon@ATHENA.MIT.EDU (Garry Zacheiss)
Tue Mar 7 18:22:30 2000
Date: Tue, 7 Mar 2000 18:22:24 -0500 (EST)
Message-Id: <200003072322.SAA14188@sweet-transvestite.mit.edu>
From: Garry Zacheiss <zacheiss@MIT.EDU>
To: Jonathon Weiss <jweiss@MIT.EDU>
Cc: Garry Zacheiss <zacheiss@MIT.EDU>, moiradev@MIT.EDU
In-Reply-To: "[1395] in Moira"
>> I think that this is a fairly serious error condition and the dcm
>> should fail (gracefully, not core-dumpily) rather than blithely
>> creating acls wiht missing entries. Certainly, the losing the
>> particular string above would make a serious mess out of the acl's
>> installed on the zephyr servers.
Fine. Here's your diff. It likes pumpernickel.
Index: genacl.pc
===================================================================
RCS file: /afs/athena.mit.edu/astaff/project/moiradev/repository//moira/gen/genacl.pc,v
retrieving revision 1.2
diff -c -r1.2 genacl.pc
*** genacl.pc 2000/03/06 21:32:28 1.2
--- genacl.pc 2000/03/07 23:15:29
***************
*** 38,52 ****
krb_get_lrealm(defaultrealm, 1);
}
! void dump_krb_acl(FILE *out, char *type, int id, int vers)
{
struct save_queue *sq;
struct imember *m;
char kbuf[MAX_K_NAME_SZ];
sq = get_acl(type, id, NULL);
while (sq_remove_data(sq, &m))
{
if (m->type != 'S' && m->name != NULL)
{
canon_krb(m, vers, kbuf, sizeof(kbuf));
--- 38,55 ----
krb_get_lrealm(defaultrealm, 1);
}
! int dump_krb_acl(FILE *out, char *type, int id, int vers)
{
struct save_queue *sq;
struct imember *m;
char kbuf[MAX_K_NAME_SZ];
+ int retval = MR_SUCCESS;
sq = get_acl(type, id, NULL);
while (sq_remove_data(sq, &m))
{
+ if (m->name == NULL)
+ retval = MR_DBMS_ERR;
if (m->type != 'S' && m->name != NULL)
{
canon_krb(m, vers, kbuf, sizeof(kbuf));
***************
*** 55,60 ****
--- 58,64 ----
freeimember(m);
}
sq_destroy(sq);
+ return retval;
}
void canon_krb(struct imember *m, int vers, char *buf, int len)
Index: util.h
===================================================================
RCS file: /afs/athena.mit.edu/astaff/project/moiradev/repository//moira/gen/util.h,v
retrieving revision 1.4
diff -c -r1.4 util.h
*** util.h 2000/01/06 21:13:51 1.4
--- util.h 2000/03/07 22:58:25
***************
*** 57,63 ****
void canon_krb(struct imember *m, int vers, char *buf, int len);
struct save_queue *get_acl(char *type, int id,
char *(merge_func)(char *, char *));
! void dump_krb_acl(FILE *out, char *type, int id, int vers);
void dump_user_list(FILE *out, char *type, int id);
char *user_lookup(int users_id);
char *string_lookup(int string_id);
--- 57,63 ----
void canon_krb(struct imember *m, int vers, char *buf, int len);
struct save_queue *get_acl(char *type, int id,
char *(merge_func)(char *, char *));
! int dump_krb_acl(FILE *out, char *type, int id, int vers);
void dump_user_list(FILE *out, char *type, int id);
char *user_lookup(int users_id);
char *string_lookup(int string_id);
Index: zephyr.pc
===================================================================
RCS file: /afs/athena.mit.edu/astaff/project/moiradev/repository//moira/gen/zephyr.pc,v
retrieving revision 1.2
diff -c -r1.2 zephyr.pc
*** zephyr.pc 2000/01/10 23:09:15 1.2
--- zephyr.pc 2000/03/07 23:16:53
***************
*** 23,30 ****
RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository//moira/gen/zephyr.pc,v 1.2 2000/01/10 23:09:15 danw Exp $");
! void do_class(TARFILE *tf, char *class);
! void dump_zacl(FILE *out, char *type, int id);
void sqlerr(void);
char *whoami = "zephyr.gen";
--- 23,30 ----
RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository//moira/gen/zephyr.pc,v 1.2 2000/01/10 23:09:15 danw Exp $");
! int do_class(TARFILE *tf, char *class);
! int dump_zacl(FILE *out, char *type, int id);
void sqlerr(void);
char *whoami = "zephyr.gen";
***************
*** 41,46 ****
--- 41,47 ----
FILE *out;
struct save_queue *sq;
char *class;
+ int retval = MR_SUCCESS;
if (argc != 2)
{
***************
*** 75,81 ****
tarfile_end(tf);
while (sq_remove_data(sq, &class))
! do_class(tf, class);
sq_destroy(sq);
EXEC SQL COMMIT RELEASE;
--- 76,86 ----
tarfile_end(tf);
while (sq_remove_data(sq, &class))
! {
! retval = do_class(tf, class);
! if (retval != MR_SUCCESS)
! return retval;
! }
sq_destroy(sq);
EXEC SQL COMMIT RELEASE;
***************
*** 83,89 ****
exit(MR_SUCCESS);
}
! void do_class(TARFILE *tf, char *class)
{
FILE *out;
char filename[ZEPHYR_CLASS_SIZE + 9];
--- 88,94 ----
exit(MR_SUCCESS);
}
! int do_class(TARFILE *tf, char *class)
{
FILE *out;
char filename[ZEPHYR_CLASS_SIZE + 9];
***************
*** 93,98 ****
--- 98,104 ----
char zutype[ZEPHYR_IUI_TYPE_SIZE];
int zxid, zsid, zwid, zuid;
EXEC SQL END DECLARE SECTION;
+ int retval = MR_SUCCESS;
EXEC SQL SELECT xmt_type, xmt_id, sub_type, sub_id,
iws_type, iws_id, iui_type, iui_id
***************
*** 101,135 ****
FROM zephyr
WHERE class = :zclass;
if (sqlca.sqlcode)
! return;
sprintf(filename, "xmt-%s.acl", class);
out = tarfile_start(tf, filename, 0644, 0, 0, "root", "root", now);
! dump_zacl(out, strtrim(zxtype), zxid);
tarfile_end(tf);
sprintf(filename, "sub-%s.acl", class);
out = tarfile_start(tf, filename, 0644, 0, 0, "root", "root", now);
! dump_zacl(out, strtrim(zstype), zsid);
tarfile_end(tf);
sprintf(filename, "iws-%s.acl", class);
out = tarfile_start(tf, filename, 0644, 0, 0, "root", "root", now);
! dump_zacl(out, strtrim(zwtype), zwid);
tarfile_end(tf);
sprintf(filename, "iui-%s.acl", class);
out = tarfile_start(tf, filename, 0644, 0, 0, "root", "root", now);
! dump_zacl(out, strtrim(zutype), zuid);
tarfile_end(tf);
}
! void dump_zacl(FILE *out, char *type, int id)
{
if (!strcmp(type, "ALL"))
fprintf(out, "*.*@*\n");
else if (strcmp(type, "NONE") != 0)
! dump_krb_acl(out, type, id, 4);
}
void sqlerr(void)
--- 107,154 ----
FROM zephyr
WHERE class = :zclass;
if (sqlca.sqlcode)
! return MR_DBMS_ERR;
sprintf(filename, "xmt-%s.acl", class);
out = tarfile_start(tf, filename, 0644, 0, 0, "root", "root", now);
! retval = dump_zacl(out, strtrim(zxtype), zxid);
! if (retval != MR_SUCCESS)
! return retval;
tarfile_end(tf);
sprintf(filename, "sub-%s.acl", class);
out = tarfile_start(tf, filename, 0644, 0, 0, "root", "root", now);
! retval = dump_zacl(out, strtrim(zstype), zsid);
! if (retval != MR_SUCCESS)
! return retval;
tarfile_end(tf);
sprintf(filename, "iws-%s.acl", class);
out = tarfile_start(tf, filename, 0644, 0, 0, "root", "root", now);
! retval = dump_zacl(out, strtrim(zwtype), zwid);
! if (retval != MR_SUCCESS)
! return retval;
tarfile_end(tf);
sprintf(filename, "iui-%s.acl", class);
out = tarfile_start(tf, filename, 0644, 0, 0, "root", "root", now);
! retval = dump_zacl(out, strtrim(zutype), zuid);
! if (retval != MR_SUCCESS)
! return retval;
tarfile_end(tf);
+
+ return retval;
}
! int dump_zacl(FILE *out, char *type, int id)
{
+ int retval = MR_SUCCESS;
+
if (!strcmp(type, "ALL"))
fprintf(out, "*.*@*\n");
else if (strcmp(type, "NONE") != 0)
! retval = dump_krb_acl(out, type, id, 4);
! return retval;
}
void sqlerr(void)