From d62528e79223e6d9b5de2c9506646ebdc8f9834e Mon Sep 17 00:00:00 2001 From: Stefan Ritt Date: Mon, 28 Jun 2004 20:29:49 +0000 Subject: [PATCH] Rename logbook in groups on logbook rename SVN revision: 928 --- src/elogd.c | 188 +++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 179 insertions(+), 9 deletions(-) diff --git a/src/elogd.c b/src/elogd.c index 92c4e0ff..2909c3ad 100755 --- a/src/elogd.c +++ b/src/elogd.c @@ -6,6 +6,9 @@ Contents: Web server program for Electronic Logbook ELOG $Log$ + Revision 1.361 2004/06/28 20:29:49 midas + Rename logbook in groups on logbook rename + Revision 1.360 2004/06/28 19:35:07 midas Rename logbook directory on logbook rename @@ -502,6 +505,7 @@ void show_top_text(LOGBOOK * lbs); void show_bottom_text(LOGBOOK * lbs); int set_attributes(LOGBOOK * lbs, char attributes[][NAME_LENGTH], int n); void show_elog_list(LOGBOOK * lbs, INT past_n, INT last_n, INT page_n, char *info); +int change_config_line(LOGBOOK * lbs, char *option, char *old_value, char *new_value); /*---- Funcions from the MIDAS library -----------------------------*/ @@ -5356,6 +5360,44 @@ int is_logbook_in_group(LBLIST pgrp, char *logbook) /*------------------------------------------------------------------*/ +void change_logbook_in_group(LOGBOOK *lbs, char *new_name) +{ + int i, j, n, flag; + char str[1000], grpname[256], grpmembers[1000]; + char grplist[MAX_N_LIST][NAME_LENGTH]; + + /* enumerate groups */ + for (i = 0;; i++) { + if (!enumcfg("global", grpname, grpmembers, i)) + break; + + flag = 0; + strlcpy(str, grpname, sizeof(str)); + str[9] = 0; + if (strieq(str, "top group")) + flag = 2; + str[5] = 0; + if (strieq(str, "group")) + flag = 1; + + if (flag) { + + n = strbreak(grpmembers, grplist, MAX_N_LIST, ","); + for (j = 0; j < n; j++) { + if (strieq(lbs->name, grplist[j])) { + if (new_name[0]) { + /* rename logbook */ + change_config_line(lbs, grpname, lbs->name, new_name); + break; + } + } + } + } + } +} + +/*------------------------------------------------------------------*/ + void show_standard_title(char *logbook, char *text, int printable) { char str[256], ref[256], sclass[32]; @@ -7968,6 +8010,131 @@ int save_admin_config(char *section, char *buffer, char *error) /*------------------------------------------------------------------*/ +int change_config_line(LOGBOOK * lbs, char *option, char *old_value, char *new_value) +{ + int fh, i, j, n, length; + char str[NAME_LENGTH], *buf, *buf2, *p1, *p2, *p3; + char list[MAX_N_LIST][NAME_LENGTH], line[NAME_LENGTH]; + + fh = open(config_file, O_RDWR | O_BINARY, 644); + if (fh < 0) { + sprintf(str, loc("Cannot open file %s"), config_file); + strcat(str, ": "); + strcat(str, strerror(errno)); + show_error(str); + return 0; + } + + /* read previous contents */ + length = lseek(fh, 0, SEEK_END); + lseek(fh, 0, SEEK_SET); + buf = malloc(length + strlen(new_value) + 10); + assert(buf); + read(fh, buf, length); + buf[length] = 0; + + /* find location of option */ + p1 = (char *) find_param(buf, lbs->name, option); + if (p1 == NULL) + return 0; + + p2 = strchr(p1, '='); + if (p2 == 0) + return 0; + + p2++; + while (*p2 == ' ' || *p2 == '\t') + p2++; + + strlcpy(line, p2, sizeof(line)); + if (strchr(line, '\r')) + *strchr(line, '\r') = 0; + if (strchr(line, '\n')) + *strchr(line, '\n') = 0; + n = strbreak(line, list, MAX_N_LIST, ","); + + /* save tail */ + p3 = strchr(p2, '\n'); + if (p3 && *(p3 - 1) == '\r') + p3--; + + buf2 = NULL; + if (p3) { + buf2 = malloc(strlen(p3) + 1); + assert(buf2); + strlcpy(buf2, p3, strlen(p3) + 1); + } + + if (old_value[0]) { + for (i = 0; i < n; i++) { + if (strieq(old_value, list[i])) { + if (new_value[0]) { + /* rename value */ + strcpy(list[i], new_value); + } else { + /* delete value */ + for (j=i ; j%s"), config_file); + strcat(str, ": "); + strcat(str, strerror(errno)); + show_error(str); + close(fh); + free(buf); + return 0; + } + +#ifdef _MSC_VER + chsize(fh, TELL(fh)); +#else + ftruncate(fh, TELL(fh)); +#endif + + close(fh); + free(buf); + + /* force re-read of config file */ + check_config(); + + return 1; +} + +/*------------------------------------------------------------------*/ + int delete_logbook(char *logbook, char *error) { int fh, i, length; @@ -8029,7 +8196,7 @@ int delete_logbook(char *logbook, char *error) /*------------------------------------------------------------------*/ -int rename_logbook(char *logbook, char *newname, char *error) +int rename_logbook(LOGBOOK *lbs, char *new_name, char *error) { int fh, i, length; char *buf, *buf2, *p1, *p2; @@ -8046,26 +8213,29 @@ int rename_logbook(char *logbook, char *newname, char *error) } /* rename logbook file */ - if (!getcfg(logbook, "Subdir", str)) { + if (!getcfg(lbs->name, "Subdir", str)) { strlcpy(lb_dir, logbook_dir, sizeof(lb_dir)); if (lb_dir[strlen(lb_dir) - 1] != DIR_SEPARATOR) strlcat(lb_dir, DIR_SEPARATOR_STR, sizeof(lb_dir)); - sprintf(old_dir, "%s%s", lb_dir, logbook); - sprintf(new_dir, "%s%s", lb_dir, newname); + sprintf(old_dir, "%s%s", lb_dir, lbs->name); + sprintf(new_dir, "%s%s", lb_dir, new_name); rename(old_dir, new_dir); } + /* change logbook name in groups */ + change_logbook_in_group(lbs, new_name); + /* read previous contents */ length = lseek(fh, 0, SEEK_END); lseek(fh, 0, SEEK_SET); - buf = malloc(length + strlen(newname) + 10); + buf = malloc(length + strlen(new_name) + 10); assert(buf); read(fh, buf, length); buf[length] = 0; /* find logbook config */ - p1 = (char *) find_section(buf, logbook); + p1 = (char *) find_section(buf, lbs->name); p2 = strchr(p1, ']'); if (p2 == NULL) { close(fh); @@ -8081,9 +8251,9 @@ int rename_logbook(char *logbook, char *newname, char *error) strlcpy(buf2, p2, strlen(p2) + 1); /* replace logbook name */ - sprintf(p1, "[%s]", newname); + sprintf(p1, "[%s]", new_name); - strlcat(p1, buf2, length + strlen(newname) + 1); + strlcat(p1, buf2, length + strlen(new_name) + 1); free(buf2); #ifdef OS_UNIX @@ -9197,7 +9367,7 @@ void show_logbook_rename(LOGBOOK * lbs) /* redirect if confirm = NO */ if (getparam("lbname") && *getparam("lbname")) { - rename_logbook(lbs->name, getparam("lbname"), str); + rename_logbook(lbs, getparam("lbname"), str); if (str[0]) show_error(str); else {