Raymond Toy pushed to branch issue-130-file-author-in-c at cmucl / cmucl

Commits:

2 changed files:

Changes:

  • src/code/filesys.lisp
    ... ... @@ -1078,7 +1078,7 @@ optionally keeping some of the most recent old versions."
    1078 1078
     	;; unix-namestring converts "." to "".  Convert it back to
    
    1079 1079
     	;; "." so we can stat the current directory.  (Perhaps
    
    1080 1080
     	;; that's a bug in unix-namestring?)
    
    1081
    -	(when (string= name "")
    
    1081
    +	(when (zerop (length name))
    
    1082 1082
     	  (setf name "."))
    
    1083 1083
     	(let (author)
    
    1084 1084
     	  (unwind-protect
    

  • src/lisp/os-common.c
    ... ... @@ -5,6 +5,7 @@
    5 5
     
    
    6 6
     */
    
    7 7
     
    
    8
    +#include <assert.h>
    
    8 9
     #include <errno.h>
    
    9 10
     #include <math.h>
    
    10 11
     #include <netdb.h>
    
    ... ... @@ -738,31 +739,43 @@ os_file_author(const char *path)
    738 739
         if (stat(path, &sb) != 0) {
    
    739 740
             return NULL;
    
    740 741
         }
    
    742
    +
    
    741 743
         result = NULL;
    
    742 744
         buffer = initial;
    
    743
    -    size = ARRAYSIZE(initial);
    
    744
    -    assert(sysconf(_SC_GETPW_R_SIZE_MAX) <= 16384));
    
    745
    +    size = sizeof(initial) / sizeof(initial[0]);
    
    746
    +
    
    747
    +    /*
    
    748
    +     * Assume a buffer of size 16384 is enough to for getpwuid_r to do
    
    749
    +     * it's thing.
    
    750
    +     */
    
    751
    +    assert(sysconf(_SC_GETPW_R_SIZE_MAX) <= 16384);
    
    752
    +
    
    753
    +    /*
    
    754
    +     * Keep trying with larger buffers until a maximum is reached.
    
    755
    +     */
    
    745 756
         while (size <= 16384) {
    
    746 757
             switch (getpwuid_r(sb.st_uid, &pwd, buffer, size, &ppwd)) {
    
    747
    -        case 0:
    
    748
    -            /* Success, though we might not have a matching entry */
    
    749
    -            result = (ppwd == NULL) ? NULL : strdup(pwd.pw_name);
    
    750
    -            goto exit;
    
    751
    -        case ERANGE:
    
    752
    -            /* Buffer is too small, double its size and try again */
    
    753
    -            size *= 2;
    
    754
    -            obuffer = (buffer == initial) ? NULL : buffer;
    
    755
    -            if ((buffer = realloc(obuffer, size)) == NULL) {
    
    756
    -                free(obuffer); 
    
    757
    -                goto exit;
    
    758
    -            }
    
    759
    -            continue;
    
    760
    -        default:
    
    761
    -            /* All other errors */
    
    762
    -            goto exit;
    
    758
    +          case 0:
    
    759
    +              /* Success, though we might not have a matching entry */
    
    760
    +              result = (ppwd == NULL) ? NULL : strdup(pwd.pw_name);
    
    761
    +              goto exit;
    
    762
    +          case ERANGE:
    
    763
    +              /* Buffer is too small, double its size and try again */
    
    764
    +              size *= 2;
    
    765
    +              obuffer = (buffer == initial) ? NULL : buffer;
    
    766
    +              if ((buffer = realloc(obuffer, size)) == NULL) {
    
    767
    +                  free(obuffer); 
    
    768
    +                  goto exit;
    
    769
    +              }
    
    770
    +              continue;
    
    771
    +          default:
    
    772
    +              /* All other errors */
    
    773
    +              goto exit;
    
    763 774
             }
    
    764 775
         }
    
    765 776
     exit:
    
    777
    +    fprintf(stderr, "buffer, initial = %p %p\n", buffer, initial);
    
    778
    +    
    
    766 779
         free(buffer);
    
    767 780
         return result;
    
    768 781
     }