typedef char * (*sudo_fn_getenv_t)(const char *);
+char *
+getenv_unhooked(const char *name)
+{
+#if defined(HAVE_DLOPEN) && defined(RTLD_NEXT)
+ sudo_fn_getenv_t fn;
+
+ fn = (sudo_fn_getenv_t)dlsym(RTLD_NEXT, "getenv");
+ if (fn != NULL)
+ return fn(name);
+#endif /* HAVE_DLOPEN && RTLD_NEXT */
+ return rpl_getenv(name);
+}
+
char *
getenv(const char *name)
{
return val;
case SUDO_HOOK_RET_ERROR:
return NULL;
- default: {
-#if defined(HAVE_DLOPEN) && defined(RTLD_NEXT)
- sudo_fn_getenv_t fn;
-
- fn = (sudo_fn_getenv_t)dlsym(RTLD_NEXT, "getenv");
- if (fn != NULL)
- return fn(name);
-#endif /* HAVE_DLOPEN && RTLD_NEXT */
- return rpl_getenv(name);
- }
+ default:
+ return getenv_unhooked(name);
}
}
typedef int (*sudo_fn_putenv_t)(PUTENV_CONST char *);
+static int
+putenv_unhooked(PUTENV_CONST char *string)
+{
+#if defined(HAVE_DLOPEN) && defined(RTLD_NEXT)
+ sudo_fn_putenv_t fn;
+
+ fn = (sudo_fn_putenv_t)dlsym(RTLD_NEXT, "putenv");
+ if (fn != NULL)
+ return fn(string);
+#endif /* HAVE_DLOPEN && RTLD_NEXT */
+ return rpl_putenv(string);
+}
+
int
putenv(PUTENV_CONST char *string)
{
return 0;
case SUDO_HOOK_RET_ERROR:
return -1;
- default: {
-#if defined(HAVE_DLOPEN) && defined(RTLD_NEXT)
- sudo_fn_putenv_t fn;
-
- fn = (sudo_fn_putenv_t)dlsym(RTLD_NEXT, "putenv");
- if (fn != NULL)
- return fn(string);
-#endif /* HAVE_DLOPEN && RTLD_NEXT */
- return rpl_putenv(string);
- }
+ default:
+ return putenv_unhooked(string);
}
}
typedef int (*sudo_fn_setenv_t)(const char *, const char *, int);
+static int
+setenv_unhooked(const char *var, const char *val, int overwrite)
+{
+#if defined(HAVE_SETENV) && defined(HAVE_DLOPEN) && defined(RTLD_NEXT)
+ sudo_fn_setenv_t fn;
+
+ fn = (sudo_fn_setenv_t)dlsym(RTLD_NEXT, "setenv");
+ if (fn != NULL)
+ return fn(var, val, overwrite);
+#endif /* HAVE_SETENV && HAVE_DLOPEN && RTLD_NEXT */
+ return rpl_setenv(var, val, overwrite);
+}
+
int
setenv(const char *var, const char *val, int overwrite)
{
return 0;
case SUDO_HOOK_RET_ERROR:
return -1;
- default: {
-#if defined(HAVE_SETENV) && defined(HAVE_DLOPEN) && defined(RTLD_NEXT)
- sudo_fn_setenv_t fn;
-
- fn = (sudo_fn_setenv_t)dlsym(RTLD_NEXT, "setenv");
- if (fn != NULL)
- return fn(var, val, overwrite);
-#endif /* HAVE_SETENV && HAVE_DLOPEN && RTLD_NEXT */
- return rpl_setenv(var, val, overwrite);
- }
+ default:
+ return setenv_unhooked(var, val, overwrite);
}
}
-#ifdef UNSETENV_VOID
-static void
-#else
-int
-#endif
+static int
rpl_unsetenv(const char *var)
{
char **ep = environ;
if (var == NULL || *var == '\0' || strchr(var, '=') != NULL) {
errno = EINVAL;
-#ifdef UNSETENV_VOID
- return;
-#else
return -1;
-#endif
}
len = strlen(var);
ep++;
}
}
-#ifndef UNSETENV_VOID
return 0;
-#endif
}
#ifdef UNSETENV_VOID
typedef int (*sudo_fn_unsetenv_t)(const char *);
#endif
-#ifdef UNSETENV_VOID
-void
-unsetenv(const char *var)
+static int
+unsetenv_unhooked(const char *var)
{
- switch (process_hooks_unsetenv(var)) {
- case SUDO_HOOK_RET_STOP:
- return 0;
- case SUDO_HOOK_RET_ERROR:
- return -1;
- default: {
+ int rval = 0;
#if defined(HAVE_UNSETENV) && defined(HAVE_DLOPEN) && defined(RTLD_NEXT)
- sudo_fn_unsetenv_t fn;
-
- fn = (sudo_fn_unsetenv_t)dlsym(RTLD_NEXT, "unsetenv");
- if (fn != NULL)
- fn(var);
- else
+ sudo_fn_unsetenv_t fn;
+
+ fn = (sudo_fn_unsetenv_t)dlsym(RTLD_NEXT, "unsetenv");
+ if (fn != NULL) {
+# ifdef UNSETENV_VOID
+ fn(var);
+# else
+ rval = fn(var);
+# endif
+ } else
#endif /* HAVE_UNSETENV && HAVE_DLOPEN && RTLD_NEXT */
- rpl_unsetenv(var);
- }
+ {
+ rval = rpl_unsetenv(var);
}
+ return rval;
}
+
+#ifdef UNSETENV_VOID
+void
#else
int
+#endif
unsetenv(const char *var)
{
+ int rval;
+
switch (process_hooks_unsetenv(var)) {
case SUDO_HOOK_RET_STOP:
- return 0;
+ rval = 0;
+ break;
case SUDO_HOOK_RET_ERROR:
- return -1;
- default: {
-#if defined(HAVE_UNSETENV) && defined(HAVE_DLOPEN) && defined(RTLD_NEXT)
- sudo_fn_unsetenv_t fn;
-
- fn = (sudo_fn_unsetenv_t)dlsym(RTLD_NEXT, "unsetenv");
- if (fn != NULL)
- return fn(var);
-#endif /* HAVE_UNSETENV && HAVE_DLOPEN && RTLD_NEXT */
- return rpl_unsetenv(var);
- }
+ rval = -1;
+ break;
+ default:
+ rval = unsetenv_unhooked(var);
+ break;
}
+#ifndef UNSETENV_VOID
+ return rval;
+#endif
}
-#endif /* UNSETENV_VOID */