[Git][cmucl/cmucl][issue-125-unix-stat-wrong] Clean up impl more
Raymond Toy (@rtoy)
gitlab at common-lisp.net
Wed Aug 3 19:38:32 UTC 2022
Raymond Toy pushed to branch issue-125-unix-stat-wrong at cmucl / cmucl
Commits:
50da071d by Raymond Toy at 2022-08-03T12:38:09-07:00
Clean up impl more
* Move the stat functions from unix.c to os-common.c and remove unix.c.
* Update Linux config files appropriately.
* Use the same unix_stat function everywhere, so we can remove all of
the different OS-specific definitions of struct stat that we no
longer need.
- - - - -
6 changed files:
- src/code/unix.lisp
- src/i18n/locale/cmucl-unix.pot
- src/lisp/Config.x86_linux
- src/lisp/Config.x86_linux_clang
- src/lisp/os-common.c
- − src/lisp/unix.c
Changes:
=====================================
src/code/unix.lisp
=====================================
@@ -1346,232 +1346,6 @@
(d-name (array char 256)))) ; name must be no longer than this
-#+(and bsd (not netbsd))
-(def-alien-type nil
- (struct stat
- (st-dev dev-t)
- (st-ino ino-t)
- (st-mode mode-t)
- (st-nlink nlink-t)
- (st-uid uid-t)
- (st-gid gid-t)
- (st-rdev dev-t)
- (st-atime (struct timespec-t))
- (st-mtime (struct timespec-t))
- (st-ctime (struct timespec-t))
- (st-size off-t)
- (st-blocks off-t)
- (st-blksize unsigned-long)
- (st-flags unsigned-long)
- (st-gen unsigned-long)
- (st-lspare long)
- (st-qspare (array long 4))))
-
-#+svr4
-(def-alien-type nil
- (struct stat
- (st-dev dev-t)
- (st-pad1 #-linux (array long 3) #+linux unsigned-short)
- (st-ino ino-t)
- (st-mode #-linux unsigned-long #+linux unsigned-short)
- (st-nlink #-linux short #+linux unsigned-short)
- (st-uid #-linux uid-t #+linux unsigned-short)
- (st-gid #-linux gid-t #+linux unsigned-short)
- (st-rdev dev-t)
- (st-pad2 #-linux (array long 2) #+linux unsigned-short)
- (st-size off-t)
- #-linux (st-pad3 long)
- #+linux (st-blksize unsigned-long)
- #+linux (st-blocks unsigned-long)
- #-linux (st-atime (struct timestruc-t))
- #+linux (st-atime unsigned-long)
- #+linux (unused-1 unsigned-long)
- #-linux (st-mtime (struct timestruc-t))
- #+linux (st-mtime unsigned-long)
- #+linux (unused-2 unsigned-long)
- #-linux (st-ctime (struct timestruc-t))
- #+linux (st-ctime unsigned-long)
- #+linux (unused-3 unsigned-long)
- #+linux (unused-4 unsigned-long)
- #+linux (unused-5 unsigned-long)
- #-linux(st-blksize long)
- #-linux (st-blocks long)
- #-linux (st-fstype (array char 16))
- #-linux (st-pad4 (array long 8))))
-
-#+(and nil linux)
-(def-alien-type nil
- (struct stat
- (st-dev dev-t)
- #-(or alpha amd64) (st-pad1 unsigned-short)
- (st-ino ino64-t)
- #+alpha (st-pad1 unsigned-int)
- #-amd64 (st-mode mode-t)
- (st-nlink nlink-t)
- #+amd64 (st-mode mode-t)
- (st-uid uid-t)
- (st-gid gid-t)
- (st-rdev dev-t)
- #-alpha (st-pad2 unsigned-short)
- (st-size off-t)
- #-alpha (st-blksize unsigned-long)
- #-alpha (st-blocks blkcnt-t)
- (st-atime time-t)
- #-alpha (unused-1 unsigned-long)
- (st-mtime time-t)
- #-alpha (unused-2 unsigned-long)
- (st-ctime time-t)
- #+alpha (st-blocks int)
- #+alpha (st-pad2 unsigned-int)
- #+alpha (st-blksize unsigned-int)
- #+alpha (st-flags unsigned-int)
- #+alpha (st-gen unsigned-int)
- #+alpha (st-pad3 unsigned-int)
- #+alpha (unused-1 unsigned-long)
- #+alpha (unused-2 unsigned-long)
- (unused-3 unsigned-long)
- (unused-4 unsigned-long)
- #-alpha (unused-5 unsigned-long)))
-
-;;; 64-bit stat for Solaris
-#+solaris
-(def-alien-type nil
- (struct stat64
- (st-dev dev-t)
- (st-pad1 (array long 3)) ; Pad so ino is 64-bit aligned
- (st-ino ino64-t)
- (st-mode unsigned-long)
- (st-nlink short)
- (st-uid uid-t)
- (st-gid gid-t)
- (st-rdev dev-t)
- (st-pad2 (array long 3)) ; Pad so size is 64-bit aligned
- (st-size off64-t)
- (st-atime (struct timestruc-t))
- (st-mtime (struct timestruc-t))
- (st-ctime (struct timestruc-t))
- (st-blksize long)
- (st-pad3 (array long 1)) ; Pad so blocks is 64-bit aligned
- (st-blocks blkcnt64-t)
- (st-fstype (array char 16))
- (st-pad4 (array long 8))))
-
-#+netbsd
-(def-alien-type nil
- (struct stat
- (st-dev dev-t)
- (st-mode mode-t)
- (st-ino ino-t)
- (st-nlink nlink-t)
- (st-uid uid-t)
- (st-gid gid-t)
- (st-rdev dev-t)
- (st-atime (struct timespec-t))
- (st-mtime (struct timespec-t))
- (st-ctime (struct timespec-t))
- (st-birthtime (struct timespec-t))
- (st-size off-t)
- (st-blocks off-t)
- (st-blksize long)
- (st-flags unsigned-long)
- (st-gen unsigned-long)
- (st-spare (array unsigned-long 2))))
-
-#-linux
-(defmacro extract-stat-results (buf)
- `(values T
- (slot ,buf 'st-dev)
- (slot ,buf 'st-ino)
- (slot ,buf 'st-mode)
- (slot ,buf 'st-nlink)
- (slot ,buf 'st-uid)
- (slot ,buf 'st-gid)
- (slot ,buf 'st-rdev)
- (slot ,buf 'st-size)
- #-(or svr4 BSD) (slot ,buf 'st-atime)
- #+svr4 (slot (slot ,buf 'st-atime) 'tv-sec)
- #+BSD (slot (slot ,buf 'st-atime) 'ts-sec)
- #-(or svr4 BSD)(slot ,buf 'st-mtime)
- #+svr4 (slot (slot ,buf 'st-mtime) 'tv-sec)
- #+BSD(slot (slot ,buf 'st-mtime) 'ts-sec)
- #-(or svr4 BSD) (slot ,buf 'st-ctime)
- #+svr4 (slot (slot ,buf 'st-ctime) 'tv-sec)
- #+BSD(slot (slot ,buf 'st-ctime) 'ts-sec)
- #+netbsd (slot (slot ,buf 'st-birthtime) 'ts-sec)
- (slot ,buf 'st-blksize)
- (slot ,buf 'st-blocks)))
-
-#+linux
-(defmacro extract-stat-results (buf)
- `(values T
- #+(or alpha amd64)
- (slot ,buf 'st-dev)
- #-(or alpha amd64)
- (+ (deref (slot ,buf 'st-dev) 0)
- (* (+ +max-u-long+ 1)
- (deref (slot ,buf 'st-dev) 1))) ;;; let's hope this works..
- (slot ,buf 'st-ino)
- (slot ,buf 'st-mode)
- (slot ,buf 'st-nlink)
- (slot ,buf 'st-uid)
- (slot ,buf 'st-gid)
- #+(or alpha amd64)
- (slot ,buf 'st-rdev)
- #-(or alpha amd64)
- (+ (deref (slot ,buf 'st-rdev) 0)
- (* (+ +max-u-long+ 1)
- (deref (slot ,buf 'st-rdev) 1))) ;;; let's hope this works..
- (slot ,buf 'st-size)
- (slot ,buf 'st-atime)
- (slot ,buf 'st-mtime)
- (slot ,buf 'st-ctime)
- (slot ,buf 'st-blksize)
- (slot ,buf 'st-blocks)))
-
-#-(or linux solaris)
-(progn
-(defun unix-stat (name)
- _N"Unix-stat retrieves information about the specified
- file returning them in the form of multiple values.
- See the UNIX Programmer's Manual for a description
- of the values returned. If the call fails, then NIL
- and an error number is returned instead."
- (declare (type unix-pathname name))
- (when (string= name "")
- (setf name "."))
- (with-alien ((buf (struct stat)))
- (syscall (#+linux "stat64" #+netbsd "__stat50" #-(or linux netbsd) "stat"
- c-string (* (struct stat)))
- (extract-stat-results buf)
- (%name->file name) (addr buf))))
-
-(defun unix-lstat (name)
- _N"Unix-lstat is similar to unix-stat except the specified
- file must be a symbolic link."
- (declare (type unix-pathname name))
- (with-alien ((buf (struct stat)))
- (syscall (#+linux "lstat64" #+netbsd "__lstat50" #-(or linux netbsd) "lstat"
- c-string (* (struct stat)))
- (extract-stat-results buf)
- (%name->file name) (addr buf))))
-
-(defun unix-fstat (fd)
- _N"Unix-fstat is similar to unix-stat except the file is specified
- by the file descriptor fd."
- (declare (type unix-fd fd))
- (with-alien ((buf (struct stat)))
- (syscall (#+linux "fstat64" #+netbsd "__fstat50" #-(or linux netbsd) "fstat"
- int (* (struct stat)))
- (extract-stat-results buf)
- fd (addr buf))))
-)
-
-;; On linux we call out to our own C routine to return the appropriate
-;; parts so that we don't have to mess around with making sure the
-;; struct stat is consistent with the library.
-;;
-;; This should be updated so that all OSes do this.
-#+linux
(macrolet
((call-stat (c-func-name first-arg-type first-arg)
;; Call the stat function named C-FUNC-NAME. The type of the
=====================================
src/i18n/locale/cmucl-unix.pot
=====================================
@@ -497,14 +497,14 @@ msgstr ""
#: src/code/unix.lisp
msgid ""
-"Unix-lstat is similar to unix-stat except the specified\n"
-" file must be a symbolic link."
+"Unix-fstat is similar to unix-stat except the file is specified\n"
+" by the file descriptor fd."
msgstr ""
#: src/code/unix.lisp
msgid ""
-"Unix-fstat is similar to unix-stat except the file is specified\n"
-" by the file descriptor fd."
+"Unix-lstat is similar to unix-stat except the specified\n"
+" file must be a symbolic link."
msgstr ""
#: src/code/unix.lisp
=====================================
src/lisp/Config.x86_linux
=====================================
@@ -7,7 +7,7 @@ CFLAGS += -rdynamic -march=pentium4 -mfpmath=sse -mtune=generic
UNDEFSYMPATTERN = -Xlinker -u -Xlinker &
ASSEM_SRC += linux-stubs.S
-OS_SRC += Linux-os.c elf.c unix.c
+OS_SRC += Linux-os.c elf.c
OS_LIBS = -ldl
OS_LINK_FLAGS = -m32 -rdynamic -Xlinker --export-dynamic -Xlinker -Map -Xlinker foo
OS_LINK_FLAGS += -Wl,-z,noexecstack
=====================================
src/lisp/Config.x86_linux_clang
=====================================
@@ -12,7 +12,7 @@ CFLAGS += -msse2 -mtune=pentium4 -ftrapping-math
UNDEFSYMPATTERN = -Xlinker -u -Xlinker &
ASSEM_SRC += linux-stubs.S
-OS_SRC += Linux-os.c elf.c unix.c
+OS_SRC += Linux-os.c elf.c
OS_LIBS = -ldl
OS_LINK_FLAGS = -m32 -rdynamic -Xlinker --export-dynamic -Xlinker -Map -Xlinker foo
OS_LINK_FLAGS += -Wl,-z,noexecstack
=====================================
src/lisp/os-common.c
=====================================
@@ -5,12 +5,17 @@
*/
+#define _LARGEFILE_SOURCE
+#define _FILE_OFFSET_BITS 64
+
+#include <stdio.h>
#include <errno.h>
#include <math.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
+#include <sys/stat.h>
#include "os.h"
#include "internals.h"
@@ -589,3 +594,98 @@ os_sleep(double seconds)
requested = remaining;
}
}
+
+int unix_stat(const char* path, dev_t *dev, ino_t *ino, mode_t *mode, nlink_t *nlink,
+ uid_t *uid, gid_t *gid, dev_t *rdev, off_t *size,
+ time_t *atime, time_t *mtime, time_t *ctime,
+ long *blksize, off_t *blocks)
+{
+ int rc;
+ struct stat buf;
+
+ rc = stat(path, &buf);
+
+ fprintf(stderr, "size dev %d\n", sizeof(buf.st_dev));
+ fprintf(stderr, "size ino %d\n", sizeof(buf.st_ino));
+ fprintf(stderr, "size mode %d\n", sizeof(buf.st_mode));
+ fprintf(stderr, "size nlink %d\n", sizeof(buf.st_nlink));
+ fprintf(stderr, "size uid %d\n", sizeof(buf.st_uid));
+ fprintf(stderr, "size gid %d\n", sizeof(buf.st_gid));
+ fprintf(stderr, "size rdev %d\n", sizeof(buf.st_rdev));
+ fprintf(stderr, "size size %d\n", sizeof(buf.st_size));
+ fprintf(stderr, "size atime %d\n", sizeof(buf.st_atime));
+ fprintf(stderr, "size mtime %d\n", sizeof(buf.st_mtime));
+ fprintf(stderr, "size ctime %d\n", sizeof(buf.st_ctime));
+ fprintf(stderr, "size blksize %d\n", sizeof(buf.st_blksize));
+ fprintf(stderr, "size blocks %d\n", sizeof(buf.st_blocks));
+
+ *dev = buf.st_dev;
+ *ino = buf.st_ino;
+ *mode = buf.st_mode;
+ *nlink = buf.st_nlink;
+ *uid = buf.st_uid;
+ *gid = buf.st_gid;
+ *rdev = buf.st_rdev;
+ *size = buf.st_size;
+ *atime = buf.st_atime;
+ *mtime = buf.st_mtime;
+ *ctime = buf.st_ctime;
+ *blksize = buf.st_blksize;
+ *blocks = buf.st_blocks;
+
+ return rc;
+}
+
+int unix_fstat(int fd, dev_t *dev, ino_t *ino, mode_t *mode, nlink_t *nlink,
+ uid_t *uid, gid_t *gid, dev_t *rdev, off_t *size,
+ time_t *atime, time_t *mtime, time_t *ctime,
+ long *blksize, off_t *blocks)
+{
+ int rc;
+ struct stat buf;
+
+ rc = fstat(fd, &buf);
+
+ *dev = buf.st_dev;
+ *ino = buf.st_ino;
+ *mode = buf.st_mode;
+ *nlink = buf.st_nlink;
+ *uid = buf.st_uid;
+ *gid = buf.st_gid;
+ *rdev = buf.st_rdev;
+ *size = buf.st_size;
+ *atime = buf.st_atime;
+ *mtime = buf.st_mtime;
+ *ctime = buf.st_ctime;
+ *blksize = buf.st_blksize;
+ *blocks = buf.st_blocks;
+
+ return rc;
+}
+
+int unix_lstat(const char* path, dev_t *dev, ino_t *ino, mode_t *mode, nlink_t *nlink,
+ uid_t *uid, gid_t *gid, dev_t *rdev, off_t *size,
+ time_t *atime, time_t *mtime, time_t *ctime,
+ long *blksize, off_t *blocks)
+{
+ int rc;
+ struct stat buf;
+
+ rc = lstat(path, &buf);
+
+ *dev = buf.st_dev;
+ *ino = buf.st_ino;
+ *mode = buf.st_mode;
+ *nlink = buf.st_nlink;
+ *uid = buf.st_uid;
+ *gid = buf.st_gid;
+ *rdev = buf.st_rdev;
+ *size = buf.st_size;
+ *atime = buf.st_atime;
+ *mtime = buf.st_mtime;
+ *ctime = buf.st_ctime;
+ *blksize = buf.st_blksize;
+ *blocks = buf.st_blocks;
+
+ return rc;
+}
=====================================
src/lisp/unix.c deleted
=====================================
@@ -1,110 +0,0 @@
-/*
- * C interfaces to unix syscalls
- */
-
-/* We want to support large files */
-
-#define _LARGEFILE_SOURCE
-#define _FILE_OFFSET_BITS 64
-
-#include <stdio.h>
-#include <sys/stat.h>
-
-int unix_stat(const char* path, dev_t *dev, ino_t *ino, mode_t *mode, nlink_t *nlink,
- uid_t *uid, gid_t *gid, dev_t *rdev, off_t *size,
- time_t *atime, time_t *mtime, time_t *ctime,
- long *blksize, off_t *blocks)
-{
- int rc;
- struct stat buf;
-
- rc = stat(path, &buf);
-
- fprintf(stderr, "size dev %d\n", sizeof(buf.st_dev));
- fprintf(stderr, "size ino %d\n", sizeof(buf.st_ino));
- fprintf(stderr, "size mode %d\n", sizeof(buf.st_mode));
- fprintf(stderr, "size nlink %d\n", sizeof(buf.st_nlink));
- fprintf(stderr, "size uid %d\n", sizeof(buf.st_uid));
- fprintf(stderr, "size gid %d\n", sizeof(buf.st_gid));
- fprintf(stderr, "size rdev %d\n", sizeof(buf.st_rdev));
- fprintf(stderr, "size size %d\n", sizeof(buf.st_size));
- fprintf(stderr, "size atime %d\n", sizeof(buf.st_atime));
- fprintf(stderr, "size mtime %d\n", sizeof(buf.st_mtime));
- fprintf(stderr, "size ctime %d\n", sizeof(buf.st_ctime));
- fprintf(stderr, "size blksize %d\n", sizeof(buf.st_blksize));
- fprintf(stderr, "size blocks %d\n", sizeof(buf.st_blocks));
-
-
- *dev = buf.st_dev;
- *ino = buf.st_ino;
- *mode = buf.st_mode;
- *nlink = buf.st_nlink;
- *uid = buf.st_uid;
- *gid = buf.st_gid;
- *rdev = buf.st_rdev;
- *size = buf.st_size;
- *atime = buf.st_atime;
- *mtime = buf.st_mtime;
- *ctime = buf.st_ctime;
- *blksize = buf.st_blksize;
- *blocks = buf.st_blocks;
-
- return rc;
-}
-
-int unix_fstat(int fd, dev_t *dev, ino_t *ino, mode_t *mode, nlink_t *nlink,
- uid_t *uid, gid_t *gid, dev_t *rdev, off_t *size,
- time_t *atime, time_t *mtime, time_t *ctime,
- long *blksize, off_t *blocks)
-{
- int rc;
- struct stat buf;
-
- rc = fstat(fd, &buf);
-
- *dev = buf.st_dev;
- *ino = buf.st_ino;
- *mode = buf.st_mode;
- *nlink = buf.st_nlink;
- *uid = buf.st_uid;
- *gid = buf.st_gid;
- *rdev = buf.st_rdev;
- *size = buf.st_size;
- *atime = buf.st_atime;
- *mtime = buf.st_mtime;
- *ctime = buf.st_ctime;
- *blksize = buf.st_blksize;
- *blocks = buf.st_blocks;
-
- return rc;
-}
-
-int unix_lstat(const char* path, dev_t *dev, ino_t *ino, mode_t *mode, nlink_t *nlink,
- uid_t *uid, gid_t *gid, dev_t *rdev, off_t *size,
- time_t *atime, time_t *mtime, time_t *ctime,
- long *blksize, off_t *blocks)
-{
- int rc;
- struct stat buf;
-
- rc = lstat(path, &buf);
-
- *dev = buf.st_dev;
- *ino = buf.st_ino;
- *mode = buf.st_mode;
- *nlink = buf.st_nlink;
- *uid = buf.st_uid;
- *gid = buf.st_gid;
- *rdev = buf.st_rdev;
- *size = buf.st_size;
- *atime = buf.st_atime;
- *mtime = buf.st_mtime;
- *ctime = buf.st_ctime;
- *blksize = buf.st_blksize;
- *blocks = buf.st_blocks;
-
- return rc;
-}
-
-
-
View it on GitLab: https://gitlab.common-lisp.net/cmucl/cmucl/-/commit/50da071db677ed03e80542216c51047477006634
--
View it on GitLab: https://gitlab.common-lisp.net/cmucl/cmucl/-/commit/50da071db677ed03e80542216c51047477006634
You're receiving this email because of your account on gitlab.common-lisp.net.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.common-lisp.net/pipermail/cmucl-cvs/attachments/20220803/22f5c24f/attachment-0001.html>
More information about the cmucl-cvs
mailing list