From d5fcb4f76551ba8e91f38ce6b9b0c2237b1fa1e7 Mon Sep 17 00:00:00 2001 From: Stefan Ritt Date: Wed, 5 Jan 2005 20:36:49 +0000 Subject: [PATCH] Logbook hierarchy can now be deeper than two levels SVN revision: 1165 --- src/elogd.c | 71 ++++++++++++++++++++++++++++++++--------------------- 1 file changed, 43 insertions(+), 28 deletions(-) diff --git a/src/elogd.c b/src/elogd.c index 14a1821d..58a9a86d 100755 --- a/src/elogd.c +++ b/src/elogd.c @@ -6,6 +6,9 @@ Contents: Web server program for Electronic Logbook ELOG $Log$ + Revision 1.532 2005/01/05 20:36:49 midas + Logbook hierarchy can now be deeper than two levels + Revision 1.531 2005/01/05 15:56:10 midas Cancel button on 'create new logbook' now also works without password files @@ -1081,7 +1084,7 @@ char *getparam(char *param); void write_logfile(LOGBOOK * lbs, const char *format, ...); BOOL check_login_user(LOGBOOK * lbs, char *user); LBLIST get_logbook_hierarchy(void); -int is_logbook_in_group(LBLIST pgrp, char *logbook); +BOOL is_logbook_in_group(LBLIST pgrp, char *logbook); BOOL is_admin_user(char *logbook, char *user); BOOL is_admin_user_global(char *user); void free_logbook_hierarchy(LBLIST root); @@ -6241,11 +6244,31 @@ void show_upgrade_page(LOGBOOK * lbs) /*------------------------------------------------------------------*/ +LBLIST *get_subgroup(LBLIST pgrp, char *logbook) +/* retrieve parent of group member "logbook" (which might be group by itself) */ +{ + int i; + + for (i = 0; i < pgrp->n_members; i++) { + /* check if logbook is current member */ + if (strieq(logbook, pgrp->member[i]->name)) + return &(pgrp->member[i]); + + /* check if logbook is in subgroup of current member */ + if (pgrp->member[i]->n_members > 0 && get_subgroup(pgrp->member[i], logbook)) + return get_subgroup(pgrp->member[i], logbook); + } + + return NULL; +} + +/*------------------------------------------------------------------*/ + LBLIST get_logbook_hierarchy(void) { - int i, j, k, n, m, flag; + int i, j, n, m, flag; char str[1000], grpname[256], grpmembers[1000]; - LBLIST root; + LBLIST root, *pgrp; char grplist[MAX_N_LIST][NAME_LENGTH]; /* allocate root node */ @@ -6269,8 +6292,6 @@ LBLIST get_logbook_hierarchy(void) if (flag) { - printf("Found group %s\n", grpname); - /* allocate new node, increase member pointer array by one */ if (n == 0) root->member = xmalloc(sizeof(void *)); @@ -6306,27 +6327,21 @@ LBLIST get_logbook_hierarchy(void) /* populate nodes with logbooks or other groups */ for (i = 0; i < root->n_members; i++) if (root->member[i]) { - for (j = 0; j < root->member[i]->n_members; j++) { - /* check if node is valid logbook */ - for (k = 0; lb_list[k].name[0]; k++) - if (strieq(root->member[i]->member[j]->name, lb_list[k].name)) - break; - /* check if node is subgroup of other node */ - if (!lb_list[k].name[0]) { - for (k = 0; k < root->n_members; k++) - if (strieq(root->member[i]->member[j]->name, root->member[k]->name)) { + for (j = 0; j < root->n_members; j++) { + if (i != j && root->member[j] != NULL && + (pgrp = get_subgroup(root->member[j], root->member[i]->name)) != NULL) { - /* node is allocated twice, so free one... */ - xfree(root->member[i]->member[j]); + /* node is allocated twice, so free one...*/ + xfree(*pgrp); - /* ... and reference the other */ - root->member[i]->member[j] = root->member[k]; + /* ... and reference the other */ + *pgrp = root->member[i]; - /* mark original pointer invalid */ - root->member[k] = NULL; - break; - } + /* mark original pointer invalid */ + root->member[i] = NULL; + + break; } } } @@ -6385,23 +6400,23 @@ void free_logbook_hierarchy(LBLIST root) /*------------------------------------------------------------------*/ -int is_logbook_in_group(LBLIST pgrp, char *logbook) +BOOL is_logbook_in_group(LBLIST pgrp, char *logbook) /* test if "logbook" is in group node plb */ { int i; - if (strieq(pgrp->name, logbook)) - return 1; + if (strieq(logbook, pgrp->name)) + return TRUE; for (i = 0; i < pgrp->n_members; i++) { if (strieq(logbook, pgrp->member[i]->name)) - return 1; + return TRUE; if (pgrp->member[i]->n_members > 0 && is_logbook_in_group(pgrp->member[i], logbook)) - return 1; + return TRUE; } - return 0; + return FALSE; } /*------------------------------------------------------------------*/