> Not really. Instead fopen(3) will fail and a more cryptic "Didn't > find" error message will be printed.
I am going to fix it eventually. On Wed, 2011-02-16 at 09:07 +0100, Mark Kettenis wrote: > > From: Van de Bugger <van.de.bug...@gmail.com> > > Date: Wed, 16 Feb 2011 00:15:52 +0300 > > > > >From 0aaae5b3c0d6183e2791c30155bae40132a0c779 Mon Sep 17 00:00:00 2001 > > From: Van de Bugger <van.de.bug...@gmail.com> > > Date: Tue, 15 Feb 2011 23:55:28 +0300 > > Subject: [PATCH setxkbmap] Eliminate limitations on path length. > > > > ...by using dynamically allocated buffers. No need in PATH_MAX, > > MAXPATHLEN. No more "Path too long" errors. > > Not really. Instead fopen(3) will fail and a more cryptic "Didn't > find" error message will be printed. There really is very little > benefit in dynamicaly allocating paths. All OSes have a fixed maximum > path length, even the Hurd (contrary to what people claim). > > Also, please, please don't write "char * buffer"; spaces at both sides > of the '*' suggests it is the binary multiplication operator. The > proper style is for pointers is "char *buffer". > > > --- > > setxkbmap.c | 72 > > ++++++++++++++++++++++++++++++++++++---------------------- > > 1 files changed, 45 insertions(+), 27 deletions(-) > > > > diff --git a/setxkbmap.c b/setxkbmap.c > > index 3d3b7d8..6777b1b 100644 > > --- a/setxkbmap.c > > +++ b/setxkbmap.c > > @@ -24,6 +24,7 @@ > > > > ********************************************************/ > > > > +#include <stdarg.h> > > #include <stdio.h> > > #include <stdlib.h> > > #include <locale.h> > > @@ -36,14 +37,6 @@ > > #include <X11/extensions/XKBconfig.h> > > #include <X11/extensions/XKBrules.h> > > > > -#ifndef PATH_MAX > > -#ifdef MAXPATHLEN > > -#define PATH_MAX MAXPATHLEN > > -#else > > -#define PATH_MAX 1024 > > -#endif > > -#endif > > - > > #ifndef DFLT_XKB_CONFIG_ROOT > > #define DFLT_XKB_CONFIG_ROOT "/usr/share/X11/xkb" > > #endif > > @@ -170,6 +163,7 @@ static int deviceSpec = XkbUseCoreKbd; > > > > > > /***====================================================================***/ > > > > +char * rprintf( char const * format, ... ); > > Bool addToList(list_t * list, char *newVal); > > void usage(int argc, char **argv); > > void dumpNames(Bool wantRules, Bool wantCNames); > > @@ -189,6 +183,42 @@ void printKeymap(void); > > > > /***====================================================================***/ > > > > /* > > + Like sprintf, but returns freshly allocated string instead writing it > > to > > + pre-allocated buffer. Do not forget to free returned strung. > > +*/ > > + > > +char * > > +rprintf(char const * format, ...) > > +{ > > + va_list args; > > + char * buffer = NULL; > > + int allocated = 0; > > + int required = 100; > > + do > > + { > > + buffer = realloc(buffer, required + 1); > > + if (buffer == NULL) > > + { > > + ERR("Out of memory.\n"); > > + abort(); > > + } > > + allocated = required + 1; > > + va_start(args, format); > > + required = vsnprintf(buffer, allocated, format, args); > > + va_end(args); > > + if (required < 0) > > + { > > + ERR1("`vsnprintf' returned unexpected error (%d).\n", > > required); > > + abort(); > > + } > > + } > > + while (required >= allocated); > > + return buffer; > > +} > > + > > +/***====================================================================***/ > > + > > +/* > > If newVal is NULL or empty string, the list is cleared. > > Otherwise newVal is added to the end of the list (if it is not present > > in the list yet). > > */ > > @@ -623,7 +653,6 @@ FILE * > > findFileInPath(char *name, char *subdir) > > { > > register int i; > > - char buf[PATH_MAX]; > > FILE *fp; > > > > if (name[0] == '/') > > @@ -635,16 +664,11 @@ findFileInPath(char *name, char *subdir) > > } > > for (i = 0; (i < inclPath.num); i++) > > { > > - if (snprintf(buf, PATH_MAX, "%s/%s%s", inclPath.item[i], subdir, > > name) >= > > - PATH_MAX) > > - { > > - VMSG3(0, "Path too long (%s/%s%s). Ignored.\n", > > inclPath.item[i], > > - subdir, name); > > - continue; > > - } > > - fp = fopen(buf, "r"); > > + char * path = rprintf("%s/%s%s", inclPath.item[i], subdir, name); > > + fp = fopen(path, "r"); > > if ((verbose > 7) || ((!fp) && (verbose > 5))) > > - MSG2("%s file %s\n", (fp ? "Found" : "Didn't find"), buf); > > + MSG2("%s file %s\n", (fp ? "Found" : "Didn't find"), path); > > + free(path); > > if (fp != NULL) > > return fp; > > } > > @@ -824,7 +848,6 @@ applyRules(void) > > if (settings.model.src || settings.layout.src || settings.variant.src > > || options.item) > > { > > - char buf[PATH_MAX]; > > XkbComponentNamesRec rnames; > > > > if (settings.variant.src < settings.layout.src) > > @@ -852,14 +875,9 @@ applyRules(void) > > * we succeed with */ > > for (i = 0; (i < inclPath.num) && (!rules); i++) > > { > > - if (snprintf(buf, PATH_MAX, "%s/rules/%s", > > - inclPath.item[i], rfName) >= PATH_MAX) > > - { > > - VMSG2(0, "Path too long (%s/rules/%s). Ignored.\n", > > - inclPath.item[i], rfName); > > - continue; > > - } > > - rules = XkbRF_Load(buf, settings.locale.value, True, True); > > + char * path = rprintf("%s/rules/%s", inclPath.item[i], > > rfName); > > + rules = XkbRF_Load(path, settings.locale.value, True, > > True); > > + free(path); > > } > > } > > if (!rules) > > -- > > 1.7.4 > > > > > > > > _______________________________________________ > > xorg-devel@lists.x.org: X.Org development > > Archives: http://lists.x.org/archives/xorg-devel > > Info: http://lists.x.org/mailman/listinfo/xorg-devel > > _______________________________________________ xorg-devel@lists.x.org: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel