summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/include/proto.h3
-rw-r--r--source3/libsmb/cliquota.c89
-rw-r--r--source3/utils/smbcquotas.c14
3 files changed, 54 insertions, 52 deletions
diff --git a/source3/include/proto.h b/source3/include/proto.h
index 0e66a523a8..c3535cd37c 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -2254,7 +2254,8 @@ bool cli_spl_close(struct cli_state *cli, uint16_t fnum);
NTSTATUS cli_get_quota_handle(struct cli_state *cli, uint16_t *quota_fnum);
void free_ntquota_list(SMB_NTQUOTA_LIST **qt_list);
-bool cli_get_user_quota(struct cli_state *cli, int quota_fnum, SMB_NTQUOTA_STRUCT *pqt);
+NTSTATUS cli_get_user_quota(struct cli_state *cli, int quota_fnum,
+ SMB_NTQUOTA_STRUCT *pqt);
bool cli_set_user_quota(struct cli_state *cli, int quota_fnum, SMB_NTQUOTA_STRUCT *pqt);
bool cli_list_user_quota(struct cli_state *cli, int quota_fnum, SMB_NTQUOTA_LIST **pqt_list);
bool cli_get_fs_quota_info(struct cli_state *cli, int quota_fnum, SMB_NTQUOTA_STRUCT *pqt);
diff --git a/source3/libsmb/cliquota.c b/source3/libsmb/cliquota.c
index 32be011db9..046426740e 100644
--- a/source3/libsmb/cliquota.c
+++ b/source3/libsmb/cliquota.c
@@ -43,7 +43,10 @@ void free_ntquota_list(SMB_NTQUOTA_LIST **qt_list)
return;
}
-static bool parse_user_quota_record(const char *rdata, unsigned int rdata_count, unsigned int *offset, SMB_NTQUOTA_STRUCT *pqt)
+static bool parse_user_quota_record(const uint8_t *rdata,
+ unsigned int rdata_count,
+ unsigned int *offset,
+ SMB_NTQUOTA_STRUCT *pqt)
{
int sid_len;
SMB_NTQUOTA_STRUCT qt;
@@ -114,7 +117,7 @@ static bool parse_user_quota_record(const char *rdata, unsigned int rdata_count,
}
#endif /* LARGE_SMB_OFF_T */
- if (!sid_parse(rdata+40,sid_len,&qt.sid)) {
+ if (!sid_parse((char *)rdata+40,sid_len,&qt.sid)) {
return false;
}
@@ -125,23 +128,24 @@ static bool parse_user_quota_record(const char *rdata, unsigned int rdata_count,
return True;
}
-bool cli_get_user_quota(struct cli_state *cli, int quota_fnum, SMB_NTQUOTA_STRUCT *pqt)
+NTSTATUS cli_get_user_quota(struct cli_state *cli, int quota_fnum,
+ SMB_NTQUOTA_STRUCT *pqt)
{
- bool ret = False;
- uint16 setup;
- char params[16];
+ uint16_t setup[1];
+ uint8_t params[16];
unsigned int data_len;
- char data[SID_MAX_SIZE+8];
- char *rparam=NULL, *rdata=NULL;
- unsigned int rparam_count=0, rdata_count=0;
+ uint8_t data[SID_MAX_SIZE+8];
+ uint8_t *rparam, *rdata;
+ uint32_t rparam_count, rdata_count;
unsigned int sid_len;
unsigned int offset;
+ NTSTATUS status;
if (!cli||!pqt) {
smb_panic("cli_get_user_quota() called with NULL Pointer!");
}
- setup = NT_TRANSACT_GET_USER_QUOTA;
+ SSVAL(setup + 0, 0, NT_TRANSACT_GET_USER_QUOTA);
SSVAL(params, 0,quota_fnum);
SSVAL(params, 2,TRANSACT_GET_USER_QUOTA_FOR_SID);
@@ -153,44 +157,32 @@ bool cli_get_user_quota(struct cli_state *cli, int quota_fnum, SMB_NTQUOTA_STRUC
data_len = sid_len+8;
SIVAL(data, 0, 0x00000000);
SIVAL(data, 4, sid_len);
- sid_linearize(data+8, sid_len, &pqt->sid);
-
- if (!cli_send_nt_trans(cli,
- NT_TRANSACT_GET_USER_QUOTA,
- 0,
- &setup, 1, 0,
- params, 16, 4,
- data, data_len, 112)) {
- DEBUG(1,("Failed to send NT_TRANSACT_GET_USER_QUOTA\n"));
- goto cleanup;
- }
-
-
- if (!cli_receive_nt_trans(cli,
- &rparam, &rparam_count,
- &rdata, &rdata_count)) {
- DEBUG(1,("Failed to recv NT_TRANSACT_GET_USER_QUOTA\n"));
- goto cleanup;
- }
-
- if (cli_is_error(cli)) {
- ret = False;
- goto cleanup;
- } else {
- ret = True;
- }
-
- if ((rparam&&rdata)&&(rparam_count>=4&&rdata_count>=8)) {
- ret = parse_user_quota_record(rdata, rdata_count, &offset, pqt);
- } else {
+ sid_linearize((char *)data+8, sid_len, &pqt->sid);
+
+ status = cli_trans(talloc_tos(), cli, SMBnttrans,
+ NULL, -1, /* name, fid */
+ NT_TRANSACT_GET_USER_QUOTA, 0,
+ setup, 1, 0, /* setup */
+ params, 16, 4, /* params */
+ data, data_len, 112, /* data */
+ NULL, /* recv_flags2 */
+ NULL, 0, NULL, /* rsetup */
+ &rparam, 4, &rparam_count,
+ &rdata, 8, &rdata_count);
+ if (!NT_STATUS_IS_OK(status)) {
+ DEBUG(1, ("NT_TRANSACT_GET_USER_QUOTA failed: %s\n",
+ nt_errstr(status)));
+ return status;
+ }
+
+ if (!parse_user_quota_record(rdata, rdata_count, &offset, pqt)) {
+ status = NT_STATUS_INVALID_NETWORK_RESPONSE;
DEBUG(0,("Got INVALID NT_TRANSACT_GET_USER_QUOTA reply.\n"));
- ret = False;
}
- cleanup:
- SAFE_FREE(rparam);
- SAFE_FREE(rdata);
- return ret;
+ TALLOC_FREE(rparam);
+ TALLOC_FREE(rdata);
+ return status;
}
bool cli_set_user_quota(struct cli_state *cli, int quota_fnum, SMB_NTQUOTA_STRUCT *pqt)
@@ -318,7 +310,8 @@ bool cli_list_user_quota(struct cli_state *cli, int quota_fnum, SMB_NTQUOTA_LIST
((curdata)&&(curdata_count>=8)&&(offset>0));
curdata +=offset,curdata_count -= offset) {
ZERO_STRUCT(qt);
- if (!parse_user_quota_record(curdata, curdata_count, &offset, &qt)) {
+ if (!parse_user_quota_record((uint8_t *)curdata, curdata_count,
+ &offset, &qt)) {
DEBUG(1,("Failed to parse the quota record\n"));
goto cleanup;
}
@@ -378,7 +371,9 @@ bool cli_list_user_quota(struct cli_state *cli, int quota_fnum, SMB_NTQUOTA_LIST
((curdata)&&(curdata_count>=8)&&(offset>0));
curdata +=offset,curdata_count -= offset) {
ZERO_STRUCT(qt);
- if (!parse_user_quota_record(curdata, curdata_count, &offset, &qt)) {
+ if (!parse_user_quota_record((uint8_t *)curdata,
+ curdata_count, &offset,
+ &qt)) {
DEBUG(1,("Failed to parse the quota record\n"));
goto cleanup;
}
diff --git a/source3/utils/smbcquotas.c b/source3/utils/smbcquotas.c
index cef3f579ee..9c64781d83 100644
--- a/source3/utils/smbcquotas.c
+++ b/source3/utils/smbcquotas.c
@@ -271,9 +271,12 @@ static int do_quota(struct cli_state *cli,
switch(cmd) {
case QUOTA_GET:
- if (!cli_get_user_quota(cli, quota_fnum, &qt)) {
+ status = cli_get_user_quota(
+ cli, quota_fnum, &qt);
+ if (!NT_STATUS_IS_OK(status)) {
d_printf("%s cli_get_user_quota %s\n",
- cli_errstr(cli),username_str);
+ nt_errstr(status),
+ username_str);
return -1;
}
dump_ntquota(&qt,verbose,numeric,SidToString);
@@ -285,9 +288,12 @@ static int do_quota(struct cli_state *cli,
cli_errstr(cli),username_str);
return -1;
}
- if (!cli_get_user_quota(cli, quota_fnum, &qt)) {
+ status = cli_get_user_quota(
+ cli, quota_fnum, &qt);
+ if (!NT_STATUS_IS_OK(status)) {
d_printf("%s cli_get_user_quota %s\n",
- cli_errstr(cli),username_str);
+ nt_errstr(status),
+ username_str);
return -1;
}
dump_ntquota(&qt,verbose,numeric,SidToString);