Working on bug #5475
[samba.git] / examples / libsmbclient / testacl.c
index 00e1c2c9da9c838cee7ba9b73900aada4cd4b45f..a57dd4a499b484f370a3c788424b9a8b62eb1804 100644 (file)
@@ -24,6 +24,7 @@ int main(int argc, const char *argv[])
     int flags;
     int debug = 0;
     int numeric = 0;
+    int stat_and_retry = 0;
     int full_time_names = 0;
     enum acl_mode mode = SMB_ACL_LIST;
     static char *the_acl = NULL;
@@ -33,6 +34,7 @@ int main(int argc, const char *argv[])
     char path[1024];
     char value[1024];
     poptContext pc;
+    struct stat st;
     struct poptOption long_options[] =
         {
             POPT_AUTOHELP
@@ -77,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
             }
@@ -175,26 +181,40 @@ int main(int argc, const char *argv[])
         break;
 
     case SMB_ACL_GET:
-        if (the_acl == NULL)
+        do
         {
-            if (numeric)
+            if (the_acl == NULL)
             {
-                the_acl = "system.*";
+                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.*+";
+                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: