vfs: Remove -D_LARGEFILE64_SOURCE from vfs examples Makefile
[samba.git] / examples / libsmbclient / testacl.c
index 47668f7c9c4af4f829b121f7b06487dd90d0d8f3..b602c5b185453f1420caa44b78af87cb5469f1c1 100644 (file)
@@ -3,9 +3,11 @@
 #include <errno.h>
 #include <popt.h>
 #include "libsmbclient.h"
+#include "get_auth_data_fn.h"
 
 enum acl_mode
 {
+    SMB_ACL_LIST,
     SMB_ACL_GET,
     SMB_ACL_SET,
     SMB_ACL_DELETE,
@@ -15,59 +17,6 @@ enum acl_mode
     SMB_ACL_CHGRP
 };
 
-static void
-get_auth_data_fn(const char * pServer,
-                 const char * pShare,
-                 char * pWorkgroup,
-                 int maxLenWorkgroup,
-                 char * pUsername,
-                 int maxLenUsername,
-                 char * pPassword,
-                 int maxLenPassword)
-    
-{
-    char temp[128];
-    
-    fprintf(stdout, "Workgroup: [%s] ", pWorkgroup);
-    fgets(temp, sizeof(temp), stdin);
-    
-    if (temp[strlen(temp) - 1] == '\n') /* A new line? */
-    {
-        temp[strlen(temp) - 1] = '\0';
-    }
-    
-    if (temp[0] != '\0')
-    {
-        strncpy(pWorkgroup, temp, maxLenWorkgroup - 1);
-    }
-    
-    fprintf(stdout, "Username: [%s] ", pUsername);
-    fgets(temp, sizeof(temp), stdin);
-    
-    if (temp[strlen(temp) - 1] == '\n') /* A new line? */
-    {
-        temp[strlen(temp) - 1] = '\0';
-    }
-    
-    if (temp[0] != '\0')
-    {
-        strncpy(pUsername, temp, maxLenUsername - 1);
-    }
-    
-    fprintf(stdout, "Password: ");
-    fgets(temp, sizeof(temp), stdin);
-    
-    if (temp[strlen(temp) - 1] == '\n') /* A new line? */
-    {
-        temp[strlen(temp) - 1] = '\0';
-    }
-    
-    if (temp[0] != '\0')
-    {
-        strncpy(pPassword, temp, maxLenPassword - 1);
-    }
-}
-
 
 int main(int argc, const char *argv[])
 {
@@ -75,14 +24,17 @@ int main(int argc, const char *argv[])
     int flags;
     int debug = 0;
     int numeric = 0;
-    enum acl_mode mode = SMB_ACL_GET;
-    static char *the_acl = NULL;
+    int stat_and_retry = 0;
+    int full_time_names = 0;
+    enum acl_mode mode = SMB_ACL_LIST;
+    static const char *the_acl = NULL;
     int ret;
     char *p;
-    char *debugstr;
+    const char *debugstr;
     char path[1024];
     char value[1024];
     poptContext pc;
+    struct stat st;
     struct poptOption long_options[] =
         {
             POPT_AUTOHELP
@@ -94,6 +46,11 @@ int main(int argc, const char *argv[])
                 "debug", 'd', POPT_ARG_INT, &debug,
                 0, "Set debug level (0-100)"
             },
+            {
+                "full_time_names", 'f', POPT_ARG_NONE, &full_time_names,
+                1,
+                "Use new style xattr names, which include CREATE_TIME"
+            },
             {
                 "delete", 'D', POPT_ARG_STRING, NULL,
                 'D', "Delete an acl", "ACL"
@@ -122,6 +79,10 @@ int main(int argc, const char *argv[])
                 "get", 'g', POPT_ARG_STRING, NULL,
                 'g', "Get a specific acl attribute", "ACL"
             },
+            {
+                "stat_and_retry", 'R', POPT_ARG_NONE, &stat_and_retry,
+                1, "After 'get' do 'stat' and another 'get'"
+            },
             {
                 NULL
             }
@@ -185,32 +146,75 @@ int main(int argc, const char *argv[])
         printf("Could not initialize smbc_ library\n");
         return 1;
     }
+
+    if (full_time_names) {
+        SMBCCTX *context = smbc_set_context(NULL);
+        smbc_setOptionFullTimeNames(context, 1);
+    }
     
     /* Perform requested action */
     
     switch(mode)
     {
+    case SMB_ACL_LIST:
+        ret = smbc_listxattr(path, value, sizeof(value)-2);
+        if (ret < 0)
+        {
+            printf("Could not get attribute list for [%s] %d: %s\n",
+                   path, errno, strerror(errno));
+            return 1;
+        }
+
+        /*
+         * The list of attributes has a series of null-terminated strings.
+         * The list of strings terminates with an extra null byte, thus two in
+         * a row.  Ensure that our buffer, which is conceivably shorter than
+         * the list of attributes, actually ends with two null bytes in a row.
+         */
+        value[sizeof(value) - 2] = '\0';
+        value[sizeof(value) - 1] = '\0';
+        printf("Supported attributes:\n");
+        for (p = value; *p; p += strlen(p) + 1)
+        {
+            printf("\t%s\n", p);
+        }
+        break;
+
     case SMB_ACL_GET:
-        if (the_acl == NULL)
+        do
         {
-            if (numeric)
+            if (the_acl == NULL)
             {
-                the_acl = "system.nt_sec_desc.*";
+                if (numeric)
+                {
+                    the_acl = "system.*";
+                }
+                else
+                {
+                    the_acl = "system.*+";
+                }
             }
-            else
+            ret = smbc_getxattr(path, the_acl, value, sizeof(value));
+            if (ret < 0)
             {
-                the_acl = "system.nt_sec_desc.*+";
+                printf("Could not get attributes for [%s] %d: %s\n",
+                       path, errno, strerror(errno));
+                return 1;
             }
-        }
-        ret = smbc_getxattr(path, the_acl, value, sizeof(value));
-        if (ret < 0)
-        {
-            printf("Could not get attributes for [%s] %d: %s\n",
-                   path, errno, strerror(errno));
-            return 1;
-        }
         
-        printf("Attributes for [%s] are:\n%s\n", path, value);
+            printf("Attributes for [%s] are:\n%s\n", path, value);
+
+            if (stat_and_retry)
+            {
+                if (smbc_stat(path, &st) < 0)
+                {
+                    perror("smbc_stat");
+                    return 1;
+                }
+            }
+
+            --stat_and_retry;
+        } while (stat_and_retry >= 0);
         break;
 
     case SMB_ACL_ADD: