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
2 changed files:
Changes:
... | ... | @@ -1098,16 +1098,22 @@ optionally keeping some of the most recent old versions." |
1098 | 1098 | :pathname file
|
1099 | 1099 | :format-control (intl:gettext "~S doesn't exist.")
|
1100 | 1100 | :format-arguments (list file)))
|
1101 | - (alien:with-alien ((author (array c-call:char 1024)))
|
|
1102 | - (unix::syscall* ("os_file_author" c-call:c-string
|
|
1103 | - (alien:array c-call:char 1024)
|
|
1104 | - c-call:int)
|
|
1105 | - ;; Return
|
|
1106 | - (alien:cast author c-call:c-string)
|
|
1107 | - ;; Args
|
|
1108 | - (unix::%name->file name)
|
|
1109 | - author
|
|
1110 | - 1024)))))
|
|
1101 | + ;; unix-namestring converts "." to "". Convert it back to
|
|
1102 | + ;; "." so we can stat the current directory. (Perhaps
|
|
1103 | + ;; that's a bug in unix-namestring?)
|
|
1104 | + (when (string= name "")
|
|
1105 | + (setf name "."))
|
|
1106 | + (let (author)
|
|
1107 | + (unwind-protect
|
|
1108 | + (progn
|
|
1109 | + (setf author (alien:alien-funcall
|
|
1110 | + (alien:extern-alien "os_file_author"
|
|
1111 | + (function (alien:* c-call:c-string) c-call:c-string))
|
|
1112 | + (unix::%name->file name)))
|
|
1113 | + (unless (zerop (sap-int (alien:alien-sap author)))
|
|
1114 | + (alien:cast author c-call:c-string)))
|
|
1115 | + (when author
|
|
1116 | + (alien:free-alien author)))))))
|
|
1111 | 1117 | |
1112 | 1118 | |
1113 | 1119 | ;;;; DIRECTORY.
|
... | ... | @@ -717,36 +717,35 @@ os_lstat(const char* path, u_int64_t *dev, u_int64_t *ino, unsigned int *mode, u |
717 | 717 | return rc;
|
718 | 718 | }
|
719 | 719 | |
720 | -int
|
|
721 | -os_file_author(const char *path, char* author, int len)
|
|
720 | +/*
|
|
721 | + * Interface for file-author. Given a pathname, returns a new string
|
|
722 | + * holding the author of the file or NULL if some error occurred. The
|
|
723 | + * caller is responsible for freeing the memory used by the string.
|
|
724 | + */
|
|
725 | +char *
|
|
726 | +os_file_author(const char *path)
|
|
722 | 727 | {
|
723 | 728 | int rc;
|
724 | 729 | struct stat statbuf;
|
725 | 730 | char buf[16384];
|
731 | + char* author = NULL;
|
|
726 | 732 | struct passwd pwd;
|
727 | - struct passwd *result;
|
|
733 | + struct passwd *result = NULL;
|
|
728 | 734 |
|
729 | 735 | rc = stat(path, &statbuf);
|
730 | 736 | |
731 | 737 | if (rc != 0) {
|
732 | - return rc;
|
|
738 | + return NULL;
|
|
733 | 739 | }
|
734 | 740 | |
735 | 741 | rc = getpwuid_r(statbuf.st_uid, &pwd, buf, sizeof(buf), &result);
|
736 | 742 | |
737 | 743 | if (result) {
|
738 | - if (strlen(result->pw_name) < len) {
|
|
744 | + author = malloc(strlen(result->pw_name + 1));
|
|
745 | + if (author) {
|
|
739 | 746 | strcpy(author, result->pw_name);
|
740 | - } else {
|
|
741 | - strcpy(author, "");
|
|
742 | - rc = -1;
|
|
743 | 747 | }
|
744 | 748 | }
|
745 | 749 | |
746 | - return rc;
|
|
750 | + return author;
|
|
747 | 751 | } |
748 | - |
|
749 | -
|
|
750 | -
|
|
751 | -
|
|
752 | - |