summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/utils/smbcacls.c54
1 files changed, 32 insertions, 22 deletions
diff --git a/source3/utils/smbcacls.c b/source3/utils/smbcacls.c
index a193a14043..7600989655 100644
--- a/source3/utils/smbcacls.c
+++ b/source3/utils/smbcacls.c
@@ -37,6 +37,7 @@ static int numeric;
enum acl_mode {ACL_SET, ACL_DELETE, ACL_MODIFY, ACL_ADD };
enum chown_mode {REQUEST_NONE, REQUEST_CHOWN, REQUEST_CHGRP};
+enum exit_values {EXIT_OK, EXIT_FAILED, EXIT_PARSE_ERROR};
struct perm_value {
char *perm;
@@ -463,24 +464,24 @@ int do_cli_nt_create(struct cli_state *cli, char *fname, uint32 DesiredAccess)
/*****************************************************
dump the acls for a file
*******************************************************/
-static void cacl_dump(struct cli_state *cli, char *filename)
+static int cacl_dump(struct cli_state *cli, char *filename)
{
int fnum;
SEC_DESC *sd;
- if (test_args) return;
+ if (test_args) return EXIT_OK;
fnum = do_cli_nt_create(cli, filename, 0x20000);
if (fnum == -1) {
printf("Failed to open %s: %s\n", filename, cli_errstr(cli));
- return;
+ return EXIT_FAILED;
}
sd = cli_query_secdesc(cli, fnum);
if (!sd) {
printf("ERROR: secdesc query failed: %s\n", cli_errstr(cli));
- return;
+ return EXIT_FAILED;
}
sec_desc_print(stdout, sd);
@@ -488,6 +489,8 @@ static void cacl_dump(struct cli_state *cli, char *filename)
free_sec_desc(&sd);
cli_close(cli, fnum);
+
+ return EXIT_OK;
}
/*****************************************************
@@ -495,7 +498,8 @@ Change the ownership or group ownership of a file. Just
because the NT docs say this can't be done :-). JRA.
*******************************************************/
-static void owner_set(struct cli_state *cli, enum chown_mode change_mode, char *filename, char *new_username)
+static int owner_set(struct cli_state *cli, enum chown_mode change_mode,
+ char *filename, char *new_username)
{
int fnum;
DOM_SID sid;
@@ -508,11 +512,11 @@ static void owner_set(struct cli_state *cli, enum chown_mode change_mode, char *
if (fnum == -1) {
printf("Failed to open %s: %s\n", filename, cli_errstr(cli));
- return;
+ return EXIT_FAILED;
}
if (!StringToSid(&sid, new_username))
- return;
+ return EXIT_PARSE_ERROR;
old = cli_query_secdesc(cli, fnum);
@@ -529,6 +533,8 @@ static void owner_set(struct cli_state *cli, enum chown_mode change_mode, char *
free_sec_desc(&old);
cli_close(cli, fnum);
+
+ return EXIT_OK;
}
/* The MSDN is contradictory over the ordering of ACE entries in an ACL.
@@ -579,18 +585,19 @@ static void sort_acl(SEC_ACL *the_acl)
/*****************************************************
set the ACLs on a file given an ascii description
*******************************************************/
-static void cacl_set(struct cli_state *cli, char *filename,
- char *the_acl, enum acl_mode mode)
+static int cacl_set(struct cli_state *cli, char *filename,
+ char *the_acl, enum acl_mode mode)
{
int fnum;
SEC_DESC *sd, *old;
int i, j;
size_t sd_size;
+ int result = EXIT_OK;
sd = sec_desc_parse(the_acl);
- if (!sd) return;
- if (test_args) return;
+ if (!sd) return EXIT_PARSE_ERROR;
+ if (test_args) return EXIT_OK;
/* The desired access below is the only one I could find that works
with NT4, W2KP and Samba */
@@ -600,7 +607,7 @@ static void cacl_set(struct cli_state *cli, char *filename,
if (fnum == -1) {
printf("Failed to open %s: %s\n", filename, cli_errstr(cli));
- return;
+ return EXIT_FAILED;
}
old = cli_query_secdesc(cli, fnum);
@@ -688,6 +695,7 @@ static void cacl_set(struct cli_state *cli, char *filename,
if (!cli_set_secdesc(cli, fnum, sd)) {
printf("ERROR: secdesc set failed: %s\n", cli_errstr(cli));
+ result = EXIT_FAILED;
}
/* Clean up */
@@ -696,6 +704,8 @@ static void cacl_set(struct cli_state *cli, char *filename,
free_sec_desc(&old);
cli_close(cli, fnum);
+
+ return result;
}
@@ -828,6 +838,7 @@ You can string acls together with spaces, commas or newlines\n\
enum acl_mode mode;
char *the_acl = NULL;
enum chown_mode change_mode = REQUEST_NONE;
+ int result;
setlinebuf(stdout);
@@ -835,7 +846,7 @@ You can string acls together with spaces, commas or newlines\n\
if (argc < 3 || argv[1][0] == '-') {
usage();
- exit(1);
+ exit(EXIT_PARSE_ERROR);
}
setup_logging(argv[0],True);
@@ -920,11 +931,11 @@ You can string acls together with spaces, commas or newlines\n\
case 'h':
usage();
- exit(1);
+ exit(EXIT_PARSE_ERROR);
default:
printf("Unknown option %c (%d)\n", (char)opt, opt);
- exit(1);
+ exit(EXIT_PARSE_ERROR);
}
}
@@ -933,17 +944,16 @@ You can string acls together with spaces, commas or newlines\n\
if (argc > 0) {
usage();
- exit(1);
+ exit(EXIT_PARSE_ERROR);
}
/* Make connection to server */
if (!test_args) {
cli = connect_one(share);
- if (!cli) exit(1);
+ if (!cli) exit(EXIT_FAILED);
}
-
{
char *s;
@@ -957,12 +967,12 @@ You can string acls together with spaces, commas or newlines\n\
/* Perform requested action */
if (change_mode != REQUEST_NONE) {
- owner_set(cli, change_mode, filename, owner_username);
+ result = owner_set(cli, change_mode, filename, owner_username);
} else if (the_acl) {
- cacl_set(cli, filename, the_acl, mode);
+ result = cacl_set(cli, filename, the_acl, mode);
} else {
- cacl_dump(cli, filename);
+ result = cacl_dump(cli, filename);
}
- return(0);
+ return result;
}