1#include <stdio.h> 2#include <string.h> 3#include <errno.h> 4#include <libgen.h> 5#include <sys/stat.h> 6#include <sys/acl.h> 7 8const char *progname; 9 10int main(int argc, char *argv[]) 11{ 12 int n, ret = 0; 13 14 progname = basename(argv[0]); 15 16 if (argc == 1) { 17 printf("%s -- get access control lists of files\n" 18 "Usage: %s file ...\n", 19 progname, progname); 20 return 1; 21 } 22 23 for (n = 1; n < argc; n++) { 24 struct stat st; 25 acl_t acl, default_acl; 26 char *acl_text, *default_acl_text, *token; 27 28 if (stat(argv[n], &st) != 0) { 29 fprintf(stderr, "%s: %s: %s\n", 30 progname, argv[n], strerror(errno)); 31 ret = 1; 32 continue; 33 } 34 35 acl = acl_get_file(argv[n], ACL_TYPE_ACCESS); 36 if (acl == NULL) { 37 fprintf(stderr, "%s: getting acl of %s: %s\n", 38 progname, argv[n], strerror(errno)); 39 ret = 1; 40 continue; 41 } 42 acl_text = acl_to_text(acl, NULL); 43 acl_free(acl); 44 45 if (S_ISDIR(st.st_mode)) { 46 default_acl = acl_get_file(argv[n], ACL_TYPE_DEFAULT); 47 if (default_acl == NULL) { 48 acl_free(acl_text); 49 fprintf(stderr, "%s: getting default acl " 50 "of %s: %s\n", progname, argv[n], 51 strerror(errno)); 52 ret = 1; 53 continue; 54 } 55 default_acl_text = acl_to_text(default_acl, NULL); 56 acl_free(default_acl); 57 } 58 59 printf("# file: %s\n" 60 "# owner: %d\n" 61 "# group: %d\n" 62 "%s", 63 argv[n], st.st_uid, st.st_gid, acl_text); 64 65 if (S_ISDIR(st.st_mode)) { 66 token = strtok(default_acl_text, "\n"); 67 while (token) { 68 printf("default:%s\n", token); 69 token = strtok(NULL, "\n"); 70 } 71 } 72 printf("\n"); 73 74 acl_free(acl_text); 75 acl_free(default_acl_text); 76 } 77 return ret; 78} 79 80