[PATCH setxkbmap] Eliminate limitations on path length.
Alan Coopersmith
alan.coopersmith at oracle.com
Tue Feb 15 13:40:33 PST 2011
I'd rather see us use the asprintf() interface, so we can just check for it
in libc in configure and use it directly when possible, with a fallback for
older systems, than invent a rprintf() API that doesn't match common usage.
There's a bunch of examples of asprintf() recently committed to various
X.Org modules, for instance:
http://cgit.freedesktop.org/xorg/app/xrdb/commit/?id=82babf3ecfd6eb1ef65a150fb0c453e7bfd61616
-alan-
On 02/15/11 01:15 PM, Van de Bugger wrote:
> From 0aaae5b3c0d6183e2791c30155bae40132a0c779 Mon Sep 17 00:00:00 2001
> From: Van de Bugger <van.de.bugger at 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.
> ---
> 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)
--
-Alan Coopersmith- alan.coopersmith at oracle.com
Oracle Solaris Platform Engineering: X Window System
More information about the xorg-devel
mailing list