summaryrefslogtreecommitdiff
path: root/source4/utils/getntacl.c
diff options
context:
space:
mode:
authorTim Potter <tpot@samba.org>2005-04-30 08:38:32 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 13:16:22 -0500
commit77255b7f9c5204c8ced541730562e028772b5d35 (patch)
tree10176b48289f4b648e8958a7dab15a23d0954aeb /source4/utils/getntacl.c
parent6b6bb89c91d412ef7d8c355fdd005de228af62c2 (diff)
downloadsamba-77255b7f9c5204c8ced541730562e028772b5d35.tar.gz
samba-77255b7f9c5204c8ced541730562e028772b5d35.tar.bz2
samba-77255b7f9c5204c8ced541730562e028772b5d35.zip
r6527: Resurrect getntacl utility program. At the moment we only display the
output of ndr_print_xattr_NTACL() to stdout. (This used to be commit b32c159c384c988385f13bbb16e610d825820e18)
Diffstat (limited to 'source4/utils/getntacl.c')
-rw-r--r--source4/utils/getntacl.c105
1 files changed, 102 insertions, 3 deletions
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