Raymond Toy pushed to branch issue-125-unix-stat-wrong at cmucl / cmucl
Commits: 6f0f8c05 by Raymond Toy at 2022-08-13T17:51:12-07:00 Address review comments
In unix.lisp, use `c-call:long-long` and `c-call:unsigned-long-long` instead of `int64-t` and `u-int64-t`.
Renamed functions from `unix_stat` to `os_stat`.
In `os_stat` and friends, if the syscall fails, just return with the code instead of copying random stuff.
- - - - -
2 changed files:
- src/code/unix.lisp - src/lisp/os-common.c
Changes:
===================================== src/code/unix.lisp ===================================== @@ -1337,37 +1337,37 @@ ;; to the stat function. fstat is different from stat and ;; lstat since it takes an fd for the first arg instead of ;; string. - `(with-alien ((dev u-int64-t) - (ino u-int64-t) + `(with-alien ((dev c-call:long-long) + (ino c-call:unsigned-long-long) (mode c-call:unsigned-int) - (nlink u-int64-t) + (nlink c-call:unsigned-long-long) (uid c-call:unsigned-int) (gid c-call:unsigned-int) - (rdev u-int64-t) - (size int64-t) - (atime int64-t) - (mtime int64-t) - (ctime int64-t) + (rdev c-call:unsigned-long-long) + (size c-call:long-long) + (atime c-call:long-long) + (mtime c-call:long-long) + (ctime c-call:long-long) (blksize c-call:long) - (blocks int64-t)) + (blocks c-call:long-long)) (let ((result (alien-funcall (extern-alien ,c-func-name (function int ,first-arg-type - (* u-int64-t) - (* u-int64-t) + (* c-call:long-long) + (* c-call:unsigned-long-long) (* c-call:unsigned-int) - (* u-int64-t) + (* c-call:unsigned-long-long) (* c-call:unsigned-int) (* c-call:unsigned-int) - (* u-int64-t) - (* int64-t) - (* int64-t) - (* int64-t) - (* int64-t) + (* c-call:unsigned-long-long) + (* c-call:long-long) + (* c-call:long-long) + (* c-call:long-long) + (* c-call:long-long) (* c-call:long) - (* int64-t))) + (* c-call:long-long))) ,first-arg (addr dev) (addr ino) @@ -1421,7 +1421,7 @@ (declare (type unix-pathname name)) (when (string= name "") (setf name ".")) - (call-stat "unix_stat" c-call:c-string (%name->file name))) + (call-stat "os_stat" c-call:c-string (%name->file name)))
(defun unix-lstat (name) "Unix-lstat is similar to unix-stat except the specified @@ -1443,7 +1443,7 @@ st_blocks Number of blocks allocated. (Block size is implementation dependent.) " (declare (type unix-pathname name)) - (call-stat "unix_lstat" c-call:c-string (%name->file name))) + (call-stat "os_lstat" c-call:c-string (%name->file name)))
(defun unix-fstat (fd) _N"Unix-fstat is similar to unix-stat except the file is specified @@ -1465,7 +1465,7 @@ st_blocks Number of blocks allocated. (Block size is implementation dependent.) " (declare (type unix-fd fd)) - (call-stat "unix_fstat" int fd))) + (call-stat "os_fstat" int fd)))
(def-alien-type nil (struct rusage
===================================== src/lisp/os-common.c ===================================== @@ -5,12 +5,6 @@
*/
-#ifdef __linux__ -/* Needed to get 64-bit objects for stat and friends on Linux. */ -#define _LARGEFILE_SOURCE -#define _FILE_OFFSET_BITS 64 -#endif - #include <errno.h> #include <math.h> #include <netdb.h> @@ -606,17 +600,21 @@ os_sleep(double seconds) * function that works across all OSes. */ int -unix_stat(const char* path, u_int64_t *dev, u_int64_t *ino, unsigned int *mode, u_int64_t *nlink, - unsigned int *uid, unsigned int *gid, u_int64_t *rdev, int64_t *size, - int64_t *atime, int64_t *mtime, int64_t *ctime, - long *blksize, int64_t *blocks) +os_stat(const char* path, u_int64_t *dev, u_int64_t *ino, unsigned int *mode, u_int64_t *nlink, + unsigned int *uid, unsigned int *gid, u_int64_t *rdev, int64_t *size, + int64_t *atime, int64_t *mtime, int64_t *ctime, + long *blksize, int64_t *blocks) { int rc; struct stat buf;
rc = stat(path, &buf);
-#if 0 + if (rc != 0) { + return rc; + } + +#if 1 /* * Useful prints to see the actual size of the various * fields. Helpful for porting this to other OSes that we haven't @@ -655,16 +653,20 @@ unix_stat(const char* path, u_int64_t *dev, u_int64_t *ino, unsigned int *mode, }
int -unix_fstat(int fd, u_int64_t *dev, u_int64_t *ino, unsigned int *mode, u_int64_t *nlink, - unsigned int *uid, unsigned int *gid, u_int64_t *rdev, int64_t *size, - int64_t *atime, int64_t *mtime, int64_t *ctime, - long *blksize, int64_t *blocks) +os_fstat(int fd, u_int64_t *dev, u_int64_t *ino, unsigned int *mode, u_int64_t *nlink, + unsigned int *uid, unsigned int *gid, u_int64_t *rdev, int64_t *size, + int64_t *atime, int64_t *mtime, int64_t *ctime, + long *blksize, int64_t *blocks) { int rc; struct stat buf;
rc = fstat(fd, &buf);
+ if (rc != 0) { + return rc; + } + *dev = buf.st_dev; *ino = buf.st_ino; *mode = buf.st_mode; @@ -683,16 +685,20 @@ unix_fstat(int fd, u_int64_t *dev, u_int64_t *ino, unsigned int *mode, u_int64_t }
int -unix_lstat(const char* path, u_int64_t *dev, u_int64_t *ino, unsigned int *mode, u_int64_t *nlink, - unsigned int *uid, unsigned int *gid, u_int64_t *rdev, int64_t *size, - int64_t *atime, int64_t *mtime, int64_t *ctime, - long *blksize, int64_t *blocks) +os_lstat(const char* path, u_int64_t *dev, u_int64_t *ino, unsigned int *mode, u_int64_t *nlink, + unsigned int *uid, unsigned int *gid, u_int64_t *rdev, int64_t *size, + int64_t *atime, int64_t *mtime, int64_t *ctime, + long *blksize, int64_t *blocks) { int rc; struct stat buf;
rc = lstat(path, &buf);
+ if (rc != 0) { + return rc; + } + *dev = buf.st_dev; *ino = buf.st_ino; *mode = buf.st_mode;
View it on GitLab: https://gitlab.common-lisp.net/cmucl/cmucl/-/commit/6f0f8c0501d22d6e63d237fd...