static int do_quota(struct cli_state *cli, enum SMB_QUOTA_TYPE qtype, uint16_t cmd, const char *username_str, SMB_NTQUOTA_STRUCT *pqt) { uint32_t fs_attrs = 0; uint16_t quota_fnum = 0; SMB_NTQUOTA_LIST *qtl = NULL; TALLOC_CTX *qtl_ctx = NULL; SMB_NTQUOTA_STRUCT qt; NTSTATUS status; ZERO_STRUCT(qt); status = cli_get_fs_attr_info(cli, &fs_attrs); if (!NT_STATUS_IS_OK(status)) { d_printf("Failed to get the filesystem attributes %s.\n", nt_errstr(status)); return -1; } if (!(fs_attrs & FILE_VOLUME_QUOTAS)) { d_printf("Quotas are not supported by the server.\n"); return 0; } status = cli_get_quota_handle(cli, "a_fnum); if (!NT_STATUS_IS_OK(status)) { d_printf("Quotas are not enabled on this share.\n"); d_printf("Failed to open %s %s.\n", FAKE_FILE_NAME_QUOTA_WIN32, nt_errstr(status)); return -1; } switch(qtype) { case SMB_USER_QUOTA_TYPE: if (!StringToSid(&qt.sid, username_str)) { d_printf("StringToSid() failed for [%s]\n",username_str); return -1; } switch(cmd) { case QUOTA_GET: status = cli_get_user_quota( cli, quota_fnum, &qt); if (!NT_STATUS_IS_OK(status)) { d_printf("%s cli_get_user_quota %s\n", nt_errstr(status), username_str); return -1; } dump_ntquota(&qt,verbose,numeric,SidToString); break; case QUOTA_SETLIM: pqt->sid = qt.sid; if ((qtl_ctx = talloc_init( "SMB_USER_QUOTA_SET")) == NULL) { return -1; } if (!add_record_to_ntquota_list( qtl_ctx, pqt, &qtl)) { TALLOC_FREE(qtl_ctx); return -1; } status = cli_set_user_quota( cli, quota_fnum, qtl); free_ntquota_list(&qtl); if (!NT_STATUS_IS_OK(status)) { d_printf("%s cli_set_user_quota %s\n", nt_errstr(status), username_str); return -1; } status = cli_get_user_quota( cli, quota_fnum, &qt); if (!NT_STATUS_IS_OK(status)) { d_printf("%s cli_get_user_quota %s\n", nt_errstr(status), username_str); return -1; } dump_ntquota(&qt,verbose,numeric,SidToString); break; case QUOTA_LIST: status = cli_list_user_quota( cli, quota_fnum, &qtl); if (!NT_STATUS_IS_OK(status)) { d_printf( "%s cli_list_user_quota\n", nt_errstr(status)); return -1; } dump_ntquota_list(&qtl,verbose,numeric,SidToString); free_ntquota_list(&qtl); break; default: d_printf("Unknown Error\n"); return -1; } break; case SMB_USER_FS_QUOTA_TYPE: switch(cmd) { case QUOTA_GET: status = cli_get_fs_quota_info( cli, quota_fnum, &qt); if (!NT_STATUS_IS_OK(status)) { d_printf("%s cli_get_fs_quota_info\n", nt_errstr(status)); return -1; } dump_ntquota(&qt,True,numeric,NULL); break; case QUOTA_SETLIM: status = cli_get_fs_quota_info( cli, quota_fnum, &qt); if (!NT_STATUS_IS_OK(status)) { d_printf("%s cli_get_fs_quota_info\n", nt_errstr(status)); return -1; } qt.softlim = pqt->softlim; qt.hardlim = pqt->hardlim; status = cli_set_fs_quota_info( cli, quota_fnum, &qt); if (!NT_STATUS_IS_OK(status)) { d_printf("%s cli_set_fs_quota_info\n", nt_errstr(status)); return -1; } status = cli_get_fs_quota_info( cli, quota_fnum, &qt); if (!NT_STATUS_IS_OK(status)) { d_printf("%s cli_get_fs_quota_info\n", nt_errstr(status)); return -1; } dump_ntquota(&qt,True,numeric,NULL); break; case QUOTA_SETFLAGS: status = cli_get_fs_quota_info( cli, quota_fnum, &qt); if (!NT_STATUS_IS_OK(status)) { d_printf("%s cli_get_fs_quota_info\n", nt_errstr(status)); return -1; } qt.qflags = pqt->qflags; status = cli_set_fs_quota_info( cli, quota_fnum, &qt); if (!NT_STATUS_IS_OK(status)) { d_printf("%s cli_set_fs_quota_info\n", nt_errstr(status)); return -1; } status = cli_get_fs_quota_info( cli, quota_fnum, &qt); if (!NT_STATUS_IS_OK(status)) { d_printf("%s cli_get_fs_quota_info\n", nt_errstr(status)); return -1; } dump_ntquota(&qt,True,numeric,NULL); break; default: d_printf("Unknown Error\n"); return -1; } break; default: d_printf("Unknown Error\n"); return -1; } cli_close(cli, quota_fnum); return 0; }
static int parse_quota_set(pstring set_str, pstring username_str, enum SMB_QUOTA_TYPE *qtype, int *cmd, SMB_NTQUOTA_STRUCT *pqt) { char *p = set_str,*p2; int todo; BOOL stop = False; BOOL enable = False; BOOL deny = False; if (strnequal(set_str,"UQLIM:",6)) { p += 6; *qtype = SMB_USER_QUOTA_TYPE; *cmd = QUOTA_SETLIM; todo = PARSE_LIM; if ((p2=strstr(p,":"))==NULL) { return -1; } *p2 = '\0'; p2++; fstrcpy(username_str,p); p = p2; } else if (strnequal(set_str,"FSQLIM:",7)) { p +=7; *qtype = SMB_USER_FS_QUOTA_TYPE; *cmd = QUOTA_SETLIM; todo = PARSE_LIM; } else if (strnequal(set_str,"FSQFLAGS:",9)) { p +=9; todo = PARSE_FLAGS; *qtype = SMB_USER_FS_QUOTA_TYPE; *cmd = QUOTA_SETFLAGS; } else { return -1; } switch (todo) { case PARSE_LIM: #if defined(HAVE_LONGLONG) if (sscanf(p,"%llu/%llu",&pqt->softlim,&pqt->hardlim)!=2) { #else if (sscanf(p,"%lu/%lu",&pqt->softlim,&pqt->hardlim)!=2) { #endif return -1; } break; case PARSE_FLAGS: while (!stop) { if ((p2=strstr(p,"/"))==NULL) { stop = True; } else { *p2 = '\0'; p2++; } if (strnequal(p,"QUOTA_ENABLED",13)) { enable = True; } else if (strnequal(p,"DENY_DISK",9)) { deny = True; } else if (strnequal(p,"LOG_SOFTLIMIT",13)) { pqt->qflags |= QUOTAS_LOG_THRESHOLD; } else if (strnequal(p,"LOG_HARDLIMIT",13)) { pqt->qflags |= QUOTAS_LOG_LIMIT; } else { return -1; } p=p2; } if (deny) { pqt->qflags |= QUOTAS_DENY_DISK; } else if (enable) { pqt->qflags |= QUOTAS_ENABLED; } break; } return 0; } static int do_quota(struct cli_state *cli, enum SMB_QUOTA_TYPE qtype, uint16 cmd, pstring username_str, SMB_NTQUOTA_STRUCT *pqt) { uint32 fs_attrs = 0; int quota_fnum = 0; SMB_NTQUOTA_LIST *qtl = NULL; SMB_NTQUOTA_STRUCT qt; ZERO_STRUCT(qt); if (!cli_get_fs_attr_info(cli, &fs_attrs)) { d_printf("Failed to get the filesystem attributes %s.\n", cli_errstr(cli)); return -1; } if (!(fs_attrs & FILE_VOLUME_QUOTAS)) { d_printf("Quotas are not supported by the server.\n"); return 0; } if (!cli_get_quota_handle(cli, "a_fnum)) { d_printf("Failed to open \\%s %s.\n", FAKE_FILE_NAME_QUOTA,cli_errstr(cli)); return -1; } switch(qtype) { case SMB_USER_QUOTA_TYPE: if (!StringToSid(&qt.sid, username_str)) { d_printf("StringToSid() failed for [%s]\n",username_str); return -1; } switch(cmd) { case QUOTA_GET: if (!cli_get_user_quota(cli, quota_fnum, &qt)) { d_printf("%s cli_get_user_quota %s\n", cli_errstr(cli),username_str); return -1; } dump_ntquota(&qt,verbose,numeric,SidToString); break; case QUOTA_SETLIM: pqt->sid = qt.sid; if (!cli_set_user_quota(cli, quota_fnum, pqt)) { d_printf("%s cli_set_user_quota %s\n", cli_errstr(cli),username_str); return -1; } if (!cli_get_user_quota(cli, quota_fnum, &qt)) { d_printf("%s cli_get_user_quota %s\n", cli_errstr(cli),username_str); return -1; } dump_ntquota(&qt,verbose,numeric,SidToString); break; case QUOTA_LIST: if (!cli_list_user_quota(cli, quota_fnum, &qtl)) { d_printf("%s cli_set_user_quota %s\n", cli_errstr(cli),username_str); return -1; } dump_ntquota_list(&qtl,verbose,numeric,SidToString); free_ntquota_list(&qtl); break; default: d_printf("Unknown Error\n"); return -1; } break; case SMB_USER_FS_QUOTA_TYPE: switch(cmd) { case QUOTA_GET: if (!cli_get_fs_quota_info(cli, quota_fnum, &qt)) { d_printf("%s cli_get_fs_quota_info\n", cli_errstr(cli)); return -1; } dump_ntquota(&qt,True,numeric,NULL); break; case QUOTA_SETLIM: if (!cli_get_fs_quota_info(cli, quota_fnum, &qt)) { d_printf("%s cli_get_fs_quota_info\n", cli_errstr(cli)); return -1; } qt.softlim = pqt->softlim; qt.hardlim = pqt->hardlim; if (!cli_set_fs_quota_info(cli, quota_fnum, &qt)) { d_printf("%s cli_set_fs_quota_info\n", cli_errstr(cli)); return -1; } if (!cli_get_fs_quota_info(cli, quota_fnum, &qt)) { d_printf("%s cli_get_fs_quota_info\n", cli_errstr(cli)); return -1; } dump_ntquota(&qt,True,numeric,NULL); break; case QUOTA_SETFLAGS: if (!cli_get_fs_quota_info(cli, quota_fnum, &qt)) { d_printf("%s cli_get_fs_quota_info\n", cli_errstr(cli)); return -1; } qt.qflags = pqt->qflags; if (!cli_set_fs_quota_info(cli, quota_fnum, &qt)) { d_printf("%s cli_set_fs_quota_info\n", cli_errstr(cli)); return -1; } if (!cli_get_fs_quota_info(cli, quota_fnum, &qt)) { d_printf("%s cli_get_fs_quota_info\n", cli_errstr(cli)); return -1; } dump_ntquota(&qt,True,numeric,NULL); break; default: d_printf("Unknown Error\n"); return -1; } break; default: d_printf("Unknown Error\n"); return -1; } cli_close(cli, quota_fnum); return 0; }
static int do_quota(struct cli_state *cli, enum SMB_QUOTA_TYPE qtype, uint16 cmd, const char *username_str, SMB_NTQUOTA_STRUCT *pqt) { uint32 fs_attrs = 0; int quota_fnum = 0; SMB_NTQUOTA_LIST *qtl = NULL; SMB_NTQUOTA_STRUCT qt; ZERO_STRUCT(qt); if (!cli_get_fs_attr_info(cli, &fs_attrs)) { d_printf("Failed to get the filesystem attributes %s.\n", cli_errstr(cli)); return -1; } if (!(fs_attrs & FILE_VOLUME_QUOTAS)) { d_printf("Quotas are not supported by the server.\n"); return 0; } if (!cli_get_quota_handle(cli, "a_fnum)) { d_printf("Quotas are not enabled on this share.\n"); d_printf("Failed to open %s %s.\n", FAKE_FILE_NAME_QUOTA_WIN32,cli_errstr(cli)); return -1; } switch(qtype) { case SMB_USER_QUOTA_TYPE: if (!StringToSid(&qt.sid, username_str)) { d_printf("StringToSid() failed for [%s]\n",username_str); return -1; } switch(cmd) { case QUOTA_GET: if (!cli_get_user_quota(cli, quota_fnum, &qt)) { d_printf("%s cli_get_user_quota %s\n", cli_errstr(cli),username_str); return -1; } dump_ntquota(&qt,verbose,numeric,SidToString); break; case QUOTA_SETLIM: pqt->sid = qt.sid; if (!cli_set_user_quota(cli, quota_fnum, pqt)) { d_printf("%s cli_set_user_quota %s\n", cli_errstr(cli),username_str); return -1; } if (!cli_get_user_quota(cli, quota_fnum, &qt)) { d_printf("%s cli_get_user_quota %s\n", cli_errstr(cli),username_str); return -1; } dump_ntquota(&qt,verbose,numeric,SidToString); break; case QUOTA_LIST: if (!cli_list_user_quota(cli, quota_fnum, &qtl)) { d_printf("%s cli_set_user_quota %s\n", cli_errstr(cli),username_str); return -1; } dump_ntquota_list(&qtl,verbose,numeric,SidToString); free_ntquota_list(&qtl); break; default: d_printf("Unknown Error\n"); return -1; } break; case SMB_USER_FS_QUOTA_TYPE: switch(cmd) { case QUOTA_GET: if (!cli_get_fs_quota_info(cli, quota_fnum, &qt)) { d_printf("%s cli_get_fs_quota_info\n", cli_errstr(cli)); return -1; } dump_ntquota(&qt,True,numeric,NULL); break; case QUOTA_SETLIM: if (!cli_get_fs_quota_info(cli, quota_fnum, &qt)) { d_printf("%s cli_get_fs_quota_info\n", cli_errstr(cli)); return -1; } qt.softlim = pqt->softlim; qt.hardlim = pqt->hardlim; if (!cli_set_fs_quota_info(cli, quota_fnum, &qt)) { d_printf("%s cli_set_fs_quota_info\n", cli_errstr(cli)); return -1; } if (!cli_get_fs_quota_info(cli, quota_fnum, &qt)) { d_printf("%s cli_get_fs_quota_info\n", cli_errstr(cli)); return -1; } dump_ntquota(&qt,True,numeric,NULL); break; case QUOTA_SETFLAGS: if (!cli_get_fs_quota_info(cli, quota_fnum, &qt)) { d_printf("%s cli_get_fs_quota_info\n", cli_errstr(cli)); return -1; } qt.qflags = pqt->qflags; if (!cli_set_fs_quota_info(cli, quota_fnum, &qt)) { d_printf("%s cli_set_fs_quota_info\n", cli_errstr(cli)); return -1; } if (!cli_get_fs_quota_info(cli, quota_fnum, &qt)) { d_printf("%s cli_get_fs_quota_info\n", cli_errstr(cli)); return -1; } dump_ntquota(&qt,True,numeric,NULL); break; default: d_printf("Unknown Error\n"); return -1; } break; default: d_printf("Unknown Error\n"); return -1; } cli_close(cli, quota_fnum); return 0; }