The ANSI-C constant FILENAME_MAX is ludicrously small on some systems.
[sgt/putty] / unix / uxstore.c
index 922462f..9ee083a 100644 (file)
@@ -9,6 +9,7 @@
 #include <assert.h>
 #include <errno.h>
 #include <ctype.h>
+#include <limits.h>
 #include <unistd.h>
 #include <fcntl.h>
 #include <dirent.h>
 #include "storage.h"
 #include "tree234.h"
 
+#ifdef PATH_MAX
+#define FNLEN PATH_MAX
+#else
+#define FNLEN 1024 /* XXX */
+#endif
+
 enum {
     INDEX_DIR, INDEX_HOSTKEYS, INDEX_HOSTKEYS_TMP, INDEX_RANDSEED,
     INDEX_SESSIONDIR, INDEX_SESSION,
@@ -85,12 +92,14 @@ static void make_filename(char *filename, int index, const char *subname)
     char *home;
     int len;
     home = getenv("HOME");
-    strncpy(filename, home, FILENAME_MAX);
+    if (!home)
+        home="/";
+    strncpy(filename, home, FNLEN);
     len = strlen(filename);
     if (index == INDEX_SESSION) {
         char *munged = mungestr(subname);
         char *fn = dupprintf("/.putty/sessions/%s", munged);
-        strncpy(filename + len, fn, FILENAME_MAX - len);
+        strncpy(filename + len, fn, FNLEN - len);
         sfree(fn);
         sfree(munged);
     } else {
@@ -100,37 +109,14 @@ static void make_filename(char *filename, int index, const char *subname)
                 index == INDEX_HOSTKEYS ? "/.putty/sshhostkeys" :
                 index == INDEX_HOSTKEYS_TMP ? "/.putty/sshhostkeys.tmp" :
                 index == INDEX_RANDSEED ? "/.putty/randomseed" :
-                "/.putty/ERROR", FILENAME_MAX - len);
-    }
-    filename[FILENAME_MAX-1] = '\0';
-}
-
-/*
- * Read an entire line of text from a file. Return a buffer
- * malloced to be as big as necessary (caller must free).
- */
-static char *fgetline(FILE *fp)
-{
-    char *ret = snewn(512, char);
-    int size = 512, len = 0;
-    while (fgets(ret + len, size - len, fp)) {
-       len += strlen(ret + len);
-       if (ret[len-1] == '\n')
-           break;                     /* got a newline, we're done */
-       size = len + 512;
-       ret = sresize(ret, size, char);
+                "/.putty/ERROR", FNLEN - len);
     }
-    if (len == 0) {                   /* first fgets returned NULL */
-       sfree(ret);
-       return NULL;
-    }
-    ret[len] = '\0';
-    return ret;
+    filename[FNLEN-1] = '\0';
 }
 
 void *open_settings_w(const char *sessionname, char **errmsg)
 {
-    char filename[FILENAME_MAX];
+    char filename[FNLEN];
     FILE *fp;
 
     *errmsg = NULL;
@@ -247,7 +233,7 @@ const char *get_setting(const char *key)
 
 void *open_settings_r(const char *sessionname)
 {
-    char filename[FILENAME_MAX];
+    char filename[FNLEN];
     FILE *fp;
     char *line;
     tree234 *ret;
@@ -362,7 +348,7 @@ void close_settings_r(void *handle)
 
 void del_settings(const char *sessionname)
 {
-    char filename[FILENAME_MAX];
+    char filename[FNLEN];
     make_filename(filename, INDEX_SESSION, sessionname);
     unlink(filename);
 }
@@ -370,7 +356,7 @@ void del_settings(const char *sessionname)
 void *enum_settings_start(void)
 {
     DIR *dp;
-    char filename[FILENAME_MAX];
+    char filename[FNLEN];
 
     make_filename(filename, INDEX_SESSIONDIR, NULL);
     dp = opendir(filename);
@@ -383,7 +369,7 @@ char *enum_settings_next(void *handle, char *buffer, int buflen)
     DIR *dp = (DIR *)handle;
     struct dirent *de;
     struct stat st;
-    char fullpath[FILENAME_MAX];
+    char fullpath[FNLEN];
     int len;
     char *unmunged;
 
@@ -391,10 +377,10 @@ char *enum_settings_next(void *handle, char *buffer, int buflen)
     len = strlen(fullpath);
 
     while ( (de = readdir(dp)) != NULL ) {
-        if (len < FILENAME_MAX) {
+        if (len < FNLEN) {
             fullpath[len] = '/';
-            strncpy(fullpath+len+1, de->d_name, FILENAME_MAX-(len+1));
-            fullpath[FILENAME_MAX-1] = '\0';
+            strncpy(fullpath+len+1, de->d_name, FNLEN-(len+1));
+            fullpath[FNLEN-1] = '\0';
         }
 
         if (stat(fullpath, &st) < 0 || !S_ISREG(st.st_mode))
@@ -429,7 +415,7 @@ int verify_host_key(const char *hostname, int port,
                    const char *keytype, const char *key)
 {
     FILE *fp;
-    char filename[FILENAME_MAX];
+    char filename[FNLEN];
     char *line;
     int ret;
 
@@ -499,7 +485,7 @@ void store_host_key(const char *hostname, int port,
     FILE *rfp, *wfp;
     char *newtext, *line;
     int headerlen;
-    char filename[FILENAME_MAX], tmpfilename[FILENAME_MAX];
+    char filename[FNLEN], tmpfilename[FNLEN];
 
     newtext = dupprintf("%s@%d:%s %s\n", keytype, port, hostname, key);
     headerlen = 1 + strcspn(newtext, " ");   /* count the space too */
@@ -510,7 +496,7 @@ void store_host_key(const char *hostname, int port,
     make_filename(tmpfilename, INDEX_HOSTKEYS_TMP, NULL);
     wfp = fopen(tmpfilename, "w");
     if (!wfp) {
-        char dir[FILENAME_MAX];
+        char dir[FNLEN];
 
         make_filename(dir, INDEX_DIR, NULL);
         mkdir(dir, 0700);
@@ -548,7 +534,7 @@ void store_host_key(const char *hostname, int port,
 void read_random_seed(noise_consumer_t consumer)
 {
     int fd;
-    char fname[FILENAME_MAX];
+    char fname[FNLEN];
 
     make_filename(fname, INDEX_RANDSEED, NULL);
     fd = open(fname, O_RDONLY);
@@ -564,7 +550,7 @@ void read_random_seed(noise_consumer_t consumer)
 void write_random_seed(void *data, int len)
 {
     int fd;
-    char fname[FILENAME_MAX];
+    char fname[FNLEN];
 
     make_filename(fname, INDEX_RANDSEED, NULL);
     /*
@@ -574,7 +560,7 @@ void write_random_seed(void *data, int len)
      */
     fd = open(fname, O_CREAT | O_WRONLY, 0600);
     if (fd < 0) {
-       char dir[FILENAME_MAX];
+       char dir[FNLEN];
 
        make_filename(dir, INDEX_DIR, NULL);
        mkdir(dir, 0700);