diff options
Diffstat (limited to 'winsup/utils/getfacl.c')
-rw-r--r-- | winsup/utils/getfacl.c | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/winsup/utils/getfacl.c b/winsup/utils/getfacl.c new file mode 100644 index 0000000..9bf7122 --- /dev/null +++ b/winsup/utils/getfacl.c @@ -0,0 +1,124 @@ + +#include <pwd.h> +#include <grp.h> +#include <stdio.h> +#include <unistd.h> +#include <getopt.h> +#include <sys/types.h> +#include <sys/acl.h> +#include <sys/stat.h> + +char *permstr (mode_t perm) +{ + static char pbuf[4]; + + pbuf[0] = (perm & S_IREAD) ? 'r' : '-'; + pbuf[1] = (perm & S_IWRITE) ? 'w' : '-'; + pbuf[2] = (perm & S_IEXEC) ? 'x' : '-'; + pbuf[3] = '\0'; + return pbuf; +} + +#if 0 +char *username (uid_t uid) +{ + static char ubuf[256]; + struct passwd *pw; + + if (pw = getpwuid (uid)) + strcpy (ubuf, pw->pw_name); + else + strcpy (ubuf, "<unknown>"); +} + +char *groupname (gid_t gid) +{ + static char gbuf[256]; + struct group *gr; + + if (gr = getgruid (gid)) + strcpy (gbuf, gr->gr_name); + else + strcpy (gbuf, "<unknown>"); +} +#endif + +int +main (int argc, char **argv) +{ + extern int optind; + int c, i; + int aopt = 0; + int dopt = 0; + int first = 1; + struct stat st; + aclent_t acls[MAX_ACL_ENTRIES]; + + while ((c = getopt (argc, argv, "ad")) != EOF) + switch (c) + { + case 'a': + aopt = 1; + break; + case 'd': + dopt = 1; + break; + default: + fprintf (stderr, "usage: %s [-ad] file...\n", argv[0]); + return 1; + } + while ((c = optind++) < argc) + { + if (stat (argv[c], &st)) + { + perror (argv[0]); + continue; + } + if (! first) + putchar ('\n'); + first = 0; + printf ("# file: %s\n", argv[c]); + printf ("# owner: %d\n", st.st_uid); + printf ("# group: %d\n", st.st_gid); + if ((c = acl (argv[c], GETACL, MAX_ACL_ENTRIES, acls)) < 0) + { + perror (argv[0]); + continue; + } + for (i = 0; i < c; ++i) + { + if (acls[i].a_type & ACL_DEFAULT) + { + if (aopt) + continue; + printf ("default:"); + } + else if (dopt) + continue; + switch (acls[i].a_type & ~ACL_DEFAULT) + { + case USER_OBJ: + printf ("user::"); + break; + case USER: + printf ("user:%d:", acls[i].a_id); + break; + case GROUP_OBJ: + printf ("group::"); + break; + case GROUP: + printf ("group:%d:", acls[i].a_id); + break; + case CLASS_OBJ: + printf ("mask::"); + break; + case OTHER_OBJ: + printf ("other::"); + break; + } + printf ("%s\n", permstr (acls[i].a_perm)); + } + } + return 0; +} + |