diff options
Diffstat (limited to 'source4/utils')
-rw-r--r-- | source4/utils/config.mk | 15 | ||||
-rw-r--r-- | source4/utils/getntacl.c | 105 |
2 files changed, 117 insertions, 3 deletions
diff --git a/source4/utils/config.mk b/source4/utils/config.mk index 0d220c7c60..4cf807e2d7 100644 --- a/source4/utils/config.mk +++ b/source4/utils/config.mk @@ -83,3 +83,18 @@ REQUIRED_SUBSYSTEMS = \ LIB_SECURITY_NDR # End BINARY nmblookup ################################# + +################################# +# Start BINARY getnacl +[BINARY::getntacl] +OBJ_FILES = \ + utils/getntacl.o +REQUIRED_SUBSYSTEMS = \ + CONFIG \ + LIBBASIC \ + LIBTALLOC \ + NDR_XATTR \ + LIB_SECURITY \ + NDR_MISC +# End BINARY getntacl +################################# diff --git a/source4/utils/getntacl.c b/source4/utils/getntacl.c index 87cc280fcc..8d857d206a 100644 --- a/source4/utils/getntacl.c +++ b/source4/utils/getntacl.c @@ -3,7 +3,7 @@ Get NT ACLs from UNIX files. - Copyright (C) Tim Potter <tpot@samba.org> 2004 + Copyright (C) Tim Potter <tpot@samba.org> 2005 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -22,9 +22,108 @@ #include "includes.h" #include "system/filesys.h" +#include "libcli/security/security.h" +#include "librpc/gen_ndr/ndr_xattr.h" -int main(int argc, char **argv) +#if HAVE_XATTR_SUPPORT + +/* eww - crappy dependencies */ + +NTSTATUS samdb_privilege_setup(struct security_token *token) +{ + token->privilege_mask = 0; + return NT_STATUS_OK; +} + +static void ntacl_print_debug_helper(struct ndr_print *ndr, const char *format, ...) _PRINTF_ATTRIBUTE(2,3) { - printf("This utility disabled until rewritten\n"); + va_list ap; + char *s = NULL; + int i; + + va_start(ap, format); + vasprintf(&s, format, ap); + va_end(ap); + + for (i=0;i<ndr->depth;i++) { + printf(" "); + } + + printf("%s\n", s); + free(s); +} + +static NTSTATUS get_ntacl(char *filename, struct xattr_NTACL **ntacl, + ssize_t *ntacl_len) +{ + DATA_BLOB blob; + ssize_t size; + NTSTATUS result; + struct ndr_pull *ndr; + struct ndr_print *pr; + + *ntacl = talloc(NULL, struct xattr_NTACL); + + size = getxattr(filename, XATTR_NTACL_NAME, NULL, 0); + + if (size < 0) { + fprintf(stderr, "get_ntacl: %s\n", strerror(errno)); + return NT_STATUS_INTERNAL_ERROR; + } + + blob.data = talloc_size(*ntacl, size); + blob.length = getxattr(filename, XATTR_NTACL_NAME, blob.data, size); + + if (blob.length < 0) { + fprintf(stderr, "get_ntacl: %s\n", strerror(errno)); + return NT_STATUS_INTERNAL_ERROR; + } + + ndr = ndr_pull_init_blob(&blob, NULL); + + result = ndr_pull_xattr_NTACL(ndr, NDR_SCALARS|NDR_BUFFERS, *ntacl); + + if (NT_STATUS_IS_OK(result)) { + pr = talloc(*ntacl, struct ndr_print); + pr->print = ntacl_print_debug_helper; + pr->depth = 0; + pr->flags = 0; + + ndr_print_xattr_NTACL(pr, filename, *ntacl); + } + + return result; +} + +static void print_ntacl(struct xattr_NTACL *ntacl) +{ +} + +int main(int argc, char *argv[]) +{ + struct xattr_NTACL *ntacl; + ssize_t ntacl_len; + + if (argc != 2) { + fprintf(stderr, "Usage: getntacl FILENAME\n"); + return 1; + } + + + get_ntacl(argv[1], &ntacl, &ntacl_len); + + print_ntacl(ntacl); + + return 0; +} + +#else + +int main(int argc, char *argv[]) +{ + printf("getntacl: not compiled with xattr support!\n"); return 1; + } + +#endif |