[Git][cmucl/cmucl][issue-130-file-author-in-c] os_file_author returns a new string for the author

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... -- View it on GitLab: https://gitlab.common-lisp.net/cmucl/cmucl/-/commit/82e485f4e866c2c87643a171... You're receiving this email because of your account on gitlab.common-lisp.net.
participants (1)
-
Raymond Toy (@rtoy)