diff --git a/sources/nix20/extra/realpath.c b/sources/nix20/extra/realpath.c new file mode 100644 index 0000000..44e7eda --- /dev/null +++ b/sources/nix20/extra/realpath.c @@ -0,0 +1,44 @@ +#include +#include +#include +#include +#include + +extern void __seterrno(void); + +/* Resolve name to an absolute AmigaDOS path. A NULL resolved buffer is + * allocated with malloc, as POSIX allows. */ +char *realpath(const char *name, char *resolved) { + BPTR lock; + char *buf; + +#ifdef IXPATHS + extern char *__amigapath(const char *path); + if ((name = __amigapath(name)) == NULL) + return NULL; +#endif + + lock = Lock((CONST_STRPTR)name, ACCESS_READ); + if (lock == 0) { + __seterrno(); + return NULL; + } + + buf = resolved ? resolved : malloc(MAXPATHLEN); + if (buf == NULL) { + UnLock(lock); + errno = ENOMEM; + return NULL; + } + + if (!NameFromLock(lock, (STRPTR)buf, MAXPATHLEN)) { + __seterrno(); + UnLock(lock); + if (buf != resolved) + free(buf); + return NULL; + } + + UnLock(lock); + return buf; +} diff --git a/sources/nix20/stdlib/putenv.c b/sources/nix20/stdlib/putenv.c index 9070bd3..18bcffa 100644 --- a/sources/nix20/stdlib/putenv.c +++ b/sources/nix20/stdlib/putenv.c @@ -38,17 +38,20 @@ int setenv(const char *name, const char *value, int overwrite) { // insert char ** neu; if (environ_ptr__data != __dummy_env) - neu = (char **)realloc(environ_ptr__data, (p - environ_ptr__data + 1) * sizeof(char *)); + neu = (char **)realloc(environ_ptr__data, (p - environ_ptr__data + 2) * sizeof(char *)); else neu = (char **)malloc(2 * sizeof(char *)); - if (!neu) - return ENOMEM; + if (!neu) { + errno = ENOMEM; + return -1; + } if (environ_ptr__data != __dummy_env) p = neu + (p - environ_ptr__data); else p = neu; + environ_ptr__data = neu; *p++ = concat(name, "=", value, 0); *p = 0;