smbcacls: add -x argument, prints maximum access
[samba.git] / source3 / utils / smbcacls.c
index a3a40e9eeb97023b9a5138a495cbd3b95e948933..b61d11df860f783a58125cc3196b3c1a55f2f413 100644 (file)
@@ -40,6 +40,7 @@ static int test_args;
 static int sddl;
 static int query_sec_info = -1;
 static int set_sec_info = -1;
 static int sddl;
 static int query_sec_info = -1;
 static int set_sec_info = -1;
+static bool want_mxac;
 
 static const char *domain_sid = NULL;
 
 
 static const char *domain_sid = NULL;
 
@@ -359,12 +360,33 @@ static bool set_secdesc(struct cli_state *cli, const char *filename,
        return result;
 }
 
        return result;
 }
 
+/*****************************************************
+get maximum access for a file
+*******************************************************/
+static int cacl_mxac(struct cli_state *cli, const char *filename)
+{
+       NTSTATUS status;
+       uint32_t mxac;
+
+       status = cli_query_mxac(cli, filename, &mxac);
+       if (!NT_STATUS_IS_OK(status)) {
+               printf("Failed to get mxac: %s\n", nt_errstr(status));
+               return EXIT_FAILED;
+       }
+
+       printf("Maximum access: 0x%x\n", mxac);
+
+       return EXIT_OK;
+}
+
+
 /*****************************************************
 dump the acls for a file
 *******************************************************/
 static int cacl_dump(struct cli_state *cli, const char *filename, bool numeric)
 {
        struct security_descriptor *sd;
 /*****************************************************
 dump the acls for a file
 *******************************************************/
 static int cacl_dump(struct cli_state *cli, const char *filename, bool numeric)
 {
        struct security_descriptor *sd;
+       int ret;
 
        if (test_args) {
                return EXIT_OK;
 
        if (test_args) {
                return EXIT_OK;
@@ -386,6 +408,13 @@ static int cacl_dump(struct cli_state *cli, const char *filename, bool numeric)
                sec_desc_print(cli, stdout, sd, numeric);
        }
 
                sec_desc_print(cli, stdout, sd, numeric);
        }
 
+       if (want_mxac) {
+               ret = cacl_mxac(cli, filename);
+               if (ret != EXIT_OK) {
+                       return ret;
+               }
+       }
+
        return EXIT_OK;
 }
 
        return EXIT_OK;
 }
 
@@ -910,6 +939,14 @@ int main(int argc, char *argv[])
                        .descrip    = "Set the max protocol level",
                        .argDescrip = "LEVEL",
                },
                        .descrip    = "Set the max protocol level",
                        .argDescrip = "LEVEL",
                },
+               {
+                       .longName   = "maximum-access",
+                       .shortName  = 'x',
+                       .argInfo    = POPT_ARG_NONE,
+                       .arg        = NULL,
+                       .val        = 'x',
+                       .descrip    = "Query maximum persmissions",
+               },
                POPT_COMMON_SAMBA
                POPT_COMMON_CONNECTION
                POPT_COMMON_CREDENTIALS
                POPT_COMMON_SAMBA
                POPT_COMMON_CONNECTION
                POPT_COMMON_CREDENTIALS
@@ -975,6 +1012,9 @@ int main(int argc, char *argv[])
                case 'm':
                        lp_set_cmdline("client max protocol", poptGetOptArg(pc));
                        break;
                case 'm':
                        lp_set_cmdline("client max protocol", poptGetOptArg(pc));
                        break;
+               case 'x':
+                       want_mxac = true;
+                       break;
                }
        }
 
                }
        }