X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fwrap.c;h=a510702172e95c46b9ca34e416843d1c15e484b1;hb=c2ac5ba3964165ee2d21ccd4c6bf8bdc48e1a165;hp=1d17e9ac1837725dc57ea31580e8241e11170441;hpb=9c61930488da84cccaeaaabea55d3ad4e1323fda;p=sbcl.git diff --git a/src/runtime/wrap.c b/src/runtime/wrap.c index 1d17e9a..a510702 100644 --- a/src/runtime/wrap.c +++ b/src/runtime/wrap.c @@ -32,6 +32,8 @@ #include #include #include +#include +#include #ifndef LISP_FEATURE_WIN32 #include #include @@ -39,6 +41,12 @@ #endif #include +#if defined(LISP_FEATURE_WIN32) +#define WIN32_LEAN_AND_MEAN +#include +#include +#endif + #include "runtime.h" #include "util.h" #include "wrap.h" @@ -152,6 +160,41 @@ wrapped_readlink(char *path) #endif /* + * realpath(3), including a wrapper for Windows. + */ +char * sb_realpath (char *path) +{ +#ifndef LISP_FEATURE_WIN32 + char *ret; + int errnum; + + if ((ret = calloc(PATH_MAX, sizeof(char))) == NULL) + return NULL; + if (realpath(path, ret) == NULL) { + errnum = errno; + free(ret); + errno = errnum; + return NULL; + } + return(ret); +#else + char *ret; + char *cp; + int errnum; + + if ((ret = calloc(MAX_PATH, sizeof(char))) == NULL) + return NULL; + if (GetFullPathName(path, MAX_PATH, ret, cp) == 0) { + errnum = errno; + free(ret); + errno = errnum; + return NULL; + } + return(ret); +#endif +} + +/* * stat(2) stuff */ @@ -239,6 +282,30 @@ fstat_wrapper(int filedes, struct stat_wrapper *buf) return ret; } +/* A wrapper for mkstemp(3), which seems not to exist on Windows. */ +int sb_mkstemp (char *template) { +#ifdef LISP_FEATURE_WIN32 + int fd; + char buf[MAX_PATH]; + + while (1) { + strcpy((char*)&buf, template); + if (_mktemp((char*)&buf)) { + if ((fd=open((char*)&buf, O_CREAT|O_EXCL|O_RDWR, S_IRUSR|S_IWUSR))!=-1) { + strcpy(template, (char*)&buf); + return (fd); + } else + if (errno != EEXIST) + return (-1); + } else + return (-1); + } +#else + return(mkstemp(template)); +#endif +} + + /* * getpwuid() stuff */ @@ -307,7 +374,6 @@ wrapped_environ() } #ifdef LISP_FEATURE_WIN32 -#define WIN32_LEAN_AND_MEAN #include #include /*