diff options
| author | Anand Avati <avati@gluster.com> | 2010-02-05 05:00:20 +0000 | 
|---|---|---|
| committer | Anand V. Avati <avati@dev.gluster.com> | 2010-02-05 03:05:43 -0800 | 
| commit | c3005ce736d6bb3391e5f46930d355fc6b0f4d6e (patch) | |
| tree | 71184f05253c727eb5440d7a998fdee288a48cd8 /libglusterfs | |
| parent | 4f736b6eb9d761287b6bf4ecfc19974a43a8644f (diff) | |
Fixes for MacOSX and Solaris build
Fixes for Solaris and MacOSX build errors.
Signed-off-by: Anand V. Avati <avati@blackhole.gluster.com>
Signed-off-by: Anand V. Avati <avati@dev.gluster.com>
BUG: 481 (Fix compilation failures in Solaris)
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=481
Diffstat (limited to 'libglusterfs')
| -rw-r--r-- | libglusterfs/src/compat.c | 133 | ||||
| -rw-r--r-- | libglusterfs/src/compat.h | 1 | 
2 files changed, 102 insertions, 32 deletions
diff --git a/libglusterfs/src/compat.c b/libglusterfs/src/compat.c index dc21aecf47e..76ced628629 100644 --- a/libglusterfs/src/compat.c +++ b/libglusterfs/src/compat.c @@ -369,38 +369,6 @@ solaris_getxattr(const char *path,  } -int -asprintf(char **string_ptr, const char *format, ...) -{  -	va_list arg; -	char *str; -	int size; -	int rv; -	 -	if (!string_ptr || !format) -		return -1; -	 -	va_start(arg, format); -	size = vsnprintf(NULL, 0, format, arg); -	size++; -	va_start(arg, format); -	str = MALLOC(size); -	if (str == NULL) { -		va_end(arg); -		/* -		 * Strictly speaking, GNU asprintf doesn't do this, -		 * but the caller isn't checking the return value. -		 */ -		gf_log ("libglusterfs", GF_LOG_CRITICAL, "failed to allocate memory"); -		return -1; -	} -	rv = vsnprintf(str, size, format, arg); -	va_end(arg); -	 -	*string_ptr = str; -	return (rv); -}   -  char* strsep(char** str, const char* delims)  {  	char* token; @@ -424,6 +392,107 @@ char* strsep(char** str, const char* delims)  	return token;  } +/* Code comes from libiberty */ + +int +vasprintf (char **result, const char *format, va_list args) +{ +  const char *p = format; +  /* Add one to make sure that it is never zero, which might cause malloc +     to return NULL.  */ +  int total_width = strlen (format) + 1; +  va_list ap; + +  /* this is not really portable but works under Windows */ +  memcpy ( &ap, &args, sizeof (va_list)); + +  while (*p != '\0') +    { +      if (*p++ == '%') +	{ +	  while (strchr ("-+ #0", *p)) +	    ++p; +	  if (*p == '*') +	    { +	      ++p; +	      total_width += abs (va_arg (ap, int)); +	    } +	  else +            { +              char *endp;   +              total_width += strtoul (p, &endp, 10); +              p = endp; +            } +	  if (*p == '.') +	    { +	      ++p; +	      if (*p == '*') +		{ +		  ++p; +		  total_width += abs (va_arg (ap, int)); +		} +	      else +                { +                  char *endp; +                  total_width += strtoul (p, &endp, 10); +                  p = endp; +                } +	    } +	  while (strchr ("hlL", *p)) +	    ++p; +	  /* Should be big enough for any format specifier except %s +             and floats.  */ +	  total_width += 30; +	  switch (*p) +	    { +	    case 'd': +	    case 'i': +	    case 'o': +	    case 'u': +	    case 'x': +	    case 'X': +	    case 'c': +	      (void) va_arg (ap, int); +	      break; +	    case 'f': +	    case 'e': +	    case 'E': +	    case 'g': +	    case 'G': +	      (void) va_arg (ap, double); +	      /* Since an ieee double can have an exponent of 307, we'll +		 make the buffer wide enough to cover the gross case. */ +	      total_width += 307; +	     +	    case 's': +	      total_width += strlen (va_arg (ap, char *)); +	      break; +	    case 'p': +	    case 'n': +	      (void) va_arg (ap, char *); +	      break; +	    } +	} +    } +  *result = malloc (total_width); +  if (*result != NULL) +    return vsprintf (*result, format, args); +  else +    return 0; +} + +int +asprintf (char **buf, const char *fmt, ...) +{ +  int status; +  va_list ap; + +  va_start (ap, fmt); +  status = vasprintf (buf, fmt, ap); +  va_end (ap); +  return status;   +} +  #endif /* GF_SOLARIS_HOST_OS */  #ifndef HAVE_STRNLEN diff --git a/libglusterfs/src/compat.h b/libglusterfs/src/compat.h index 01683a17456..20db203bf9f 100644 --- a/libglusterfs/src/compat.h +++ b/libglusterfs/src/compat.h @@ -261,6 +261,7 @@ enum {  int asprintf(char **string_ptr, const char *format, ...);  +int vasprintf (char **result, const char *format, va_list args);  char* strsep(char** str, const char* delims);  int solaris_listxattr(const char *path, char *list, size_t size);  int solaris_removexattr(const char *path, const char* key);  | 
