r3713: Implementation of get posix acls in UNIX extensions. Passes valgrind.
[tprouty/samba.git] / source3 / libsmb / clifsinfo.c
1 /* 
2    Unix SMB/CIFS implementation.
3    FS info functions
4    Copyright (C) Stefan (metze) Metzmacher      2003
5    
6    This program is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 2 of the License, or
9    (at your option) any later version.
10    
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15    
16    You should have received a copy of the GNU General Public License
17    along with this program; if not, write to the Free Software
18    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 */
20
21 #include "includes.h"
22
23 /****************************************************************************
24  Get UNIX extensions version info.
25 ****************************************************************************/
26                                                                                                                    
27 BOOL cli_unix_extensions_version(struct cli_state *cli, uint16 *pmajor, uint16 *pminor,
28                                         uint32 *pcaplow, uint32 *pcaphigh)
29 {
30         BOOL ret = False;
31         uint16 setup;
32         char param[2];
33         char *rparam=NULL, *rdata=NULL;
34         unsigned int rparam_count=0, rdata_count=0;
35
36         setup = TRANSACT2_QFSINFO;
37         
38         SSVAL(param,0,SMB_QUERY_CIFS_UNIX_INFO);
39
40         if (!cli_send_trans(cli, SMBtrans2, 
41                     NULL, 
42                     0, 0,
43                     &setup, 1, 0,
44                     param, 2, 0,
45                     NULL, 0, 560)) {
46                 goto cleanup;
47         }
48         
49         if (!cli_receive_trans(cli, SMBtrans2,
50                               &rparam, &rparam_count,
51                               &rdata, &rdata_count)) {
52                 goto cleanup;
53         }
54
55         if (cli_is_error(cli)) {
56                 ret = False;
57                 goto cleanup;
58         } else {
59                 ret = True;
60         }
61
62         if (rdata_count < 12) {
63                 goto cleanup;
64         }
65
66         *pmajor = SVAL(rdata,0);
67         *pminor = SVAL(rdata,2);
68         *pcaplow = IVAL(rdata,4);
69         *pcaphigh = IVAL(rdata,8);
70
71         /* todo: but not yet needed 
72          *       return the other stuff
73          */
74
75 cleanup:
76         SAFE_FREE(rparam);
77         SAFE_FREE(rdata);
78
79         return ret;     
80 }
81
82 BOOL cli_get_fs_attr_info(struct cli_state *cli, uint32 *fs_attr)
83 {
84         BOOL ret = False;
85         uint16 setup;
86         char param[2];
87         char *rparam=NULL, *rdata=NULL;
88         unsigned int rparam_count=0, rdata_count=0;
89
90         if (!cli||!fs_attr)
91                 smb_panic("cli_get_fs_attr_info() called with NULL Pionter!");
92
93         setup = TRANSACT2_QFSINFO;
94         
95         SSVAL(param,0,SMB_QUERY_FS_ATTRIBUTE_INFO);
96
97         if (!cli_send_trans(cli, SMBtrans2, 
98                     NULL, 
99                     0, 0,
100                     &setup, 1, 0,
101                     param, 2, 0,
102                     NULL, 0, 560)) {
103                 goto cleanup;
104         }
105         
106         if (!cli_receive_trans(cli, SMBtrans2,
107                               &rparam, &rparam_count,
108                               &rdata, &rdata_count)) {
109                 goto cleanup;
110         }
111
112         if (cli_is_error(cli)) {
113                 ret = False;
114                 goto cleanup;
115         } else {
116                 ret = True;
117         }
118
119         if (rdata_count < 12) {
120                 goto cleanup;
121         }
122
123         *fs_attr = IVAL(rdata,0);
124
125         /* todo: but not yet needed 
126          *       return the other stuff
127          */
128
129 cleanup:
130         SAFE_FREE(rparam);
131         SAFE_FREE(rdata);
132
133         return ret;     
134 }