first pass at updating head branch to be to be the same as the SAMBA_2_0 branch
[kai/samba-autobuild/.git] / source3 / rpc_client / cli_srvsvc.c
index 4180141cbaae4fe8efc7e41fd568748e4e560cf3..b883cc19425d891a76e83e395043236894385b8a 100644 (file)
@@ -6,6 +6,7 @@
  *  Copyright (C) Andrew Tridgell              1992-1997,
  *  Copyright (C) Luke Kenneth Casson Leighton 1996-1997,
  *  Copyright (C) Paul Ashton                       1997.
+ *  Copyright (C) Jeremy Allison                    1999.
  *  
  *  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
 
 extern int DEBUGLEVEL;
 
-/****************************************************************************
-do a server net tprt enum
-****************************************************************************/
-BOOL srv_net_srv_tprt_enum(
-                       const char *srv_name, 
-                       uint32 switch_value, SRV_TPRT_INFO_CTR *ctr,
-                       uint32 preferred_len,
-                       ENUM_HND *hnd)
-{
-       prs_struct data; 
-       prs_struct rdata;
-       SRV_Q_NET_TPRT_ENUM q_o;
-       BOOL valid_enum = False;
-       struct cli_connection *con = NULL;
-
-       if (ctr == NULL || preferred_len == 0) return False;
-
-       if (!cli_connection_init(srv_name, PIPE_SRVSVC, &con))
-       {
-               return False;
-       }
-
-       prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
-       prs_init(&rdata, 0   , 4, SAFETY_MARGIN, True );
-
-       /* create and send a MSRPC command with api SRV_NETTPRTENUM */
-
-       DEBUG(4,("SRV Net Server Transport Enum, level %d, enum:%8x\n",
-                               switch_value, get_enum_hnd(hnd)));
-                               
-       ctr->switch_value = switch_value;
-       ctr->ptr_tprt_ctr = 1;
-       ctr->tprt.info0.num_entries_read = 0;
-       ctr->tprt.info0.ptr_tprt_info    = 1;
-
-       /* store the parameters */
-       make_srv_q_net_tprt_enum(&q_o, srv_name,
-                                switch_value, ctr,
-                                preferred_len,
-                                hnd);
-
-       /* turn parameters into data stream */
-       srv_io_q_net_tprt_enum("", &q_o, &data, 0);
-
-       /* send the data on \PIPE\ */
-       if (rpc_con_pipe_req(con, SRV_NETTRANSPORTENUM, &data, &rdata))
-       {
-               SRV_R_NET_TPRT_ENUM r_o;
-               BOOL p;
-
-               r_o.ctr = ctr;
-
-               srv_io_r_net_tprt_enum("", &r_o, &rdata, 0);
-               p = rdata.offset != 0;
-               
-               if (p && r_o.status != 0)
-               {
-                       /* report error code */
-                       DEBUG(0,("SRV_R_NET_SRV_GET_INFO: %s\n", get_nt_error_msg(r_o.status)));
-                       p = 0;
-               }
-
-               if (p && r_o.ctr->switch_value != switch_value)
-               {
-                       /* different switch levels.  oops. */
-                       DEBUG(0,("SRV_R_NET_SRV_TPRT_ENUM: info class %d does not match request %d\n",
-                               r_o.ctr->switch_value, switch_value));
-                       p = 0;
-               }
-
-               if (p)
-               {
-                       /* ok, at last: we're happy. */
-                       valid_enum = True;
-               }
-       }
-
-       prs_mem_free(&data   );
-       prs_mem_free(&rdata  );
-       
-       cli_connection_unlink(con);
-
-       return valid_enum;
-}
-
 /****************************************************************************
 do a server net conn enum
 ****************************************************************************/
