summaryrefslogtreecommitdiff
path: root/source4/utils/getntacl.c
diff options
context:
space:
mode:
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