root/source4/utils/getntacl.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. ntacl_print_debug_helper
  2. get_ntacl
  3. print_ntacl
  4. main

   1 /* 
   2    Unix SMB/CIFS implementation.
   3 
   4    Get NT ACLs from UNIX files.
   5 
   6    Copyright (C) Tim Potter <tpot@samba.org> 2005
   7    
   8    This program is free software; you can redistribute it and/or modify
   9    it under the terms of the GNU General Public License as published by
  10    the Free Software Foundation; either version 3 of the License, or
  11    (at your option) any later version.
  12    
  13    This program is distributed in the hope that it will be useful,
  14    but WITHOUT ANY WARRANTY; without even the implied warranty of
  15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16    GNU General Public License for more details.
  17    
  18    You should have received a copy of the GNU General Public License
  19    along with this program.  If not, see <http://www.gnu.org/licenses/>.
  20 */
  21 
  22 #include "includes.h"
  23 #include "system/filesys.h"
  24 #include "librpc/gen_ndr/ndr_xattr.h"
  25 #include "../lib/util/wrap_xattr.h"
  26 #include "param/param.h"
  27 
  28 static void ntacl_print_debug_helper(struct ndr_print *ndr, const char *format, ...) PRINTF_ATTRIBUTE(2,3);
     /* [<][>][^][v][top][bottom][index][help] */
  29 
  30 static void ntacl_print_debug_helper(struct ndr_print *ndr, const char *format, ...)
  31 {
  32         va_list ap;
  33         char *s = NULL;
  34         int i;
  35 
  36         va_start(ap, format);
  37         vasprintf(&s, format, ap);
  38         va_end(ap);
  39 
  40         for (i=0;i<ndr->depth;i++) {
  41                 printf("    ");
  42         }
  43 
  44         printf("%s\n", s);
  45         free(s);
  46 }
  47 
  48 static NTSTATUS get_ntacl(TALLOC_CTX *mem_ctx,
     /* [<][>][^][v][top][bottom][index][help] */
  49                           char *filename,
  50                           struct xattr_NTACL **ntacl, 
  51                           ssize_t *ntacl_len)
  52 {
  53         DATA_BLOB blob;
  54         ssize_t size;
  55         enum ndr_err_code ndr_err;
  56         struct ndr_pull *ndr;
  57 
  58         *ntacl = talloc(mem_ctx, struct xattr_NTACL);
  59 
  60         size = wrap_getxattr(filename, XATTR_NTACL_NAME, NULL, 0);
  61 
  62         if (size < 0) {
  63                 fprintf(stderr, "get_ntacl: %s\n", strerror(errno));
  64                 return NT_STATUS_INTERNAL_ERROR;
  65         }
  66 
  67         blob.data = talloc_array(*ntacl, uint8_t, size);
  68         size = wrap_getxattr(filename, XATTR_NTACL_NAME, blob.data, size);
  69         if (size < 0) {
  70                 fprintf(stderr, "get_ntacl: %s\n", strerror(errno));
  71                 return NT_STATUS_INTERNAL_ERROR;
  72         }
  73         blob.length = size;
  74 
  75         ndr = ndr_pull_init_blob(&blob, NULL, NULL);
  76 
  77         ndr_err = ndr_pull_xattr_NTACL(ndr, NDR_SCALARS|NDR_BUFFERS, *ntacl);
  78         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
  79                 return ndr_map_error2ntstatus(ndr_err);
  80         }
  81 
  82         return NT_STATUS_OK;
  83 }
  84 
  85 static void print_ntacl(TALLOC_CTX *mem_ctx,
     /* [<][>][^][v][top][bottom][index][help] */
  86                         const char *fname,
  87                         struct xattr_NTACL *ntacl)
  88 {
  89         struct ndr_print *pr;
  90 
  91         pr = talloc_zero(mem_ctx, struct ndr_print);
  92         if (!pr) return;
  93         pr->print = ntacl_print_debug_helper;
  94 
  95         ndr_print_xattr_NTACL(pr, fname, ntacl);
  96         talloc_free(pr);
  97 }
  98 
  99 int main(int argc, char *argv[])
     /* [<][>][^][v][top][bottom][index][help] */
 100 {
 101         NTSTATUS status;
 102         struct xattr_NTACL *ntacl;
 103         ssize_t ntacl_len;
 104 
 105         if (argc != 2) {
 106                 fprintf(stderr, "Usage: getntacl FILENAME\n");
 107                 return 1;
 108         }
 109 
 110         status = get_ntacl(NULL, argv[1], &ntacl, &ntacl_len);
 111         if (!NT_STATUS_IS_OK(status)) {
 112                 fprintf(stderr, "get_ntacl failed: %s\n", nt_errstr(status));
 113                 return 1;
 114         }
 115 
 116         print_ntacl(ntacl, argv[1], ntacl);
 117 
 118         talloc_free(ntacl);
 119 
 120         return 0;
 121 }

/* [<][>][^][v][top][bottom][index][help] */