-BOOL srv_net_srv_conn_enum( char *srv_name, char *qual_name,
+BOOL do_srv_net_srv_conn_enum(struct cli_state *cli,
+                       char *server_name, char *qual_name,
                        uint32 switch_value, SRV_CONN_INFO_CTR *ctr,
                        uint32 preferred_len,
                        ENUM_HND *hnd)
@@ -127,23 +44,18 @@ BOOL srv_net_srv_conn_enum( char *srv_name, char *qual_name,
        prs_struct data; 
        prs_struct rdata;
        SRV_Q_NET_CONN_ENUM q_o;
-       BOOL valid_enum = False;
-       struct cli_connection *con = NULL;
-
-       if (ctr == NULL || preferred_len == 0) return False;
+       SRV_R_NET_CONN_ENUM r_o;
 
-       if (!cli_connection_init(srv_name, PIPE_SRVSVC, &con))
-       {
+       if (server_name == NULL || ctr == NULL || preferred_len == 0)
                return False;
-       }
 
-       prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
-       prs_init(&rdata, 0   , 4, SAFETY_MARGIN, True );
+       prs_init(&data , MAX_PDU_FRAG_LEN, 4, MARSHALL);
+       prs_init(&rdata, 0, 4, UNMARSHALL);
 
        /* create and send a MSRPC command with api SRV_NETCONNENUM */
 
-       DEBUG(4,("SRV Net Server Connection Enum %s), level %d, enum:%8x\n",
-                               qual_name, switch_value, get_enum_hnd(hnd)));
+       DEBUG(4,("SRV Net Server Connection Enum(%s, %s), level %d, enum:%8x\n",
+                               server_name, qual_name, switch_value, get_enum_hnd(hnd)));
                                
        ctr->switch_value = switch_value;
        ctr->ptr_conn_ctr = 1;
@@ -151,59 +63,60 @@ BOOL srv_net_srv_conn_enum( char *srv_name, char *qual_name,
        ctr->conn.info0.ptr_conn_info    = 1;
 
        /* store the parameters */
-       make_srv_q_net_conn_enum(&q_o, srv_name, qual_name,
+       init_srv_q_net_conn_enum(&q_o, server_name, qual_name,
                                 switch_value, ctr,
                                 preferred_len,
                                 hnd);
 
        /* turn parameters into data stream */
-       srv_io_q_net_conn_enum("", &q_o, &data, 0);
+       if(!srv_io_q_net_conn_enum("", &q_o, &data, 0)) {
+               prs_mem_free(&data);
+               prs_mem_free(&rdata);
+               return False;
+       }
 
        /* send the data on \PIPE\ */
-       if (rpc_con_pipe_req(con, SRV_NETCONNENUM, &data, &rdata))
-       {
-               SRV_R_NET_CONN_ENUM r_o;
-               BOOL p;
+       if(!rpc_api_pipe_req(cli, SRV_NETCONNENUM, &data, &rdata)) {
+               prs_mem_free(&data);
+               prs_mem_free(&rdata);
+               return False;
+       }
 
-               r_o.ctr = ctr;
+       prs_mem_free(&data);
 
-               srv_io_r_net_conn_enum("", &r_o, &rdata, 0);
-               p = rdata.offset != 0;
-               
-               if (p && r_o.status != 0)
-               {
-                       /* report error code */
-                       DEBUG(0,("SRV_R_NET_SRV_GET_INFO: %s\n", get_nt_error_msg(r_o.status)));
-                       p = 0;
-               }
-
-               if (p && r_o.ctr->switch_value != switch_value)
-               {
-                       /* different switch levels.  oops. */
-                       DEBUG(0,("SRV_R_NET_SRV_CONN_ENUM: info class %d does not match request %d\n",
-                               r_o.ctr->switch_value, switch_value));
-                       p = 0;
-               }
-
-               if (p)
-               {
-                       /* ok, at last: we're happy. */
-                       valid_enum = True;
-               }
+       r_o.ctr = ctr;
+
+       if(!srv_io_r_net_conn_enum("", &r_o, &rdata, 0)) {
+               prs_mem_free(&rdata);
+               return False;
        }
 
-       prs_mem_free(&data   );
-       prs_mem_free(&rdata  );
-       
-       cli_connection_unlink(con);
+       if (r_o.status != 0) {
+               /* report error code */
+               DEBUG(0,("SRV_R_NET_SRV_CONN_ENUM: %s\n", get_nt_error_msg(r_o.status)));
+               prs_mem_free(&rdata);
+               return False;
+       }
 
-       return valid_enum;
+       if (r_o.ctr->switch_value != switch_value) {
+               /* different switch levels.  oops. */
+               DEBUG(0,("SRV_R_NET_SRV_CONN_ENUM: info class %d does not match request %d\n",
+                       r_o.ctr->switch_value, switch_value));
+               prs_mem_free(&rdata);
+               return False;
+       }
+
+       prs_mem_free(&rdata);
+       
+       return True;
 }
 
 /****************************************************************************
 do a server net sess enum
 ****************************************************************************/
-BOOL srv_net_srv_sess_enum( char *srv_name, char *qual_name, char *user_name,
+
+BOOL do_srv_net_srv_sess_enum(struct cli_state *cli,
+                       char *server_name, char *qual_name,
                        uint32 switch_value, SRV_SESS_INFO_CTR *ctr,
                        uint32 preferred_len,
                        ENUM_HND *hnd)
@@ -211,23 +124,18 @@ BOOL srv_net_srv_sess_enum( char *srv_name, char *qual_name, char *user_name,
        prs_struct data; 
        prs_struct rdata;
        SRV_Q_NET_SESS_ENUM q_o;
-       BOOL valid_enum = False;
-       struct cli_connection *con = NULL;
-
-       if (ctr == NULL || preferred_len == 0) return False;
+       SRV_R_NET_SESS_ENUM r_o;
 
-       if (!cli_connection_init(srv_name, PIPE_SRVSVC, &con))
-       {
+       if (server_name == NULL || ctr == NULL || preferred_len == 0)
                return False;
-       }
 
-       prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
-       prs_init(&rdata, 0   , 4, SAFETY_MARGIN, True );
+       prs_init(&data , MAX_PDU_FRAG_LEN, 4, MARSHALL);
+       prs_init(&rdata, 0, 4, UNMARSHALL);
 
        /* create and send a MSRPC command with api SRV_NETSESSENUM */
 
-       DEBUG(4,("SRV Net Session Enum, level %d, enum:%8x\n",
-                               switch_value, get_enum_hnd(hnd)));
+       DEBUG(4,("SRV Net Session Enum (%s), level %d, enum:%8x\n",
+                               server_name, switch_value, get_enum_hnd(hnd)));
                                
        ctr->switch_value = switch_value;
        ctr->ptr_sess_ctr = 1;
@@ -235,145 +143,130 @@ BOOL srv_net_srv_sess_enum( char *srv_name, char *qual_name, char *user_name,
        ctr->sess.info0.ptr_sess_info    = 1;
 
        /* store the parameters */
-       make_srv_q_net_sess_enum(&q_o, srv_name, qual_name, user_name,
+       init_srv_q_net_sess_enum(&q_o, server_name, qual_name,
                                 switch_value, ctr,
                                 preferred_len,
                                 hnd);
 
        /* turn parameters into data stream */
-       srv_io_q_net_sess_enum("", &q_o, &data, 0);
+       if(!srv_io_q_net_sess_enum("", &q_o, &data, 0)) {
+               prs_mem_free(&data);
+               prs_mem_free(&rdata);
+               return False;
+       }
 
        /* send the data on \PIPE\ */
-       if (rpc_con_pipe_req(con, SRV_NETSESSENUM, &data, &rdata))
-       {
-               SRV_R_NET_SESS_ENUM r_o;
-               BOOL p;
+       if (!rpc_api_pipe_req(cli, SRV_NETSESSENUM, &data, &rdata)) {
+               prs_mem_free(&data);
+               prs_mem_free(&rdata);
+               return False;
+       }
+
+       prs_mem_free(&data);
 
-               r_o.ctr = ctr;
+       r_o.ctr = ctr;
 
-               srv_io_r_net_sess_enum("", &r_o, &rdata, 0);
-               p = rdata.offset != 0;
+       if(!srv_io_r_net_sess_enum("", &r_o, &rdata, 0)) {
+               prs_mem_free(&rdata);
+               return False;
+       }
                
-               if (p && r_o.status != 0)
-               {
-                       /* report error code */
-                       DEBUG(0,("SRV_R_NET_SRV_SESS_ENUM: %s\n", get_nt_error_msg(r_o.status)));
-                       p = 0;
-               }
-
-               if (p && r_o.ctr->switch_value != switch_value)
-               {
-                       /* different switch levels.  oops. */
-                       DEBUG(0,("SRV_R_NET_SRV_SESS_ENUM: info class %d does not match request %d\n",
-                               r_o.ctr->switch_value, switch_value));
-                       p = 0;
-               }
-
-               if (p)
-               {
-                       /* ok, at last: we're happy. */
-                       valid_enum = True;
-               }
+       if (r_o.status != 0) {
+               /* report error code */
+               DEBUG(0,("SRV_R_NET_SRV_SESS_ENUM: %s\n", get_nt_error_msg(r_o.status)));
+               prs_mem_free(&rdata);
+               return False;
        }
 
-       prs_mem_free(&data   );
-       prs_mem_free(&rdata  );
-       
-       cli_connection_unlink(con);
+       if (r_o.ctr->switch_value != switch_value) {
+               /* different switch levels.  oops. */
+               DEBUG(0,("SRV_R_NET_SRV_SESS_ENUM: info class %d does not match request %d\n",
+                       r_o.ctr->switch_value, switch_value));
+               prs_mem_free(&rdata);
+               return False;
+       }
 
-       return valid_enum;
+       prs_mem_free(&rdata);
+       
+       return True;
 }
 
 /****************************************************************************
 do a server net share enum
 ****************************************************************************/
-BOOL srv_net_srv_share_enum( char *srv_name, 
-                       uint32 switch_value, SRV_SHARE_INFO_CTR *ctr,
-                       uint32 preferred_len,
-                       ENUM_HND *hnd)
+BOOL do_srv_net_srv_share_enum(struct cli_state *cli,
+                       char *server_name, 
+                       uint32 switch_value, SRV_R_NET_SHARE_ENUM *r_o,
+                       uint32 preferred_len, ENUM_HND *hnd)
 {
        prs_struct data; 
        prs_struct rdata;
        SRV_Q_NET_SHARE_ENUM q_o;
-       BOOL valid_enum = False;
-       struct cli_connection *con = NULL;
-
-       if (ctr == NULL || preferred_len == 0) return False;
 
-       if (!cli_connection_init(srv_name, PIPE_SRVSVC, &con))
-       {
+       if (server_name == NULL || preferred_len == 0)
                return False;
-       }
 
-       prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
-       prs_init(&rdata, 0   , 4, SAFETY_MARGIN, True );
+       prs_init(&data , MAX_PDU_FRAG_LEN, 4, MARSHALL);
+       prs_init(&rdata, 0, 4, UNMARSHALL);
 
        /* create and send a MSRPC command with api SRV_NETSHAREENUM */
 
-       DEBUG(4,("SRV Get Share Info, level %d, enum:%8x\n",
-                               switch_value, get_enum_hnd(hnd)));
+       DEBUG(4,("SRV Get Share Info (%s), level %d, enum:%8x\n",
+                               server_name, switch_value, get_enum_hnd(hnd)));
                                
-       q_o.share_level = switch_value;
-
-       ctr->switch_value = switch_value;
-       ctr->ptr_share_ctr = 1;
-       ctr->share.info1.num_entries_read = 0;
-       ctr->share.info1.ptr_share_info    = 1;
-
        /* store the parameters */
-       make_srv_q_net_share_enum(&q_o, srv_name, 
-                                switch_value, ctr,
-                                preferred_len,
-                                hnd);
+       init_srv_q_net_share_enum(&q_o, server_name, switch_value,
+                                 preferred_len, hnd);
 
        /* turn parameters into data stream */
-       srv_io_q_net_share_enum("", &q_o, &data, 0);
+       if(!srv_io_q_net_share_enum("", &q_o, &data, 0)) {
+               prs_mem_free(&data);
+               prs_mem_free(&rdata);
+               return False;
+       }
 
        /* send the data on \PIPE\ */
-       if (rpc_con_pipe_req(con, SRV_NETSHAREENUM, &data, &rdata))
-       {
-               SRV_R_NET_SHARE_ENUM r_o;
-               BOOL p;
+       if (!rpc_api_pipe_req(cli, SRV_NETSHAREENUM, &data, &rdata)) {
+               prs_mem_free(&data);
+               prs_mem_free(&rdata);
+               return False;
+       }
 
-               r_o.ctr = ctr;
+       prs_mem_free(&data);
 
-               srv_io_r_net_share_enum("", &r_o, &rdata, 0);
-               p = rdata.offset != 0;
+       if(!srv_io_r_net_share_enum("", r_o, &rdata, 0)) {
+               prs_mem_free(&rdata);
+               return False;
+       }
                
-               if (p && r_o.status != 0)
-               {
-                       /* report error code */
-                       DEBUG(0,("SRV_R_NET_SRV_GET_INFO: %s\n", get_nt_error_msg(r_o.status)));
-                       p = 0;
-               }
-
-               if (p && r_o.ctr->switch_value != switch_value)
-               {
-                       /* different switch levels.  oops. */
-                       DEBUG(0,("SRV_R_NET_SRV_SHARE_ENUM: info class %d does not match request %d\n",
-                               r_o.ctr->switch_value, switch_value));
-                       p = 0;
-               }
-
-               if (p)
-               {
-                       /* ok, at last: we're happy. */
-                       valid_enum = True;
-               }
+       if (r_o->status != 0) {
+               /* report error code */
+               DEBUG(0,("SRV_R_NET_SHARE_ENUM: %s\n", get_nt_error_msg(r_o->status)));
+               prs_mem_free(&rdata);
+               free_srv_r_net_share_enum(r_o);
+               return False;
        }
 
-       prs_mem_free(&data   );
-       prs_mem_free(&rdata  );
-       
-       cli_connection_unlink(con);
+       if (r_o->ctr.switch_value != switch_value) {
+               /* different switch levels.  oops. */
+               DEBUG(0,("SRV_R_NET_SHARE_ENUM: info class %d does not match request %d\n",
+                       r_o->ctr.switch_value, switch_value));
+               prs_mem_free(&rdata);
+               free_srv_r_net_share_enum(r_o);
+               return False;
+       }
 
-       return valid_enum;
+       prs_mem_free(&rdata);
+       
+       return True;
 }
 
 /****************************************************************************
 do a server net file enum
 ****************************************************************************/
-BOOL srv_net_srv_file_enum( char *srv_name, char *qual_name, uint32 file_id,
+
+BOOL do_srv_net_srv_file_enum(struct cli_state *cli,
+                       char *server_name, char *qual_name,
                        uint32 switch_value, SRV_FILE_INFO_CTR *ctr,
                        uint32 preferred_len,
                        ENUM_HND *hnd)
@@ -381,23 +274,18 @@ BOOL srv_net_srv_file_enum( char *srv_name, char *qual_name, uint32 file_id,
        prs_struct data; 
        prs_struct rdata;
        SRV_Q_NET_FILE_ENUM q_o;
-       BOOL valid_enum = False;
-       struct cli_connection *con = NULL;
+       SRV_R_NET_FILE_ENUM r_o;
 
-       if (ctr == NULL || preferred_len == 0) return False;
-
-       if (!cli_connection_init(srv_name, PIPE_SRVSVC, &con))
-       {
+       if (server_name == NULL || ctr == NULL || preferred_len == 0)
                return False;
-       }
 
-       prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
-       prs_init(&rdata, 0   , 4, SAFETY_MARGIN, True );
+       prs_init(&data , MAX_PDU_FRAG_LEN, 4, MARSHALL);
+       prs_init(&rdata, 0, 4, UNMARSHALL);
 
        /* create and send a MSRPC command with api SRV_NETFILEENUM */
 
-       DEBUG(4,("SRV Get File Info level %d, enum:%8x\n",
-                               switch_value, get_enum_hnd(hnd)));
+       DEBUG(4,("SRV Get File Info (%s), level %d, enum:%8x\n",
+                               server_name, switch_value, get_enum_hnd(hnd)));
                                
        q_o.file_level = switch_value;
 
@@ -407,189 +295,117 @@ BOOL srv_net_srv_file_enum( char *srv_name, char *qual_name, uint32 file_id,
        ctr->file.info3.ptr_file_info    = 1;
 
        /* store the parameters */
-       make_srv_q_net_file_enum(&q_o, srv_name, qual_name, file_id,
+       init_srv_q_net_file_enum(&q_o, server_name, qual_name,
                                 switch_value, ctr,
                                 preferred_len,
                                 hnd);
 
        /* turn parameters into data stream */
-       srv_io_q_net_file_enum("", &q_o, &data, 0);
+       if(!srv_io_q_net_file_enum("", &q_o, &data, 0)) {
+               prs_mem_free(&data);
+               prs_mem_free(&rdata);
+               return False;
+       }
 
        /* send the data on \PIPE\ */
-       if (rpc_con_pipe_req(con, SRV_NETFILEENUM, &data, &rdata))
-       {
-               SRV_R_NET_FILE_ENUM r_o;
-               BOOL p;
+       if (!rpc_api_pipe_req(cli, SRV_NETFILEENUM, &data, &rdata)) {
+               prs_mem_free(&data);
+               prs_mem_free(&rdata);
+               return False;
+       }
 
-               r_o.ctr = ctr;
+       prs_mem_free(&data);
 
-               srv_io_r_net_file_enum("", &r_o, &rdata, 0);
-               p = rdata.offset != 0;
+       r_o.ctr = ctr;
+
+       if(!srv_io_r_net_file_enum("", &r_o, &rdata, 0)) {
+               prs_mem_free(&rdata);
+               return False;
+       }
                
-               if (p && r_o.status != 0)
-               {
-                       /* report error code */
-                       DEBUG(0,("SRV_R_NET_SRV_GET_INFO: %s\n", get_nt_error_msg(r_o.status)));
-                       p = 0;
-               }
-
-               if (p && r_o.ctr->switch_value != switch_value)
-               {
-                       /* different switch levels.  oops. */
-                       DEBUG(0,("SRV_R_NET_SRV_FILE_ENUM: info class %d does not match request %d\n",
-                               r_o.ctr->switch_value, switch_value));
-                       p = 0;
-               }
-
-               if (p)
-               {
-                       /* ok, at last: we're happy. */
-                       valid_enum = True;
-               }
+       if (r_o.status != 0) {
+               /* report error code */
+               DEBUG(0,("SRV_R_NET_FILE_ENUM: %s\n", get_nt_error_msg(r_o.status)));
+               prs_mem_free(&rdata);
+               return False;
        }
 
-       prs_mem_free(&data   );
-       prs_mem_free(&rdata  );
-       
-       cli_connection_unlink(con);
+       if (r_o.ctr->switch_value != switch_value) {
+               /* different switch levels.  oops. */
+               DEBUG(0,("SRV_R_NET_FILE_ENUM: info class %d does not match request %d\n",
+                       r_o.ctr->switch_value, switch_value));
+               prs_mem_free(&rdata);
+               return False;
+       }
 
-       return valid_enum;
+       prs_mem_free(&rdata);
+       
+       return True;
 }
 
 /****************************************************************************
 do a server get info 
 ****************************************************************************/
-BOOL srv_net_srv_get_info( char *srv_name, uint32 switch_value,
-                               SRV_INFO_CTR *ctr)
+BOOL do_srv_net_srv_get_info(struct cli_state *cli,
+                       char *server_name, uint32 switch_value, SRV_INFO_CTR *ctr)
 {
        prs_struct data; 
        prs_struct rdata;
        SRV_Q_NET_SRV_GET_INFO q_o;
-       BOOL valid_info = False;
-       struct cli_connection *con = NULL;
-
-       if (switch_value == 0 || ctr == NULL) return False;
+       SRV_R_NET_SRV_GET_INFO r_o;
 
-       if (!cli_connection_init(srv_name, PIPE_SRVSVC, &con))
-       {
+       if (server_name == NULL || switch_value == 0 || ctr == NULL)
                return False;
-       }
 
-       prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
-       prs_init(&rdata, 0   , 4, SAFETY_MARGIN, True );
+       prs_init(&data , MAX_PDU_FRAG_LEN, 4, MARSHALL);
+       prs_init(&rdata, 0, 4, UNMARSHALL);
 
        /* create and send a MSRPC command with api SRV_NET_SRV_GET_INFO */
 
-       DEBUG(4,("SRV Get Server Info level %d\n", switch_value));
+       DEBUG(4,("SRV Get Server Info (%s), level %d\n", server_name, switch_value));
 
        /* store the parameters */
-       make_srv_q_net_srv_get_info(&q_o, srv_name, switch_value);
+       init_srv_q_net_srv_get_info(&q_o, server_name, switch_value);
 
        /* turn parameters into data stream */
-       srv_io_q_net_srv_get_info("", &q_o, &data, 0);
+       if(!srv_io_q_net_srv_get_info("", &q_o, &data, 0)) {
+               prs_mem_free(&data);
+               prs_mem_free(&rdata);
+               return False;
+       }
 
        /* send the data on \PIPE\ */
-       if (rpc_con_pipe_req(con, SRV_NET_SRV_GET_INFO, &data, &rdata))
-       {
-               SRV_R_NET_SRV_GET_INFO r_o;
-               BOOL p;
-
-               r_o.ctr = ctr;
-
-               srv_io_r_net_srv_get_info("", &r_o, &rdata, 0);
-               p = rdata.offset != 0;
-               p = rdata.offset != 0;
-               
-               if (p && r_o.status != 0)
-               {
-                       /* report error code */
-                       DEBUG(0,("SRV_R_NET_SRV_GET_INFO: %s\n", get_nt_error_msg(r_o.status)));
-                       p = 0;
-               }
-
-               if (p && r_o.ctr->switch_value != q_o.switch_value)
-               {
-                       /* different switch levels.  oops. */
-                       DEBUG(0,("SRV_R_NET_SRV_GET_INFO: info class %d does not match request %d\n",
-                               r_o.ctr->switch_value, q_o.switch_value));
-                       p = 0;
-               }
-
-               if (p)
-               {
-                       /* ok, at last: we're happy. */
-                       valid_info = True;
-               }
+       if (!rpc_api_pipe_req(cli, SRV_NET_SRV_GET_INFO, &data, &rdata)) {
+               prs_mem_free(&data);
+               prs_mem_free(&rdata);
+               return False;
        }
 
-       prs_mem_free(&data   );
-       prs_mem_free(&rdata  );
-       
-       cli_connection_unlink(con);
+       prs_mem_free(&data);
 
-       return valid_info;
-}
+       r_o.ctr = ctr;
 
-/****************************************************************************
-get server time
-****************************************************************************/
-BOOL srv_net_remote_tod( char *srv_name, TIME_OF_DAY_INFO *tod)
-{
-       prs_struct data; 
-       prs_struct rdata;
-       SRV_Q_NET_REMOTE_TOD q_t;
-       BOOL valid_info = False;
-       struct cli_connection *con = NULL;
-
-       if (tod == NULL) return False;
-
-       if (!cli_connection_init(srv_name, PIPE_SRVSVC, &con))
-       {
+       if(!srv_io_r_net_srv_get_info("", &r_o, &rdata, 0)) {
+               prs_mem_free(&rdata);
                return False;
        }
 
-       prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
-       prs_init(&rdata, 0   , 4, SAFETY_MARGIN, True );
-
-       /* create and send a MSRPC command with api SRV_NET_REMOTE_TOD */
-
-       DEBUG(4,("SRV Remote TOD (%s)\n", srv_name));
-
-       /* store the parameters */
-       make_srv_q_net_remote_tod(&q_t, srv_name);
-
-       /* turn parameters into data stream */
-       srv_io_q_net_remote_tod("", &q_t, &data, 0);
-
-       /* send the data on \PIPE\ */
-       if (rpc_con_pipe_req(con, SRV_NET_REMOTE_TOD, &data, &rdata))
-       {
-               SRV_R_NET_REMOTE_TOD r_t;
-               BOOL p;
-
-               r_t.tod = tod;
+       if (r_o.status != 0) {
+               /* report error code */
+               DEBUG(0,("SRV_R_NET_SRV_GET_INFO: %s\n", get_nt_error_msg(r_o.status)));
+               prs_mem_free(&rdata);
+               return False;
+       }
 
-               srv_io_r_net_remote_tod("", &r_t, &rdata, 0);
-               p = rdata.offset != 0;
-               p = rdata.offset != 0;
-               
-               if (p && r_t.status != 0)
-               {
-                       /* report error code */
-                       DEBUG(0,("SRV_R_NET_REMOTE_TOD: %s\n", get_nt_error_msg(r_t.status)));
-                       p = False;
-               }
-
-               if (p)
-               {
-                       valid_info = True;
-               }
+       if (r_o.ctr->switch_value != q_o.switch_value) {
+               /* different switch levels.  oops. */
+               DEBUG(0,("SRV_R_NET_SRV_GET_INFO: info class %d does not match request %d\n",
+                       r_o.ctr->switch_value, q_o.switch_value));
+               prs_mem_free(&rdata);
+               return False;
        }
 
-       prs_mem_free(&data   );
-       prs_mem_free(&rdata  );
+       prs_mem_free(&rdata);
        
-       cli_connection_unlink(con);
-
-       return valid_info;
+       return True;
 }