s3:tests: Fix syntax error in test_smbclient_kerberos.sh
[samba4-gss.git] / source3 / utils / smbcquotas.c
blobdd0c143b076ad8c5cc4258ee5ad6bca4ada492d1
1 /*
2 Unix SMB/CIFS implementation.
3 QUOTA get/set utility
5 Copyright (C) Andrew Tridgell 2000
6 Copyright (C) Tim Potter 2000
7 Copyright (C) Jeremy Allison 2000
8 Copyright (C) Stefan (metze) Metzmacher 2003
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 3 of the License, or
13 (at your option) any later version.
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program. If not, see <http://www.gnu.org/licenses/>.
24 #include "includes.h"
25 #include "lib/cmdline/cmdline.h"
26 #include "rpc_client/cli_pipe.h"
27 #include "../librpc/gen_ndr/ndr_lsa.h"
28 #include "rpc_client/cli_lsarpc.h"
29 #include "fake_file.h"
30 #include "../libcli/security/security.h"
31 #include "libsmb/libsmb.h"
32 #include "lib/param/param.h"
34 static char *server;
36 /* numeric is set when the user wants numeric SIDs and ACEs rather
37 than going via LSA calls to resolve them */
38 static bool numeric;
39 static bool verbose;
41 enum todo_values {NOOP_QUOTA=0,FS_QUOTA,USER_QUOTA,LIST_QUOTA,SET_QUOTA};
42 enum exit_values {EXIT_OK, EXIT_FAILED, EXIT_PARSE_ERROR};
44 static struct cli_state *cli_ipc;
45 static struct rpc_pipe_client *global_pipe_hnd;
46 static struct policy_handle pol;
47 static bool got_policy_hnd;
49 static struct cli_state *connect_one(const char *share);
51 /* Open cli connection and policy handle */
53 static bool cli_open_policy_hnd(void)
55 /* Initialise cli LSA connection */
57 if (!cli_ipc) {
58 NTSTATUS ret;
59 cli_ipc = connect_one("IPC$");
60 ret = cli_rpc_pipe_open_noauth(cli_ipc,
61 &ndr_table_lsarpc,
62 &global_pipe_hnd);
63 if (!NT_STATUS_IS_OK(ret)) {
64 return False;
68 /* Open policy handle */
70 if (!got_policy_hnd) {
72 /* Some systems don't support SEC_FLAG_MAXIMUM_ALLOWED,
73 but NT sends 0x2000000 so we might as well do it too. */
75 if (!NT_STATUS_IS_OK(rpccli_lsa_open_policy(global_pipe_hnd, talloc_tos(), True,
76 GENERIC_EXECUTE_ACCESS, &pol))) {
77 return False;
80 got_policy_hnd = True;
83 return True;
86 /* convert a SID to a string, either numeric or username/group */
87 static void SidToString(fstring str, struct dom_sid *sid, bool _numeric)
89 char **domains = NULL;
90 char **names = NULL;
91 enum lsa_SidType *types = NULL;
93 sid_to_fstring(str, sid);
95 if (_numeric) return;
97 /* Ask LSA to convert the sid to a name */
99 if (!cli_open_policy_hnd() ||
100 !NT_STATUS_IS_OK(rpccli_lsa_lookup_sids(global_pipe_hnd, talloc_tos(),
101 &pol, 1, sid, &domains,
102 &names, &types)) ||
103 !domains || !domains[0] || !names || !names[0]) {
104 return;
107 /* Converted OK */
109 slprintf(str, sizeof(fstring) - 1, "%s%s%s",
110 domains[0], lp_winbind_separator(),
111 names[0]);
114 /* convert a string to a SID, either numeric or username/group */
115 static bool StringToSid(struct dom_sid *sid, const char *str)
117 enum lsa_SidType *types = NULL;
118 struct dom_sid *sids = NULL;
119 bool result = True;
121 if (string_to_sid(sid, str)) {
122 return true;
125 if (!cli_open_policy_hnd() ||
126 !NT_STATUS_IS_OK(rpccli_lsa_lookup_names(global_pipe_hnd, talloc_tos(),
127 &pol, 1, &str, NULL, 1, &sids,
128 &types))) {
129 result = False;
130 goto done;
133 sid_copy(sid, &sids[0]);
134 done:
136 return result;
139 #define QUOTA_GET 1
140 #define QUOTA_SETLIM 2
141 #define QUOTA_SETFLAGS 3
142 #define QUOTA_LIST 4
144 enum {PARSE_FLAGS,PARSE_LIM};
146 static int parse_quota_set(TALLOC_CTX *ctx,
147 char *set_str,
148 char **pp_username_str,
149 enum SMB_QUOTA_TYPE *qtype,
150 int *cmd,
151 SMB_NTQUOTA_STRUCT *pqt)
153 char *p = set_str,*p2;
154 int todo;
155 bool stop = False;
156 bool enable = False;
157 bool deny = False;
159 *pp_username_str = NULL;
160 if (strnequal(set_str,"UQLIM:",6)) {
161 p += 6;
162 *qtype = SMB_USER_QUOTA_TYPE;
163 *cmd = QUOTA_SETLIM;
164 todo = PARSE_LIM;
165 if ((p2=strstr(p,":"))==NULL) {
166 return -1;
169 *p2 = '\0';
170 p2++;
172 *pp_username_str = talloc_strdup(ctx, p);
173 p = p2;
174 } else if (strnequal(set_str,"FSQLIM:",7)) {
175 p +=7;
176 *qtype = SMB_USER_FS_QUOTA_TYPE;
177 *cmd = QUOTA_SETLIM;
178 todo = PARSE_LIM;
179 } else if (strnequal(set_str,"FSQFLAGS:",9)) {
180 p +=9;
181 todo = PARSE_FLAGS;
182 *qtype = SMB_USER_FS_QUOTA_TYPE;
183 *cmd = QUOTA_SETFLAGS;
184 } else {
185 return -1;
188 switch (todo) {
189 case PARSE_LIM:
190 if (sscanf(p,"%"SCNu64"/%"SCNu64,&pqt->softlim,
191 &pqt->hardlim) != 2)
193 return -1;
196 break;
197 case PARSE_FLAGS:
198 while (!stop) {
200 if ((p2=strstr(p,"/"))==NULL) {
201 stop = True;
202 } else {
203 *p2 = '\0';
204 p2++;
207 if (strnequal(p,"QUOTA_ENABLED",13)) {
208 enable = True;
209 } else if (strnequal(p,"DENY_DISK",9)) {
210 deny = True;
211 } else if (strnequal(p,"LOG_SOFTLIMIT",13)) {
212 pqt->qflags |= QUOTAS_LOG_THRESHOLD;
213 } else if (strnequal(p,"LOG_HARDLIMIT",13)) {
214 pqt->qflags |= QUOTAS_LOG_LIMIT;
215 } else {
216 return -1;
219 p=p2;
222 if (deny) {
223 pqt->qflags |= QUOTAS_DENY_DISK;
224 } else if (enable) {
225 pqt->qflags |= QUOTAS_ENABLED;
228 break;
231 return 0;
235 static const char *quota_str_static(uint64_t val, bool special, bool _numeric)
237 const char *result;
239 if (!_numeric && special && val == 0) {
240 return "NO LIMIT";
242 result = talloc_asprintf(talloc_tos(), "%"PRIu64, val);
243 SMB_ASSERT(result != NULL);
244 return result;
247 static void dump_ntquota(SMB_NTQUOTA_STRUCT *qt, bool _verbose,
248 bool _numeric,
249 void (*_sidtostring)(fstring str,
250 struct dom_sid *sid,
251 bool _numeric))
253 TALLOC_CTX *frame = talloc_stackframe();
255 if (!qt) {
256 smb_panic("dump_ntquota() called with NULL pointer");
259 switch (qt->qtype) {
260 case SMB_USER_FS_QUOTA_TYPE:
262 d_printf("File System QUOTAS:\n");
263 d_printf("Limits:\n");
264 d_printf(" Default Soft Limit: %15s\n",
265 quota_str_static(qt->softlim,True,_numeric));
266 d_printf(" Default Hard Limit: %15s\n",
267 quota_str_static(qt->hardlim,True,_numeric));
268 d_printf("Quota Flags:\n");
269 d_printf(" Quotas Enabled: %s\n",
270 ((qt->qflags&QUOTAS_ENABLED)
271 ||(qt->qflags&QUOTAS_DENY_DISK))?"On":"Off");
272 d_printf(" Deny Disk: %s\n",
273 (qt->qflags&QUOTAS_DENY_DISK)?"On":"Off");
274 d_printf(" Log Soft Limit: %s\n",
275 (qt->qflags&QUOTAS_LOG_THRESHOLD)?"On":"Off");
276 d_printf(" Log Hard Limit: %s\n",
277 (qt->qflags&QUOTAS_LOG_LIMIT)?"On":"Off");
279 break;
280 case SMB_USER_QUOTA_TYPE:
282 fstring username_str = {0};
284 if (_sidtostring) {
285 _sidtostring(username_str,&qt->sid,_numeric);
286 } else {
287 sid_to_fstring(username_str, &qt->sid);
290 if (_verbose) {
291 d_printf("Quotas for User: %s\n",username_str);
292 d_printf("Used Space: %15s\n",
293 quota_str_static(qt->usedspace,False,
294 _numeric));
295 d_printf("Soft Limit: %15s\n",
296 quota_str_static(qt->softlim,True,
297 _numeric));
298 d_printf("Hard Limit: %15s\n",
299 quota_str_static(qt->hardlim,True,_numeric));
300 } else {
301 d_printf("%-30s: ",username_str);
302 d_printf("%15s/",quota_str_static(
303 qt->usedspace,False,_numeric));
304 d_printf("%15s/",quota_str_static(
305 qt->softlim,True,_numeric));
306 d_printf("%15s\n",quota_str_static(
307 qt->hardlim,True,_numeric));
310 break;
311 default:
312 d_printf("dump_ntquota() invalid qtype(%d)\n",qt->qtype);
314 TALLOC_FREE(frame);
315 return;
318 static void dump_ntquota_list(SMB_NTQUOTA_LIST **qtl, bool _verbose,
319 bool _numeric,
320 void (*_sidtostring)(fstring str,
321 struct dom_sid *sid,
322 bool _numeric))
324 SMB_NTQUOTA_LIST *cur;
326 for (cur = *qtl;cur;cur = cur->next) {
327 if (cur->quotas)
328 dump_ntquota(cur->quotas,_verbose,_numeric,
329 _sidtostring);
333 static int do_quota(struct cli_state *cli,
334 enum SMB_QUOTA_TYPE qtype,
335 uint16_t cmd,
336 const char *username_str,
337 SMB_NTQUOTA_STRUCT *pqt)
339 uint32_t fs_attrs = 0;
340 uint16_t quota_fnum = 0;
341 SMB_NTQUOTA_LIST *qtl = NULL;
342 TALLOC_CTX *qtl_ctx = NULL;
343 SMB_NTQUOTA_STRUCT qt;
344 NTSTATUS status;
346 ZERO_STRUCT(qt);
348 status = cli_get_fs_attr_info(cli, &fs_attrs);
349 if (!NT_STATUS_IS_OK(status)) {
350 d_printf("Failed to get the filesystem attributes %s.\n",
351 nt_errstr(status));
352 return -1;
355 if (!(fs_attrs & FILE_VOLUME_QUOTAS)) {
356 d_printf("Quotas are not supported by the server.\n");
357 return 0;
360 status = cli_get_quota_handle(cli, &quota_fnum);
361 if (!NT_STATUS_IS_OK(status)) {
362 d_printf("Quotas are not enabled on this share.\n");
363 d_printf("Failed to open %s %s.\n",
364 FAKE_FILE_NAME_QUOTA_WIN32,
365 nt_errstr(status));
366 return -1;
369 switch(qtype) {
370 case SMB_USER_QUOTA_TYPE:
371 if (!StringToSid(&qt.sid, username_str)) {
372 d_printf("StringToSid() failed for [%s]\n",username_str);
373 return -1;
376 switch(cmd) {
377 case QUOTA_GET:
378 status = cli_get_user_quota(
379 cli, quota_fnum, &qt);
380 if (!NT_STATUS_IS_OK(status)) {
381 d_printf("%s cli_get_user_quota %s\n",
382 nt_errstr(status),
383 username_str);
384 return -1;
386 dump_ntquota(&qt,verbose,numeric,SidToString);
387 break;
388 case QUOTA_SETLIM:
389 pqt->sid = qt.sid;
390 if ((qtl_ctx = talloc_init(
391 "SMB_USER_QUOTA_SET")) ==
392 NULL) {
393 return -1;
396 if (!add_record_to_ntquota_list(
397 qtl_ctx, pqt, &qtl)) {
398 TALLOC_FREE(qtl_ctx);
399 return -1;
402 status = cli_set_user_quota(
403 cli, quota_fnum, qtl);
404 free_ntquota_list(&qtl);
405 if (!NT_STATUS_IS_OK(status)) {
406 d_printf("%s cli_set_user_quota %s\n",
407 nt_errstr(status),
408 username_str);
409 return -1;
411 status = cli_get_user_quota(
412 cli, quota_fnum, &qt);
413 if (!NT_STATUS_IS_OK(status)) {
414 d_printf("%s cli_get_user_quota %s\n",
415 nt_errstr(status),
416 username_str);
417 return -1;
419 dump_ntquota(&qt,verbose,numeric,SidToString);
420 break;
421 case QUOTA_LIST:
422 status = cli_list_user_quota(
423 cli, quota_fnum, &qtl);
424 if (!NT_STATUS_IS_OK(status)) {
425 d_printf(
426 "%s cli_list_user_quota\n",
427 nt_errstr(status));
428 return -1;
430 dump_ntquota_list(&qtl,verbose,numeric,SidToString);
431 free_ntquota_list(&qtl);
432 break;
433 default:
434 d_printf("Unknown Error\n");
435 return -1;
437 break;
438 case SMB_USER_FS_QUOTA_TYPE:
439 switch(cmd) {
440 case QUOTA_GET:
441 status = cli_get_fs_quota_info(
442 cli, quota_fnum, &qt);
443 if (!NT_STATUS_IS_OK(status)) {
444 d_printf("%s cli_get_fs_quota_info\n",
445 nt_errstr(status));
446 return -1;
448 dump_ntquota(&qt,True,numeric,NULL);
449 break;
450 case QUOTA_SETLIM:
451 status = cli_get_fs_quota_info(
452 cli, quota_fnum, &qt);
453 if (!NT_STATUS_IS_OK(status)) {
454 d_printf("%s cli_get_fs_quota_info\n",
455 nt_errstr(status));
456 return -1;
458 qt.softlim = pqt->softlim;
459 qt.hardlim = pqt->hardlim;
460 status = cli_set_fs_quota_info(
461 cli, quota_fnum, &qt);
462 if (!NT_STATUS_IS_OK(status)) {
463 d_printf("%s cli_set_fs_quota_info\n",
464 nt_errstr(status));
465 return -1;
467 status = cli_get_fs_quota_info(
468 cli, quota_fnum, &qt);
469 if (!NT_STATUS_IS_OK(status)) {
470 d_printf("%s cli_get_fs_quota_info\n",
471 nt_errstr(status));
472 return -1;
474 dump_ntquota(&qt,True,numeric,NULL);
475 break;
476 case QUOTA_SETFLAGS:
477 status = cli_get_fs_quota_info(
478 cli, quota_fnum, &qt);
479 if (!NT_STATUS_IS_OK(status)) {
480 d_printf("%s cli_get_fs_quota_info\n",
481 nt_errstr(status));
482 return -1;
484 qt.qflags = pqt->qflags;
485 status = cli_set_fs_quota_info(
486 cli, quota_fnum, &qt);
487 if (!NT_STATUS_IS_OK(status)) {
488 d_printf("%s cli_set_fs_quota_info\n",
489 nt_errstr(status));
490 return -1;
492 status = cli_get_fs_quota_info(
493 cli, quota_fnum, &qt);
494 if (!NT_STATUS_IS_OK(status)) {
495 d_printf("%s cli_get_fs_quota_info\n",
496 nt_errstr(status));
497 return -1;
499 dump_ntquota(&qt,True,numeric,NULL);
500 break;
501 default:
502 d_printf("Unknown Error\n");
503 return -1;
505 break;
506 default:
507 d_printf("Unknown Error\n");
508 return -1;
511 cli_close(cli, quota_fnum);
513 return 0;
516 /*****************************************************
517 Return a connection to a server.
518 *******************************************************/
520 static struct cli_state *connect_one(const char *share)
522 struct cli_state *c;
523 NTSTATUS nt_status;
524 uint32_t flags = 0;
526 nt_status = cli_full_connection_creds(&c, lp_netbios_name(), server,
527 NULL, 0,
528 share, "?????",
529 samba_cmdline_get_creds(),
530 flags);
531 if (!NT_STATUS_IS_OK(nt_status)) {
532 DEBUG(0,("cli_full_connection failed! (%s)\n", nt_errstr(nt_status)));
533 return NULL;
536 return c;
539 /****************************************************************************
540 main program
541 ****************************************************************************/
542 int main(int argc, char *argv[])
544 const char **argv_const = discard_const_p(const char *, argv);
545 char *share;
546 int opt;
547 int result;
548 int todo = 0;
549 char *username_str = NULL;
550 char *path = NULL;
551 char *set_str = NULL;
552 enum SMB_QUOTA_TYPE qtype = SMB_INVALID_QUOTA_TYPE;
553 int cmd = 0;
554 static bool test_args = False;
555 struct cli_state *cli;
556 bool fix_user = False;
557 SMB_NTQUOTA_STRUCT qt;
558 TALLOC_CTX *frame = talloc_stackframe();
559 poptContext pc;
560 struct cli_credentials *creds = NULL;
561 bool ok;
562 struct loadparm_context *lp_ctx = NULL;
564 struct poptOption long_options[] = {
565 POPT_AUTOHELP
567 .longName = "quota-user",
568 .shortName = 'u',
569 .argInfo = POPT_ARG_STRING,
570 .arg = NULL,
571 .val = 'u',
572 .descrip = "Show quotas for user",
573 .argDescrip = "USER",
576 .longName = "list",
577 .shortName = 'L',
578 .argInfo = POPT_ARG_NONE,
579 .arg = NULL,
580 .val = 'L',
581 .descrip = "List user quotas",
584 .longName = "fs",
585 .shortName = 'F',
586 .argInfo = POPT_ARG_NONE,
587 .arg = NULL,
588 .val = 'F',
589 .descrip = "Show filesystem quotas",
592 .longName = "set",
593 .shortName = 'S',
594 .argInfo = POPT_ARG_STRING,
595 .arg = NULL,
596 .val = 'S',
597 .descrip = "Set acls\n"
598 "SETSTRING:\n"
599 "UQLIM:<username>/<softlimit>/<hardlimit> for user quotas\n"
600 "FSQLIM:<softlimit>/<hardlimit> for filesystem defaults\n"
601 "FSQFLAGS:QUOTA_ENABLED/DENY_DISK/LOG_SOFTLIMIT/LOG_HARD_LIMIT",
602 .argDescrip = "SETSTRING",
605 .longName = "numeric",
606 .shortName = 'n',
607 .argInfo = POPT_ARG_NONE,
608 .arg = NULL,
609 .val = 'n',
610 .descrip = "Don't resolve sids or limits to names",
613 .longName = "verbose",
614 .shortName = 'v',
615 .argInfo = POPT_ARG_NONE,
616 .arg = NULL,
617 .val = 'v',
618 .descrip = "be verbose",
621 .longName = "test-args",
622 .shortName = 't',
623 .argInfo = POPT_ARG_NONE,
624 .arg = NULL,
625 .val = 't',
626 .descrip = "Test arguments"
629 .longName = "max-protocol",
630 .shortName = 'm',
631 .argInfo = POPT_ARG_STRING,
632 .arg = NULL,
633 .val = 'm',
634 .descrip = "Set the max protocol level",
635 .argDescrip = "LEVEL"
637 POPT_COMMON_SAMBA
638 POPT_COMMON_CREDENTIALS
639 POPT_LEGACY_S3
640 POPT_COMMON_VERSION
641 POPT_TABLEEND
644 smb_init_locale();
646 ZERO_STRUCT(qt);
648 ok = samba_cmdline_init(frame,
649 SAMBA_CMDLINE_CONFIG_CLIENT,
650 false /* require_smbconf */);
651 if (!ok) {
652 DBG_ERR("Failed to init cmdline parser!\n");
653 TALLOC_FREE(frame);
654 exit(1);
656 lp_ctx = samba_cmdline_get_lp_ctx();
657 /* set default debug level to 1 regardless of what smb.conf sets */
658 lpcfg_set_cmdline(lp_ctx, "log level", "1");
660 setlinebuf(stdout);
662 pc = samba_popt_get_context(getprogname(),
663 argc,
664 argv_const,
665 long_options, 0);
666 if (pc == NULL) {
667 DBG_ERR("Failed to setup popt context!\n");
668 TALLOC_FREE(frame);
669 exit(1);
672 poptSetOtherOptionHelp(pc, "//server1/share1");
674 while ((opt = poptGetNextOpt(pc)) != -1) {
675 switch (opt) {
676 case 'n':
677 numeric = true;
678 break;
679 case 'v':
680 verbose = true;
681 break;
682 case 't':
683 test_args = true;
684 break;
685 case 'L':
686 if (todo != 0) {
687 d_printf("Please specify only one option of <-L|-F|-S|-u>\n");
688 exit(EXIT_PARSE_ERROR);
690 todo = LIST_QUOTA;
691 break;
693 case 'F':
694 if (todo != 0) {
695 d_printf("Please specify only one option of <-L|-F|-S|-u>\n");
696 exit(EXIT_PARSE_ERROR);
698 todo = FS_QUOTA;
699 break;
701 case 'u':
702 if (todo != 0) {
703 d_printf("Please specify only one option of <-L|-F|-S|-u>\n");
704 exit(EXIT_PARSE_ERROR);
706 username_str = talloc_strdup(frame, poptGetOptArg(pc));
707 if (!username_str) {
708 exit(EXIT_PARSE_ERROR);
710 todo = USER_QUOTA;
711 fix_user = True;
712 break;
714 case 'S':
715 if (todo != 0) {
716 d_printf("Please specify only one option of <-L|-F|-S|-u>\n");
717 exit(EXIT_PARSE_ERROR);
719 set_str = talloc_strdup(frame, poptGetOptArg(pc));
720 if (!set_str) {
721 exit(EXIT_PARSE_ERROR);
723 todo = SET_QUOTA;
724 break;
725 case 'm':
726 lpcfg_set_cmdline(lp_ctx,
727 "client max protocol",
728 poptGetOptArg(pc));
729 break;
730 case POPT_ERROR_BADOPT:
731 fprintf(stderr, "\nInvalid option %s: %s\n\n",
732 poptBadOption(pc, 0), poptStrerror(opt));
733 poptPrintUsage(pc, stderr, 0);
734 exit(1);
738 creds = samba_cmdline_get_creds();
740 if (todo == 0)
741 todo = USER_QUOTA;
743 if (!fix_user) {
744 const char *user = cli_credentials_get_username(creds);
745 if (user == NULL) {
746 exit(EXIT_PARSE_ERROR);
749 username_str = talloc_strdup(frame, user);
750 if (!username_str) {
751 exit(EXIT_PARSE_ERROR);
755 /* Make connection to server */
756 if(!poptPeekArg(pc)) {
757 poptPrintUsage(pc, stderr, 0);
758 exit(EXIT_PARSE_ERROR);
761 path = talloc_strdup(frame, poptGetArg(pc));
762 if (!path) {
763 printf("Out of memory\n");
764 exit(EXIT_PARSE_ERROR);
767 if (strncmp(path, "\\\\", 2) && strncmp(path, "//", 2)) {
768 printf("Invalid argument: %s\n", path);
769 return -1;
772 poptFreeContext(pc);
773 samba_cmdline_burn(argc, argv);
775 string_replace(path, '/', '\\');
777 server = SMB_STRDUP(path+2);
778 if (!server) {
779 printf("Out of memory\n");
780 exit(EXIT_PARSE_ERROR);
782 share = strchr_m(server,'\\');
783 if (share == NULL) {
784 printf("Invalid argument\n");
785 exit(EXIT_PARSE_ERROR);
788 *share = 0;
789 share++;
791 if (todo == SET_QUOTA) {
792 if (parse_quota_set(talloc_tos(), set_str, &username_str, &qtype, &cmd, &qt)) {
793 printf("Invalid argument: -S %s\n", set_str);
794 exit(EXIT_PARSE_ERROR);
798 if (!test_args) {
799 cli = connect_one(share);
800 if (!cli) {
801 exit(EXIT_FAILED);
803 } else {
804 exit(EXIT_OK);
808 /* Perform requested action */
810 switch (todo) {
811 case FS_QUOTA:
812 result = do_quota(cli,SMB_USER_FS_QUOTA_TYPE, QUOTA_GET, username_str, NULL);
813 break;
814 case LIST_QUOTA:
815 result = do_quota(cli,SMB_USER_QUOTA_TYPE, QUOTA_LIST, username_str, NULL);
816 break;
817 case USER_QUOTA:
818 result = do_quota(cli,SMB_USER_QUOTA_TYPE, QUOTA_GET, username_str, NULL);
819 break;
820 case SET_QUOTA:
821 result = do_quota(cli, qtype, cmd, username_str, &qt);
822 break;
823 default:
824 result = EXIT_FAILED;
825 break;
828 talloc_free(frame);
830 return result;