Raymond Toy pushed to branch issue-130-file-author-in-c at cmucl / cmucl
Commits: 82e485f4 by Raymond Toy at 2022-08-29T07:52:27-07:00 os_file_author returns a new string for the author
Update file-author to call os_file_author correctly.
- - - - -
2 changed files:
- src/code/filesys.lisp - src/lisp/os-common.c
Changes:
===================================== src/code/filesys.lisp ===================================== @@ -1098,16 +1098,22 @@ optionally keeping some of the most recent old versions." :pathname file :format-control (intl:gettext "~S doesn't exist.") :format-arguments (list file))) - (alien:with-alien ((author (array c-call:char 1024))) - (unix::syscall* ("os_file_author" c-call:c-string - (alien:array c-call:char 1024) - c-call:int) - ;; Return - (alien:cast author c-call:c-string) - ;; Args - (unix::%name->file name) - author - 1024))))) + ;; unix-namestring converts "." to "". Convert it back to + ;; "." so we can stat the current directory. (Perhaps + ;; that's a bug in unix-namestring?) + (when (string= name "") + (setf name ".")) + (let (author) + (unwind-protect + (progn + (setf author (alien:alien-funcall + (alien:extern-alien "os_file_author" + (function (alien:* c-call:c-string) c-call:c-string)) + (unix::%name->file name))) + (unless (zerop (sap-int (alien:alien-sap author))) + (alien:cast author c-call:c-string))) + (when author + (alien:free-alien author)))))))
;;;; DIRECTORY.
===================================== src/lisp/os-common.c ===================================== @@ -717,36 +717,35 @@ os_lstat(const char* path, u_int64_t *dev, u_int64_t *ino, unsigned int *mode, u return rc; }
-int -os_file_author(const char *path, char* author, int len) +/* + * Interface for file-author. Given a pathname, returns a new string + * holding the author of the file or NULL if some error occurred. The + * caller is responsible for freeing the memory used by the string. + */ +char * +os_file_author(const char *path) { int rc; struct stat statbuf; char buf[16384]; + char* author = NULL; struct passwd pwd; - struct passwd *result; + struct passwd *result = NULL;
rc = stat(path, &statbuf);
if (rc != 0) { - return rc; + return NULL; }
rc = getpwuid_r(statbuf.st_uid, &pwd, buf, sizeof(buf), &result);
if (result) { - if (strlen(result->pw_name) < len) { + author = malloc(strlen(result->pw_name + 1)); + if (author) { strcpy(author, result->pw_name); - } else { - strcpy(author, ""); - rc = -1; } }
- return rc; + return author; } - - - - -
View it on GitLab: https://gitlab.common-lisp.net/cmucl/cmucl/-/commit/82e485f4e866c2c87643a171...