]> granicus.if.org Git - graphviz/commitdiff
Back out initial implementation of imagepath: it assumed a single graph and
authorEmden Gansner <erg@research.att.com>
Thu, 25 Aug 2011 20:50:01 +0000 (16:50 -0400)
committerEmden Gansner <erg@research.att.com>
Thu, 25 Aug 2011 20:50:01 +0000 (16:50 -0400)
a single path, the tests where distributed, and it broke the caching of images
in gvusershape.c. It also didn't check for graphviz being used as a web server.

lib/common/globals.h
lib/common/input.c
lib/common/shapes.c
lib/common/utils.c
lib/gvc/gvusershape.c

index a0d17cd329dc40659a6da8eab64d2b50c3bd7452..e7b9414b3aa6acc3eec692069e65dbd2f7396123 100644 (file)
@@ -67,7 +67,8 @@ extern "C" {
     EXTERN char *CmdName;
     EXTERN char *specificFlags;
     EXTERN char *specificItems;
-    EXTERN char *Gvfilepath;   /* Path of files allowed in 'shapefile' attrib  (also ps libs) */
+    EXTERN char *Gvfilepath;  /* Per-process path of files allowed in image attributes (also ps libs) */
+    EXTERN char *Gvimagepath; /* Per-graph path of files allowed in image attributes  (also ps libs) */
 
     EXTERN unsigned char Verbose;
     EXTERN boolean Reduce, MemTest;
index 2f708d71141e4ec9efb540019330575cbd268365..2c4584e095a0064ce67ada1835d1d8a2654631f3 100644 (file)
@@ -695,6 +695,12 @@ void graph_init(graph_t * g, boolean use_rankdir)
 
     GD_charset(g) = findCharset (g);
 
+    if (!HTTPServerEnVar) {
+       Gvimagepath = agget (g, "imagepath");
+       if (!Gvimagepath)
+           Gvimagepath = Gvfilepath;
+    }
+
     GD_drawing(g)->quantum =
        late_double(g, agfindgraphattr(g, "quantum"), 0.0, 0.0);
 
index 2b6ced2954cf04a6cc5b6a5b3d98c42cf9b1a0af..260c7ca05a8150d58393cd4d38782f91a423b801 100644 (file)
 #include "render.h"
 #include "htmltable.h"
 #include <limits.h>
-#ifdef WIN32
-#include "libltdl/lt_system.h"
-#endif
-#ifndef WIN32
-#include <unistd.h>
-#endif
 
 #define RBCONST 12
 #define RBCURVE .5
@@ -1537,10 +1531,6 @@ static void poly_gencode(GVJ_t * job, node_t * n)
     boolean pfilled;           /* true if fill not handled by user shape */
     char *color, *name;
     int doMap = (obj->url || obj->explicit_tooltip);
-    static char* ipfilename = NULL;
-    static char* imagepath = NULL;
-    static boolean firsttime = TRUE;
-    char *p;
 
     if (doMap && !(job->flags & EMIT_CLUSTERS_LAST))
        gvrender_begin_anchor(job,
@@ -1623,18 +1613,6 @@ static void poly_gencode(GVJ_t * job, node_t * n)
            name = agget(n, "shapefile");
        usershape_p = TRUE;
     } else if ((name = agget(n, "image"))) {
-      
-      if (firsttime) {
-       imagepath = agget(agraphof(n),"imagepath");
-       firsttime = FALSE;
-      }
-      if ((access (safefile(name), R_OK) != 0) && imagepath != NULL){
-       if (p = strrchr(name, '/'))
-         name = ++p;
-       ipfilename = realloc(ipfilename,(strlen(imagepath) + strlen(name) + 2));
-       sprintf (ipfilename, "%s%s%s", imagepath, DIRSEP, name);
-       name = ipfilename;
-      }
        usershape_p = TRUE;
     }
     if (usershape_p) {
index 3d44db954792029e2b3c4e15b4d8b3790848195d..28da8e6472674050e6388c0ab3bba2d23818530c 100644 (file)
@@ -305,7 +305,6 @@ char *Fgets(FILE * fp)
 
 /* safefile:
  * Check to make sure it is okay to read in files.
- * For normal uses, it is a no-op, and returns the input.
  * It returns NULL if the filename is trivial.
  *
  * If the application has set the SERVER_NAME environment variable, 
@@ -324,30 +323,67 @@ char *Fgets(FILE * fp)
  * If filename contains multiple components, the user is
  * warned, once, that everything to the left is ignored.
  *
+ * For non-server applications, we use the path list in Gvimagepath to 
+ * resolve relative pathnames.
+ *
  * N.B. safefile uses a fixed buffer, so functions using it should use the
  * value immediately or make a copy.
  */
 #ifdef WIN32
-#define DIRSEP "\\"
 #define PATHSEP ";"
 #else
-#define DIRSEP "/"
 #define PATHSEP ":"
 #endif
 
+static char** mkDirlist (const char* list, int* maxdirlen)
+{
+    int cnt = 0;
+    char* s = strdup (list);
+    char* dir;
+    char** dirs = NULL;
+    int maxlen = 0;
+
+    for (dir = strtok (s, PATHSEP); dir; dir = strtok (NULL, PATHSEP)) {
+       dirs = ALLOC (cnt+2,dirs,char*);
+       dirs[cnt++] = dir;
+       maxlen = MAX(maxlen, strlen (dir));
+    }
+    dirs[cnt] = NULL;
+    *maxdirlen = maxlen;
+    return dirs;
+}
+
+static char* findPath (char** dirs, int maxdirlen, const char* str)
+{
+    static char *safefilename = NULL;
+    char** dp;
+
+       /* allocate a buffer that we are sure is big enough
+         * +1 for null character.
+         * +1 for directory separator character.
+         */
+    safefilename = realloc(safefilename, (maxdirlen + strlen(str) + 2));
+
+    for (dp = dirs; *dp; dp++) {
+       sprintf (safefilename, "%s%s%s", *dp, DIRSEP, str);
+       if (access (safefilename, R_OK) == 0)
+           return safefilename;
+    }
+    return NULL;
+}
+
 const char *safefile(const char *filename)
 {
     static boolean onetime = TRUE;
-    static boolean firsttime = TRUE;
-    static char *safefilename = NULL;
+    static char *pathlist = NULL;
     static int maxdirlen;
     static char** dirs;
-    char** dp;
     const char *str, *p;
 
     if (!filename || !filename[0])
        return NULL;
-    if (HTTPServerEnVar) {
+
+    if (HTTPServerEnVar) {   /* If used as a server */
        /* 
         * If we are running in an http server we allow
         * files only from the directory specified in
@@ -363,17 +399,9 @@ const char *safefile(const char *filename)
            }
            return NULL;
        }
-       if (firsttime) {
-           int cnt = 0;
-           char* s = strdup (Gvfilepath);
-           char* dir;
-           for (dir = strtok (s, PATHSEP); dir; dir = strtok (NULL, PATHSEP)) {
-               dirs = ALLOC (cnt+2,dirs,char*);
-               dirs[cnt++] = dir;
-               maxdirlen = MAX(maxdirlen, strlen (dir));
-           }
-           dirs[cnt] = NULL;
-           firsttime = FALSE;
+       if (!pathlist) {
+           dirs = mkDirlist (Gvfilepath, &maxdirlen);
+           pathlist = Gvfilepath;
        }
 
        str = filename;
@@ -391,23 +419,24 @@ const char *safefile(const char *filename)
            onetime = FALSE;
        }
 
-       /* allocate a buffer that we are sure is big enough
-         * +1 for null character.
-         * +1 for directory separator character.
-         */
-       safefilename = realloc(safefilename,
-                              (maxdirlen + strlen(str) + 2));
+       return findPath (dirs, maxdirlen, str);
+    }
 
-       for (dp = dirs; *dp; dp++) {
-           sprintf (safefilename, "%s%s%s", *dp, DIRSEP, str);
-           if (access (safefilename, R_OK) == 0)
-               return safefilename;
+    if (pathlist != Gvimagepath) {
+       if (dirs) {
+           free (dirs[0]);
+           free (dirs);
+           dirs = NULL;
        }
-       return NULL;
+       pathlist = Gvimagepath;
+       if (pathlist && *pathlist)
+           dirs = mkDirlist (pathlist, &maxdirlen);
     }
-       /* else, not in server, use original filename without modification. */
-    else
+
+    if ((*filename == DIRSEP[0]) || !dirs)
        return filename;
+
+    return findPath (dirs, maxdirlen, filename);
 }
 
 int maptoken(char *p, char **name, int *val)
index b7dba03f4d0d31c2f3dcd463a19d7fe0e4f08642..4f112b6e6563086191340086164dc47178d8117f 100644 (file)
 #include <string.h>
 #include <errno.h>
 
-#ifdef WIN32
-#include "libltdl/lt_system.h"
-#endif
-#ifndef WIN32
-#include <unistd.h>
-#endif
-
 #include "types.h"
 #include "logic.h"
 #include "memory.h"
@@ -59,12 +52,6 @@ typedef struct {
 #define XML_MAGIC  "<?xml"
 #define SVG_MAGIC  "<svg"
 
-#ifdef WIN32
-#define DIRSEP "\\"
-#else
-#define DIRSEP "/"
-#endif
-
 static knowntype_t knowntypes[] = {
     { PNG_MAGIC,  sizeof(PNG_MAGIC)-1,  FT_PNG,  "png",  },
     { PS_MAGIC,   sizeof(PS_MAGIC)-1,   FT_PS,   "ps",   },
@@ -488,14 +475,9 @@ gvusershape_size_dpi (usershape_t* us, pointf dpi)
  */
 point gvusershape_size(graph_t * g, char *name)
 {
-    static char *ipfilename = NULL;
-    static char* imagepath;
-    static boolean firsttime = TRUE;
-    const char *str;
-    char *p;
     point rv;
     pointf dpi;
-    
+
     /* no shape file, no shape size */
     if (!name || (*name == '\0')) {
         rv.x = rv.y = -1;
@@ -506,21 +488,6 @@ point gvusershape_size(graph_t * g, char *name)
        dpi.x = dpi.y;
     else
        dpi.x = dpi.y = (double)DEFAULT_DPI;
-    
-    //imagepath is typically set as a graph attribute on macos platforms
-    //It points to the directory where node images are located
-    if (firsttime) {
-      imagepath = agget(g,"imagepath");
-      firsttime = FALSE;
-    }
 
-    if ((access (safefile(name), R_OK) != 0) && imagepath != NULL){
-      if (p = strrchr(name, '/'))
-       name = ++p;
-      ipfilename = realloc(ipfilename,(strlen(imagepath) + strlen(name) + 2));
-      sprintf (ipfilename, "%s%s%s", imagepath, DIRSEP, name);
-      name = ipfilename;
-    }
     return gvusershape_size_dpi (gvusershape_open (name), dpi);
-
 }