Raymond Toy pushed to branch issue-125-unix-stat-wrong at cmucl / cmucl

Commits:

2 changed files:

Changes:

  • src/code/unix.lisp
    ... ... @@ -1337,37 +1337,37 @@
    1337 1337
            ;; to the stat function.  fstat is different from stat and
    
    1338 1338
            ;; lstat since it takes an fd for the first arg instead of
    
    1339 1339
            ;; string.
    
    1340
    -       `(with-alien ((dev u-int64-t)
    
    1341
    -		     (ino u-int64-t)
    
    1340
    +       `(with-alien ((dev c-call:long-long)
    
    1341
    +		     (ino c-call:unsigned-long-long)
    
    1342 1342
     		     (mode c-call:unsigned-int)
    
    1343
    -		     (nlink u-int64-t)
    
    1343
    +		     (nlink c-call:unsigned-long-long)
    
    1344 1344
     		     (uid c-call:unsigned-int)
    
    1345 1345
     		     (gid c-call:unsigned-int)
    
    1346
    -		     (rdev u-int64-t)
    
    1347
    -		     (size int64-t)
    
    1348
    -		     (atime int64-t)
    
    1349
    -		     (mtime int64-t)
    
    1350
    -		     (ctime int64-t)
    
    1346
    +		     (rdev c-call:unsigned-long-long)
    
    1347
    +		     (size c-call:long-long)
    
    1348
    +		     (atime c-call:long-long)
    
    1349
    +		     (mtime c-call:long-long)
    
    1350
    +		     (ctime c-call:long-long)
    
    1351 1351
     		     (blksize c-call:long)
    
    1352
    -		     (blocks int64-t))
    
    1352
    +		     (blocks c-call:long-long))
    
    1353 1353
     	  (let ((result
    
    1354 1354
     		  (alien-funcall
    
    1355 1355
     		   (extern-alien ,c-func-name
    
    1356 1356
     				 (function int
    
    1357 1357
     					   ,first-arg-type
    
    1358
    -					   (* u-int64-t)
    
    1359
    -					   (* u-int64-t)
    
    1358
    +					   (* c-call:long-long)
    
    1359
    +					   (* c-call:unsigned-long-long)
    
    1360 1360
     					   (* c-call:unsigned-int)
    
    1361
    -					   (* u-int64-t)
    
    1361
    +					   (* c-call:unsigned-long-long)
    
    1362 1362
     					   (* c-call:unsigned-int)
    
    1363 1363
     					   (* c-call:unsigned-int)
    
    1364
    -					   (* u-int64-t)
    
    1365
    -					   (* int64-t)
    
    1366
    -					   (* int64-t)
    
    1367
    -					   (* int64-t)
    
    1368
    -					   (* int64-t)
    
    1364
    +					   (* c-call:unsigned-long-long)
    
    1365
    +					   (* c-call:long-long)
    
    1366
    +					   (* c-call:long-long)
    
    1367
    +					   (* c-call:long-long)
    
    1368
    +					   (* c-call:long-long)
    
    1369 1369
     					   (* c-call:long)
    
    1370
    -					   (* int64-t)))
    
    1370
    +					   (* c-call:long-long)))
    
    1371 1371
     		   ,first-arg
    
    1372 1372
     		   (addr dev)
    
    1373 1373
     		   (addr ino)
    
    ... ... @@ -1421,7 +1421,7 @@
    1421 1421
         (declare (type unix-pathname name))
    
    1422 1422
         (when (string= name "")
    
    1423 1423
           (setf name "."))
    
    1424
    -    (call-stat "unix_stat" c-call:c-string (%name->file name)))
    
    1424
    +    (call-stat "os_stat" c-call:c-string (%name->file name)))
    
    1425 1425
     
    
    1426 1426
       (defun unix-lstat (name)
    
    1427 1427
         "Unix-lstat is similar to unix-stat except the specified
    
    ... ... @@ -1443,7 +1443,7 @@
    1443 1443
          st_blocks     Number of blocks allocated. (Block size is implementation dependent.)
    
    1444 1444
     "
    
    1445 1445
         (declare (type unix-pathname name))
    
    1446
    -    (call-stat "unix_lstat" c-call:c-string (%name->file name)))
    
    1446
    +    (call-stat "os_lstat" c-call:c-string (%name->file name)))
    
    1447 1447
     
    
    1448 1448
       (defun unix-fstat (fd)
    
    1449 1449
         _N"Unix-fstat is similar to unix-stat except the file is specified
    
    ... ... @@ -1465,7 +1465,7 @@
    1465 1465
          st_blocks     Number of blocks allocated. (Block size is implementation dependent.)
    
    1466 1466
     "
    
    1467 1467
         (declare (type unix-fd fd))
    
    1468
    -    (call-stat "unix_fstat" int fd)))
    
    1468
    +    (call-stat "os_fstat" int fd)))
    
    1469 1469
     
    
    1470 1470
     (def-alien-type nil
    
    1471 1471
       (struct rusage
    

  • src/lisp/os-common.c
    ... ... @@ -5,12 +5,6 @@
    5 5
     
    
    6 6
     */
    
    7 7
     
    
    8
    -#ifdef __linux__
    
    9
    -/* Needed to get 64-bit objects for stat and friends on Linux. */
    
    10
    -#define _LARGEFILE_SOURCE
    
    11
    -#define _FILE_OFFSET_BITS 64
    
    12
    -#endif
    
    13
    -
    
    14 8
     #include <errno.h>
    
    15 9
     #include <math.h>
    
    16 10
     #include <netdb.h>
    
    ... ... @@ -606,17 +600,21 @@ os_sleep(double seconds)
    606 600
      * function that works across all OSes.
    
    607 601
      */
    
    608 602
     int
    
    609
    -unix_stat(const char* path, u_int64_t *dev, u_int64_t *ino, unsigned int *mode, u_int64_t *nlink,
    
    610
    -          unsigned int *uid, unsigned int *gid, u_int64_t *rdev, int64_t *size,
    
    611
    -          int64_t *atime, int64_t *mtime, int64_t *ctime,
    
    612
    -          long *blksize, int64_t *blocks)
    
    603
    +os_stat(const char* path, u_int64_t *dev, u_int64_t *ino, unsigned int *mode, u_int64_t *nlink,
    
    604
    +        unsigned int *uid, unsigned int *gid, u_int64_t *rdev, int64_t *size,
    
    605
    +        int64_t *atime, int64_t *mtime, int64_t *ctime,
    
    606
    +        long *blksize, int64_t *blocks)
    
    613 607
     {
    
    614 608
         int rc;
    
    615 609
         struct stat buf;
    
    616 610
     
    
    617 611
         rc = stat(path, &buf);
    
    618 612
     
    
    619
    -#if 0
    
    613
    +    if (rc != 0) {
    
    614
    +        return rc;
    
    615
    +    }
    
    616
    +        
    
    617
    +#if 1
    
    620 618
         /*
    
    621 619
          * Useful prints to see the actual size of the various
    
    622 620
          * 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,
    655 653
     }
    
    656 654
     
    
    657 655
     int
    
    658
    -unix_fstat(int fd, u_int64_t *dev, u_int64_t *ino, unsigned int *mode, u_int64_t *nlink,
    
    659
    -           unsigned int *uid, unsigned int *gid, u_int64_t *rdev, int64_t *size,
    
    660
    -           int64_t *atime, int64_t *mtime, int64_t *ctime,
    
    661
    -           long *blksize, int64_t *blocks)
    
    656
    +os_fstat(int fd, u_int64_t *dev, u_int64_t *ino, unsigned int *mode, u_int64_t *nlink,
    
    657
    +         unsigned int *uid, unsigned int *gid, u_int64_t *rdev, int64_t *size,
    
    658
    +         int64_t *atime, int64_t *mtime, int64_t *ctime,
    
    659
    +         long *blksize, int64_t *blocks)
    
    662 660
     {
    
    663 661
         int rc;
    
    664 662
         struct stat buf;
    
    665 663
     
    
    666 664
         rc = fstat(fd, &buf);
    
    667 665
     
    
    666
    +    if (rc != 0) {
    
    667
    +        return rc;
    
    668
    +    }
    
    669
    +
    
    668 670
         *dev = buf.st_dev;
    
    669 671
         *ino = buf.st_ino;
    
    670 672
         *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
    683 685
     }
    
    684 686
     
    
    685 687
     int
    
    686
    -unix_lstat(const char* path, u_int64_t *dev, u_int64_t *ino, unsigned int *mode, u_int64_t *nlink,
    
    687
    -           unsigned int *uid, unsigned int *gid, u_int64_t *rdev, int64_t *size,
    
    688
    -           int64_t *atime, int64_t *mtime, int64_t *ctime,
    
    689
    -           long *blksize, int64_t *blocks)
    
    688
    +os_lstat(const char* path, u_int64_t *dev, u_int64_t *ino, unsigned int *mode, u_int64_t *nlink,
    
    689
    +         unsigned int *uid, unsigned int *gid, u_int64_t *rdev, int64_t *size,
    
    690
    +         int64_t *atime, int64_t *mtime, int64_t *ctime,
    
    691
    +         long *blksize, int64_t *blocks)
    
    690 692
     {
    
    691 693
         int rc;
    
    692 694
         struct stat buf;
    
    693 695
     
    
    694 696
         rc = lstat(path, &buf);
    
    695 697
     
    
    698
    +    if (rc != 0) {
    
    699
    +        return rc;
    
    700
    +    }
    
    701
    +
    
    696 702
         *dev = buf.st_dev;
    
    697 703
         *ino = buf.st_ino;
    
    698 704
         *mode = buf.st_mode;