RIP BOOL. Convert BOOL -> bool. I found a few interesting
[samba.git] / source3 / libsmb / clifsinfo.c
index 22c8bff3ba02bd526bb2cbd699b8d4eaf4ad329f..a45623b9e458a120cb3fe331d0d80b33a2d230a7 100644 (file)
@@ -5,7 +5,7 @@
    
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
@@ -14,8 +14,7 @@
    GNU General Public License for more details.
    
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 #include "includes.h"
  Get UNIX extensions version info.
 ****************************************************************************/
                                                                                                                    
-BOOL cli_unix_extensions_version(struct cli_state *cli, uint16 *pmajor, uint16 *pminor,
+bool cli_unix_extensions_version(struct cli_state *cli, uint16 *pmajor, uint16 *pminor,
                                         uint32 *pcaplow, uint32 *pcaphigh)
 {
-       BOOL ret = False;
+       bool ret = False;
        uint16 setup;
        char param[2];
        char *rparam=NULL, *rdata=NULL;
@@ -65,7 +64,7 @@ BOOL cli_unix_extensions_version(struct cli_state *cli, uint16 *pmajor, uint16 *
 
        *pmajor = SVAL(rdata,0);
        *pminor = SVAL(rdata,2);
-       *pcaplow = IVAL(rdata,4);
+       cli->posix_capabilities = *pcaplow = IVAL(rdata,4);
        *pcaphigh = IVAL(rdata,8);
 
        /* todo: but not yet needed 
@@ -79,9 +78,62 @@ cleanup:
        return ret;     
 }
 
-BOOL cli_get_fs_attr_info(struct cli_state *cli, uint32 *fs_attr)
+/****************************************************************************
+ Set UNIX extensions capabilities.
+****************************************************************************/
+                                                                                                                   
+bool cli_set_unix_extensions_capabilities(struct cli_state *cli, uint16 major, uint16 minor,
+                                        uint32 caplow, uint32 caphigh)
 {
-       BOOL ret = False;
+       bool ret = False;
+       uint16 setup;
+       char param[4];
+       char data[12];
+       char *rparam=NULL, *rdata=NULL;
+       unsigned int rparam_count=0, rdata_count=0;
+
+       setup = TRANSACT2_SETFSINFO;
+       
+       SSVAL(param,0,0);
+       SSVAL(param,2,SMB_SET_CIFS_UNIX_INFO);
+
+       SSVAL(data,0,major);
+       SSVAL(data,2,minor);
+       SIVAL(data,4,caplow);
+       SIVAL(data,8,caphigh);
+
+       if (!cli_send_trans(cli, SMBtrans2, 
+                   NULL, 
+                   0, 0,
+                   &setup, 1, 0,
+                   param, 4, 0,
+                   data, 12, 560)) {
+               goto cleanup;
+       }
+       
+       if (!cli_receive_trans(cli, SMBtrans2,
+                              &rparam, &rparam_count,
+                              &rdata, &rdata_count)) {
+               goto cleanup;
+       }
+
+       if (cli_is_error(cli)) {
+               ret = False;
+               goto cleanup;
+       } else {
+               ret = True;
+       }
+
+cleanup:
+       SAFE_FREE(rparam);
+       SAFE_FREE(rdata);
+
+       return ret;     
+}
+
+bool cli_get_fs_attr_info(struct cli_state *cli, uint32 *fs_attr)
+{
+       bool ret = False;
        uint16 setup;
        char param[2];
        char *rparam=NULL, *rdata=NULL;
@@ -132,3 +184,120 @@ cleanup:
 
        return ret;     
 }
+
+bool cli_get_fs_volume_info_old(struct cli_state *cli, fstring volume_name, uint32 *pserial_number)
+{
+       bool ret = False;
+       uint16 setup;
+       char param[2];
+       char *rparam=NULL, *rdata=NULL;
+       unsigned int rparam_count=0, rdata_count=0;
+       unsigned char nlen;
+
+       setup = TRANSACT2_QFSINFO;
+       
+       SSVAL(param,0,SMB_INFO_VOLUME);
+
+       if (!cli_send_trans(cli, SMBtrans2, 
+                   NULL, 
+                   0, 0,
+                   &setup, 1, 0,
+                   param, 2, 0,
+                   NULL, 0, 560)) {
+               goto cleanup;
+       }
+       
+       if (!cli_receive_trans(cli, SMBtrans2,
+                              &rparam, &rparam_count,
+                              &rdata, &rdata_count)) {
+               goto cleanup;
+       }
+
+       if (cli_is_error(cli)) {
+               ret = False;
+               goto cleanup;
+       } else {
+               ret = True;
+       }
+
+       if (rdata_count < 5) {
+               goto cleanup;
+       }
+
+       if (pserial_number) {
+               *pserial_number = IVAL(rdata,0);
+       }
+       nlen = CVAL(rdata,l2_vol_cch);
+       clistr_pull(cli, volume_name, rdata + l2_vol_szVolLabel, sizeof(fstring), nlen, STR_NOALIGN);
+
+       /* todo: but not yet needed 
+        *       return the other stuff
+        */
+
+cleanup:
+       SAFE_FREE(rparam);
+       SAFE_FREE(rdata);
+
+       return ret;     
+}
+
+bool cli_get_fs_volume_info(struct cli_state *cli, fstring volume_name, uint32 *pserial_number, time_t *pdate)
+{
+       bool ret = False;
+       uint16 setup;
+       char param[2];
+       char *rparam=NULL, *rdata=NULL;
+       unsigned int rparam_count=0, rdata_count=0;
+       unsigned int nlen;
+
+       setup = TRANSACT2_QFSINFO;
+       
+       SSVAL(param,0,SMB_QUERY_FS_VOLUME_INFO);
+
+       if (!cli_send_trans(cli, SMBtrans2, 
+                   NULL, 
+                   0, 0,
+                   &setup, 1, 0,
+                   param, 2, 0,
+                   NULL, 0, 560)) {
+               goto cleanup;
+       }
+       
+       if (!cli_receive_trans(cli, SMBtrans2,
+                              &rparam, &rparam_count,
+                              &rdata, &rdata_count)) {
+               goto cleanup;
+       }
+
+       if (cli_is_error(cli)) {
+               ret = False;
+               goto cleanup;
+       } else {
+               ret = True;
+       }
+
+       if (rdata_count < 19) {
+               goto cleanup;
+       }
+
+       if (pdate) {
+               struct timespec ts;
+               ts = interpret_long_date(rdata);
+               *pdate = ts.tv_sec;
+       }
+       if (pserial_number) {
+               *pserial_number = IVAL(rdata,8);
+       }
+       nlen = IVAL(rdata,12);
+       clistr_pull(cli, volume_name, rdata + 18, sizeof(fstring), nlen, STR_UNICODE);
+
+       /* todo: but not yet needed 
+        *       return the other stuff
+        */
+
+cleanup:
+       SAFE_FREE(rparam);
+       SAFE_FREE(rdata);
+
+       return ret;     
+}