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

Reply via email to