From fed549ee2049a318081cfce3fde01ae625263d98 Mon Sep 17 00:00:00 2001 From: Stef Walter Date: Tue, 1 May 2012 10:38:58 +0200 Subject: Provide compat getprogname() implementations on other OS's * And use them in our replacement err() and p11_kit_set_progname() --- common/compat.c | 87 ++++++++++++++++++++++++++++++++++++++++++--------------- common/compat.h | 10 +++++-- 2 files changed, 71 insertions(+), 26 deletions(-) (limited to 'common') diff --git a/common/compat.c b/common/compat.c index 93ba77c..4c8016b 100644 --- a/common/compat.c +++ b/common/compat.c @@ -36,40 +36,81 @@ #include "compat.h" -#ifndef HAVE_ERR_H +#ifndef HAVE_GETPROGNAME -#include -#include -#include -#include +#ifdef OS_UNIX + +#if defined (HAVE_PROGRAM_INVOCATION_SHORT_NAME) && !HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME +extern char *program_invocation_short_name; +#endif -static const char * -calc_prog_name (void) +#if defined (HAVE___PROGNAME) && !HAVE_DECL___PROGNAME +extern char *__progname; +#endif + +const char * +getprogname (void) { - static char prognamebuf[256]; - static int prepared = 0; + const char *name; - if(!prepared) - { - const char* beg = strrchr(__argv[0], '\\'); - const char* temp = strrchr(__argv[0], '/'); - beg = (beg > temp) ? beg : temp; - beg = (beg) ? beg + 1 : __argv[0]; +#if defined (HAVE_GETEXECNAME) + const char *p; + name = getexecname(); + p = strrchr (name ? name : "", '/'); + if (p != NULL) + name = p + 1; +#elif defined (HAVE_PROGRAM_INVOCATION_SHORT_NAME) + name = program_invocation_short_name; +#elif defined (HAVE___PROGNAME) + name = __progname; +#else + #error No way to retrieve short program name +#endif + + return name; +} - temp = strrchr(__argv[0], '.'); - temp = (temp > beg) ? temp : __argv[0] + strlen(__argv[0]); +#else /* OS_WIN32 */ - if((temp - beg) > 255) - temp = beg + 255; +extern char **__argv; +static char prognamebuf[256]; - strncpy(prognamebuf, beg, temp - beg); - prognamebuf[temp - beg] = 0; - prepared = 1; - } +const char * +getprogname (void) +{ + const char *name; + const char *p; + size_t length; + + name = __argv[0]; + if (name == NULL) + return NULL; + + p = strrchr (name, '\\'); + if (p != NULL) + name = p + 1; + + length = sizeof (prognamebuf) - 1; + strncpy (prognamebuf, name, length); + prognamebuf[length] = 0; + length = strlen (prognamebuf); + if (length > 4 && _stricmp (prognamebuf + (length - 4), ".exe")) + prognamebuf[length - 4] = '\0'; return prognamebuf; } +#endif /* OS_WIN32 */ + +#endif /* HAVE_GETPROGNAME */ + +#ifndef HAVE_ERR_H + +#include +#include +#include +#include + static FILE *err_file; /* file to use for error output */ /* diff --git a/common/compat.h b/common/compat.h index 1562964..b2774f1 100644 --- a/common/compat.h +++ b/common/compat.h @@ -32,11 +32,15 @@ * Author: Stef Walter */ -#ifndef __ERR_H__ -#define __ERR_H__ +#ifndef __COMPAT_H__ +#define __COMPAT_H__ #include "config.h" +#ifndef HAVE_GETPROGNAME +const char * getprogname (void); +#endif + #ifdef HAVE_ERR_H #include @@ -60,4 +64,4 @@ void vwarnx (const char *fmt, va_list ap); #endif /* !HAVE_ERR_H */ -#endif /* __ERR_H__ */ +#endif /* __COMPAT_H__ */ -- cgit v1.1