Changeset: 015bdc204c26 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=015bdc204c26 Modified Files: monetdb5/modules/mal/wlc.c tools/merovingian/client/monetdb.c tools/merovingian/daemon/argvcmds.c tools/merovingian/daemon/forkmserver.c tools/merovingian/utils/utils.c Branch: default Log Message:
Merge with Nov2019 branch. diffs (261 lines): diff --git a/tools/merovingian/client/monetdb.c b/tools/merovingian/client/monetdb.c --- a/tools/merovingian/client/monetdb.c +++ b/tools/merovingian/client/monetdb.c @@ -213,6 +213,7 @@ MEROgetStatus(sabdb **ret, char *databas char *p; char *buf; char *e; + char *sp; if (database == NULL) database = "#all"; @@ -224,14 +225,14 @@ MEROgetStatus(sabdb **ret, char *databas sw = malloc(sizeof(sabdb *) * swlen); orig = NULL; - if ((p = strtok(buf, "\n")) != NULL) { + if ((p = strtok_r(buf, "\n", &sp)) != NULL) { if (strcmp(p, "OK") != 0) { p = strdup(p); free(buf); free(sw); return(p); } - for (swpos = 0; (p = strtok(NULL, "\n")) != NULL; swpos++) { + for (swpos = 0; (p = strtok_r(NULL, "\n", &sp)) != NULL; swpos++) { e = msab_deserialise(&stats, p); if (e != NULL) { printf("WARNING: failed to parse response from " @@ -898,6 +899,7 @@ command_discover(int argc, char *argv[]) size_t posloc = 0; size_t loclen = 0; char **locations = malloc(sizeof(char*) * numlocs); + char *sp; if (argc == 0) { exit(2); @@ -921,14 +923,14 @@ command_discover(int argc, char *argv[]) exit(2); } - if ((p = strtok(buf, "\n")) != NULL) { + if ((p = strtok_r(buf, "\n", &sp)) != NULL) { if (strcmp(p, "OK") != 0) { fprintf(stderr, "%s: %s\n", argv[0], p); exit(1); } if (twidth > 0) location = malloc(twidth + 1); - while ((p = strtok(NULL, "\n")) != NULL) { + while ((p = strtok_r(NULL, "\n", &sp)) != NULL) { if ((q = strchr(p, '\t')) == NULL) { /* doesn't look correct */ printf("%s: WARNING: discarding incorrect line: %s\n", @@ -1376,9 +1378,10 @@ command_get(int argc, char *argv[]) } else { /* check validity of properties before printing them */ if (stats == orig) { + char *sp; snprintf(vbuf, sizeof(vbuf), "%s", property); buf = vbuf; - while ((p = strtok(buf, ",")) != NULL) { + while ((p = strtok_r(buf, ",", &sp)) != NULL) { buf = NULL; if (strcmp(p, "name") == 0) continue; @@ -1394,7 +1397,8 @@ command_get(int argc, char *argv[]) if (stats == orig) printf(" name prop source value\n"); - while ((p = strtok(buf, ",")) != NULL) { + char *sp; + while ((p = strtok_r(buf, ",", &sp)) != NULL) { buf = NULL; /* filter properties based on object type */ diff --git a/tools/merovingian/daemon/argvcmds.c b/tools/merovingian/daemon/argvcmds.c --- a/tools/merovingian/daemon/argvcmds.c +++ b/tools/merovingian/daemon/argvcmds.c @@ -209,7 +209,8 @@ command_get(confkeyval *ckv, int argc, c } printf(" property value\n"); - while ((p = strtok(property, ",")) != NULL) { + char *sp; + while ((p = strtok_r(property, ",", &sp)) != NULL) { property = NULL; if (strcmp(p, "dbfarm") == 0) { value = dbfarm; diff --git a/tools/merovingian/daemon/forkmserver.c b/tools/merovingian/daemon/forkmserver.c --- a/tools/merovingian/daemon/forkmserver.c +++ b/tools/merovingian/daemon/forkmserver.c @@ -223,7 +223,9 @@ forkMserver(char *database, sabdb** stat char *argv[MAX_NR_ARGS+1]; /* for the exec arguments */ char property_other[1024]; int c = 0; + int freec = 0; /* from where to free entries in argv */ unsigned int mport; + char *set = "--set"; er = msab_getStatus(stats, database); if (er != NULL) { @@ -557,35 +559,34 @@ forkMserver(char *database, sabdb** stat _mero_hostname, mport, database); argv[c++] = _mero_mserver; argv[c++] = dbpath; - argv[c++] = "--set"; argv[c++] = muri; + argv[c++] = set; argv[c++] = muri; if (dbextra != NULL) { snprintf(dbextra_path, sizeof(dbextra_path), "--dbextra=%s", dbextra); argv[c++] = dbextra_path; } if (mydoproxy) { - struct sockaddr_un s; /* only for sizeof(s.sun_path) :( */ - argv[c++] = "--set"; argv[c++] = "mapi_open=false"; + argv[c++] = set; argv[c++] = "mapi_open=false"; /* we "proxy", so we can just solely use UNIX domain sockets * internally. Before we hit our head, check if we can * actually use a UNIX socket (due to pathlength) */ - if (strlen((*stats)->path) + 11 < sizeof(s.sun_path)) { + if (strlen((*stats)->path) + 11 < sizeof(((struct sockaddr_un *) 0)->sun_path)) { snprintf(port, sizeof(port), "mapi_port=0"); snprintf(usock, sizeof(usock), "mapi_usock=%s/.mapi.sock", (*stats)->path); } else { - argv[c++] = "--set"; argv[c++] = "mapi_autosense=true"; + argv[c++] = set; argv[c++] = "mapi_autosense=true"; /* for logic here, see comment below */ snprintf(port, sizeof(port), "mapi_port=%u", mport + 1); snprintf(usock, sizeof(usock), "mapi_usock="); } } else { if (listenaddr[0] != '\0') { - argv[c++] = "--set"; argv[c++] = listenaddr; + argv[c++] = set; argv[c++] = listenaddr; } else { - argv[c++] = "--set"; argv[c++] = "mapi_open=true"; + argv[c++] = set; argv[c++] = "mapi_open=true"; } - argv[c++] = "--set"; argv[c++] = "mapi_autosense=true"; + argv[c++] = set; argv[c++] = "mapi_autosense=true"; /* avoid this mserver binding to the same port as merovingian * but on another interface, (INADDR_ANY ... sigh) causing * endless redirects since 0.0.0.0 is not a valid address to @@ -593,33 +594,33 @@ forkMserver(char *database, sabdb** stat snprintf(port, sizeof(port), "mapi_port=%u", mport + 1); snprintf(usock, sizeof(usock), "mapi_usock="); } - argv[c++] = "--set"; argv[c++] = ipv6; - argv[c++] = "--set"; argv[c++] = port; - argv[c++] = "--set"; argv[c++] = usock; - argv[c++] = "--set"; argv[c++] = vaultkey; + argv[c++] = set; argv[c++] = ipv6; + argv[c++] = set; argv[c++] = port; + argv[c++] = set; argv[c++] = usock; + argv[c++] = set; argv[c++] = vaultkey; if (nthreads[0] != '\0') { - argv[c++] = "--set"; argv[c++] = nthreads; + argv[c++] = set; argv[c++] = nthreads; } if (nclients[0] != '\0') { - argv[c++] = "--set"; argv[c++] = nclients; + argv[c++] = set; argv[c++] = nclients; } if (pipeline[0] != '\0') { - argv[c++] = "--set"; argv[c++] = pipeline; + argv[c++] = set; argv[c++] = pipeline; } if (memmaxsize[0] != '\0') { - argv[c++] = "--set"; argv[c++] = memmaxsize; + argv[c++] = set; argv[c++] = memmaxsize; } if (vmmaxsize[0] != '\0') { - argv[c++] = "--set"; argv[c++] = vmmaxsize; + argv[c++] = set; argv[c++] = vmmaxsize; } if (embeddedr != NULL) { - argv[c++] = "--set"; argv[c++] = embeddedr; + argv[c++] = set; argv[c++] = embeddedr; } if (embeddedpy != NULL) { - argv[c++] = "--set"; argv[c++] = embeddedpy; + argv[c++] = set; argv[c++] = embeddedpy; } if (embeddedc != NULL) { - argv[c++] = "--set"; argv[c++] = embeddedc; + argv[c++] = set; argv[c++] = embeddedc; } if (readonly != NULL) { argv[c++] = readonly; @@ -629,10 +630,15 @@ forkMserver(char *database, sabdb** stat } /* get the rest (non-default) mserver props set in the conf file */ list = ckv; + freec = c; /* following entries to be freed if != set */ while (list->key != NULL) { if (list->val != NULL && !defaultProperty(list->key)) { - argv[c++] = "--set"; - snprintf(property_other, sizeof(property_other), "%s=%s", list->key, list->val); + if (strcmp(list->key, "gdk_debug") == 0) { + snprintf(property_other, sizeof(property_other), "-d%s", list->val); + } else { + argv[c++] = set; + snprintf(property_other, sizeof(property_other), "%s=%s", list->key, list->val); + } argv[c++] = strdup(property_other); } list++; @@ -640,8 +646,19 @@ forkMserver(char *database, sabdb** stat /* Let's get extra mserver5 args from the environment */ mserver5_extra = getenv("MSERVER5_EXTRA_ARGS"); - while (c < MAX_NR_ARGS && (mserver5_extra_token = strsep(&mserver5_extra, " "))) - argv[c++] = mserver5_extra_token; + if (mserver5_extra != NULL) { + /* work on copy of the environment value since strtok_r changes it */ + mserver5_extra = strdup(mserver5_extra); + if (mserver5_extra != NULL) { + char *sp = NULL; + mserver5_extra_token = strtok_r(mserver5_extra, " ", &sp); + while (c < MAX_NR_ARGS && mserver5_extra_token != NULL) { + argv[c++] = strdup(mserver5_extra_token); + mserver5_extra_token = strtok_r(NULL, " ", &sp); + } + free(mserver5_extra); + } + } argv[c++] = NULL; @@ -704,6 +721,12 @@ forkMserver(char *database, sabdb** stat dp->dbname = strdup(database); dp->flag = 0; + while (argv[freec] != NULL) { + if (argv[freec] != set) + free(argv[freec]); + freec++; + } + pthread_mutex_unlock(&_mero_topdp_lock); /* wait for the child to finish starting, at some point we diff --git a/tools/merovingian/utils/utils.c b/tools/merovingian/utils/utils.c --- a/tools/merovingian/utils/utils.c +++ b/tools/merovingian/utils/utils.c @@ -96,10 +96,11 @@ readConfFileFull(confkeyval *list, FILE while (fgets(buf, sizeof(buf), cnf) != NULL) { if (strlen(buf) > 1 && buf[0] != '#') { /* tokenize */ - key = strtok(buf, separator); - val = strtok(NULL, separator); + char *sp; + key = strtok_r(buf, separator, &sp); + val = strtok_r(NULL, separator, &sp); /* strip trailing newline */ - val = strtok(val, "\n"); + val = strtok_r(val, "\n", &sp); if ((err = setConfValForKey(t, key, val)) != NULL) { if (strstr(err, "is not recognized") != NULL) { /* If we already have PROPLENGTH entries in the list, ignore _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list