summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/lib/account_pol.c28
-rw-r--r--source3/utils/net_sam.c83
-rw-r--r--source3/utils/pdbedit.c16
3 files changed, 80 insertions, 47 deletions
diff --git a/source3/lib/account_pol.c b/source3/lib/account_pol.c
index 4cb0b77e74..f4008457ac 100644
--- a/source3/lib/account_pol.c
+++ b/source3/lib/account_pol.c
@@ -83,28 +83,24 @@ static const struct ap_table account_policy_names[] = {
{0, NULL, 0, "", NULL}
};
-char *account_policy_names_list(void)
-{
- char *nl, *p;
- int i;
- size_t len = 0;
+void account_policy_names_list(const char ***names, int *num_names)
+{
+ const char **nl;
+ int i, count;
- for (i=0; account_policy_names[i].string; i++) {
- len += strlen(account_policy_names[i].string) + 1;
+ for (count=0; account_policy_names[count].string; count++) {
}
- len++;
- nl = (char *)SMB_MALLOC(len);
+ nl = SMB_MALLOC_ARRAY(const char *, count);
if (!nl) {
- return NULL;
+ *num_names = 0;
+ return;
}
- p = nl;
for (i=0; account_policy_names[i].string; i++) {
- memcpy(p, account_policy_names[i].string, strlen(account_policy_names[i].string) + 1);
- p[strlen(account_policy_names[i].string)] = '\n';
- p += strlen(account_policy_names[i].string) + 1;
+ nl[i] = account_policy_names[i].string;
}
- *p = '\0';
- return nl;
+ *num_names = count;
+ *names = nl;
+ return;
}
/****************************************************************************
diff --git a/source3/utils/net_sam.c b/source3/utils/net_sam.c
index d92bf1521c..2c9b9649f7 100644
--- a/source3/utils/net_sam.c
+++ b/source3/utils/net_sam.c
@@ -365,38 +365,57 @@ static int net_sam_policy_set(int argc, const char **argv)
const char *account_policy = NULL;
uint32 value, old_value;
int field;
+ char *endptr;
if (argc != 2) {
- d_fprintf(stderr, "usage: net sam policy set"
+ d_fprintf(stderr, "usage: net sam policy set "
"\"<account policy>\" <value> \n");
return -1;
}
- value = strtoul(argv[1], NULL, 10);
account_policy = argv[0];
field = account_policy_name_to_fieldnum(account_policy);
+ value = strtoul(argv[1], &endptr, 10);
- printf("Account policy \"%s\" description: %s\n", account_policy,
- account_policy_get_desc(field));
+ if (field == 0) {
+ const char **names;
+ int i, count;
+
+ account_policy_names_list(&names, &count);
+ d_fprintf(stderr, "No account policy \"%s\"!\n\n", argv[0]);
+ d_fprintf(stderr, "Valid account policies are:\n");
+
+ for (i=0; i<count; i++) {
+ d_fprintf(stderr, "%s\n", names[i]);
+ }
+
+ SAFE_FREE(names);
+ return -1;
+ }
if (!pdb_get_account_policy(field, &old_value)) {
- fprintf(stderr, "Valid account policy, but unable to "
- "fetch value!\n");
- return -1;
- }
-
- printf("Account policy \"%s\" value was: %d\n", account_policy,
- old_value);
+ d_fprintf(stderr, "Valid account policy, but unable to fetch "
+ "value!\n");
+ }
- if (!pdb_set_account_policy(field, value)) {
- d_fprintf(stderr, "Setting account policy %s to %u failed \n",
- account_policy, value);
- }
+ if ((endptr == argv[1]) || (endptr[0] != '\0')) {
+ d_printf("Unable to set policy \"%s\"! Invalid value %s.\n",
+ account_policy, argv[1]);
+ return -1;
+ }
+
+ if (!pdb_set_account_policy(field, value)) {
+ d_fprintf(stderr, "Valid account policy, but unable to "
+ "set value!\n");
+ return -1;
+ }
- printf("Account policy \"%s\" value is now: %d\n", account_policy,
- value);
+ d_printf("Account policy \"%s\" value was: %d\n", account_policy,
+ old_value);
- return 0;
+ d_printf("Account policy \"%s\" value is now: %d\n", account_policy,
+ value);
+ return 0;
}
static int net_sam_policy_show(int argc, const char **argv)
@@ -415,13 +434,19 @@ static int net_sam_policy_show(int argc, const char **argv)
field = account_policy_name_to_fieldnum(account_policy);
if (field == 0) {
- char *apn = account_policy_names_list();
+ const char **names;
+ int count;
+ int i;
+ account_policy_names_list(&names, &count);
d_fprintf(stderr, "No account policy by that name!\n");
- if (apn) {
+ if (count != 0) {
d_fprintf(stderr, "Valid account policies "
- "are:\n%s\n", apn);
+ "are:\n");
+ for (i=0; i<count; i++) {
+ d_fprintf(stderr, "%s\n", names[i]);
+ }
}
- SAFE_FREE(apn);
+ SAFE_FREE(names);
return -1;
}
@@ -440,12 +465,18 @@ static int net_sam_policy_show(int argc, const char **argv)
static int net_sam_policy_list(int argc, const char **argv)
{
- char *apn = account_policy_names_list();
- if (apn) {
+ const char **names;
+ int count;
+ int i;
+ account_policy_names_list(&names, &count);
+ if (count != 0) {
d_fprintf(stderr, "Valid account policies "
- "are:\n\n%s\n", apn);
+ "are:\n");
+ for (i = 0; i < count ; i++) {
+ d_fprintf(stderr, "%s\n", names[i]);
+ }
}
- SAFE_FREE(apn);
+ SAFE_FREE(names);
return -1;
}
diff --git a/source3/utils/pdbedit.c b/source3/utils/pdbedit.c
index ceb346d987..d79ab187a3 100644
--- a/source3/utils/pdbedit.c
+++ b/source3/utils/pdbedit.c
@@ -885,12 +885,18 @@ int main (int argc, char **argv)
uint32 value;
int field = account_policy_name_to_fieldnum(account_policy);
if (field == 0) {
- char *apn = account_policy_names_list();
- fprintf(stderr, "No account policy by that name\n");
- if (apn) {
- fprintf(stderr, "Account policy names are :\n%s\n", apn);
+ const char **names;
+ int count;
+ int i;
+ account_policy_names_list(&names, &count);
+ fprintf(stderr, "No account policy by that name!\n");
+ if (count !=0) {
+ fprintf(stderr, "Account policy names are:\n");
+ for (i = 0; i < count ; i++) {
+ d_fprintf(stderr, "%s\n", names[i]);
+ }
}
- SAFE_FREE(apn);
+ SAFE_FREE(names);
exit(1);
}
if (!pdb_get_account_policy(field, &value)) {