Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Factory
ksh
ksh93-pathtemp.dif
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File ksh93-pathtemp.dif of Package ksh
--- src/lib/libast/path/pathtemp.c +++ src/lib/libast/path/pathtemp.c 2012-10-25 10:35:14.510345073 +0000 @@ -73,15 +73,49 @@ #include <ls.h> #include <tv.h> #include <tm.h> +#include <error.h> #define ATTEMPT 10 #define TMP_ENV "TMPDIR" #define TMP_PATH_ENV "TMPPATH" #define TMP1 "/tmp" -#define TMP2 "/usr/tmp" +#define TMP2 "/var/tmp" -#define VALID(d) (*(d)&&!eaccess(d,W_OK|X_OK)) +static inline int xaccess(const char *path, int mode) +{ + static size_t pgsz; + struct statvfs vfs; + int ret; + + if (!pgsz) + pgsz = strtoul(astconf("PAGESIZE",NiL,NiL),NiL,0); + + if (!path || !*path) + { + errno = EFAULT; + goto err; + } + + do + ret = statvfs(path, &vfs); + while (ret < 0 && errno == EINTR); + + if (ret < 0) + goto err; + + if (vfs.f_frsize*vfs.f_bavail < pgsz) + { + errno = ENOSPC; + goto err; + } + + return eaccess(path, mode); +err: + return -1; +} + +#define VALID(d) (*(d)&&!xaccess(d,W_OK|X_OK)) static struct { @@ -182,7 +216,7 @@ pathtemp(char* buf, size_t len, const ch tv.tv_nsec = 0; else tvgettime(&tv); - if (!(d = (char*)dir) || *d && eaccess(d, W_OK|X_OK)) + if (!(d = (char*)dir) || (*d && xaccess(d, W_OK|X_OK))) { if (!tmp.vec) { @@ -227,7 +261,7 @@ pathtemp(char* buf, size_t len, const ch tmp.dir = tmp.vec; d = *tmp.dir++; } - if (!d && (!*(d = astconf("TMP", NiL, NiL)) || eaccess(d, W_OK|X_OK)) && eaccess(d = TMP1, W_OK|X_OK) && eaccess(d = TMP2, W_OK|X_OK)) + if (!d && (!*(d = astconf("TMP", NiL, NiL)) || xaccess(d, W_OK|X_OK)) && xaccess(d = TMP1, W_OK|X_OK) && xaccess(d = TMP2, W_OK|X_OK)) return 0; } if (!len) --- src/lib/libast/sfio/sftmp.c +++ src/lib/libast/sfio/sftmp.c 2012-10-25 12:09:18.026344912 +0000 @@ -20,6 +20,14 @@ * * ***********************************************************************/ #include "sfhdr.h" +#if _PACKAGE_ast +# if defined(__linux__) && _lib_statfs +# include <sys/statfs.h> +# ifndef TMPFS_MAGIC +# define TMPFS_MAGIC 0x01021994 +# endif +# endif +#endif /* Create a temporary stream for read/write. ** The stream is originally created as a memory-resident stream. @@ -207,7 +215,24 @@ Sfio_t* f; int fd; #if _PACKAGE_ast +# if defined(__linux__) && _lib_statfs + /* + * Use the area of POSIX shared memory objects for the new temporary file descriptor + * that is do not access HD or SSD but only the memory based tmpfs of the POSIX SHM + */ + static int doshm; + static char *shm = "/dev/shm"; + if (!doshm) + { + struct statfs fs; + if (statfs(shm, &fs) < 0 || fs.f_type != TMPFS_MAGIC || eaccess(shm, W_OK|X_OK)) + shm = NiL; + doshm++; + } + if(!(file = pathtemp(NiL,PATH_MAX,shm,"sf",&fd))) +# else if(!(file = pathtemp(NiL,PATH_MAX,NiL,"sf",&fd))) +# endif return -1; _rmtmp(f, file); free(file);
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor