Submitted By: Kristian Rainio (krikesoft@suomi24.fi) Date: 2004-09-13 Initial Package Version: 1.5m2 Origin: NA Upstream Status: Not submitted Description: Adds functions to create parent directories for cat pages diff -Naur man-1.5m2.orig/src/man.c man-1.5m2/src/man.c --- man-1.5m2.orig/src/man.c 2003-09-05 09:49:13.000000000 +0000 +++ man-1.5m2/src/man.c 2004-09-13 10:56:19.422387512 +0000 @@ -21,6 +21,7 @@ */ #include +#include #include #include #include @@ -685,9 +686,14 @@ FILE *fp; char *roff_command; char *command = NULL; + char *catdir = dirname(my_strdup(cat_file)); struct stat statbuf; /* _Before_ first, make sure we will write to a regular file. */ + if (stat(catdir, &statbuf)) + mkdir_parens(catdir, 0755); + free (catdir); + if (stat(cat_file, &statbuf) == 0) { if(!S_ISREG(statbuf.st_mode)) { if (debug) @@ -816,7 +822,6 @@ const char *ext; int status; int standards; - ext = (do_compress ? getval("COMPRESS_EXT") : 0); standards = (fhs ? FHS : 0) | (fsstnd ? FSSTND : 0) | (dohp ? DO_HP : 0); diff -Naur man-1.5m2.orig/src/util.c man-1.5m2/src/util.c --- man-1.5m2.orig/src/util.c 2003-09-05 09:48:13.000000000 +0000 +++ man-1.5m2/src/util.c 2004-09-13 10:56:19.423387360 +0000 @@ -224,12 +224,63 @@ } char * +my_realloc (char *s, int n) { + if (! (s = realloc(s, n))) + { + fatal (OUT_OF_MEMORY, n); + } + return s; +} + +char * my_strdup (const char *s) { char *t = my_malloc(strlen(s) + 1); strcpy(t, s); return t; } +char *my_strncat(char *dst, const char *src, int len) +{ + if (len < 0) + len = strlen(src); + + if (dst == NULL) + { + dst = (char *)malloc(len + 1); + *dst = '\0'; + } + else + dst = (char*)my_realloc(dst, (strlen(dst)+len+1) * sizeof(char)); + + return strncat(dst, src, len); +} /* + my_strcat macro is defined in util.h. +*/ + +int mkdir_parens(const char *path, mode_t mode) +{ + char *p = NULL; + char *dir = NULL; + int retval = 0; + struct stat statbuf; + + while ((p = strchr((p == NULL) ? path + 1 : path, '/')) != NULL) + { + dir = my_strncat(dir, path, (int)(p-path)+1); + if ((stat(dir, &statbuf)) && (retval = mkdir(dir, mode))) + break; + path = p + 1; + } + if (!retval) + { + dir = my_strncat(dir, path, (int)(p - path)); + if (stat(dir, &statbuf)) + retval = mkdir(dir, mode); + } + return retval; +} + + /* * Call: my_xsprintf(format,s1,s2,...) where format only contains %s/%S/%Q * (or %d or %o) and all %s/%S/%Q parameters are strings. diff -Naur man-1.5m2.orig/src/util.h man-1.5m2/src/util.h --- man-1.5m2.orig/src/util.h 2003-09-05 09:48:13.000000000 +0000 +++ man-1.5m2/src/util.h 2004-09-13 10:56:19.424387208 +0000 @@ -3,7 +3,10 @@ void get_permissions (void); void no_privileges (void); char *my_malloc (int n); +char *my_realloc(char *s, int n); +char *my_strncat(char *dst, const char *src, int len); char *my_strdup (const char *s); +int mkdir_parens(const char *path, mode_t mode); const char *mkprogname (const char *s); int is_newer (const char *fa, const char *fb); int do_system_command (const char *cmd, int silent);