2 * Unix SMB/CIFS implementation.
3 * RPC Pipe client / server routines
4 * Copyright (C) Gerald (Jerry) Carter 2005.
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 3 of the License, or
9 * (at your option) any later version.
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.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, see <http://www.gnu.org/licenses/>.
23 #define DBGC_CLASS DBGC_RPC_PARSE
25 /*******************************************************************
26 ********************************************************************/
28 static bool svcctl_io_service_status( const char *desc
, SERVICE_STATUS
*status
, prs_struct
*ps
, int depth
)
31 prs_debug(ps
, depth
, desc
, "svcctl_io_service_status");
34 if(!prs_uint32("type", ps
, depth
, &status
->type
))
37 if(!prs_uint32("state", ps
, depth
, &status
->state
))
40 if(!prs_uint32("controls_accepted", ps
, depth
, &status
->controls_accepted
))
43 if(!prs_werror("win32_exit_code", ps
, depth
, &status
->win32_exit_code
))
46 if(!prs_uint32("service_exit_code", ps
, depth
, &status
->service_exit_code
))
49 if(!prs_uint32("check_point", ps
, depth
, &status
->check_point
))
52 if(!prs_uint32("wait_hint", ps
, depth
, &status
->wait_hint
))
58 /*******************************************************************
59 ********************************************************************/
61 bool svcctl_io_enum_services_status( const char *desc
, ENUM_SERVICES_STATUS
*enum_status
, RPC_BUFFER
*buffer
, int depth
)
63 prs_struct
*ps
=&buffer
->prs
;
65 prs_debug(ps
, depth
, desc
, "svcctl_io_enum_services_status");
68 if ( !smb_io_relstr("servicename", buffer
, depth
, &enum_status
->servicename
) )
70 if ( !smb_io_relstr("displayname", buffer
, depth
, &enum_status
->displayname
) )
73 if ( !svcctl_io_service_status("svc_status", &enum_status
->status
, ps
, depth
) )
79 /*******************************************************************
80 ********************************************************************/
82 bool svcctl_io_service_status_process( const char *desc
, SERVICE_STATUS_PROCESS
*status
, RPC_BUFFER
*buffer
, int depth
)
84 prs_struct
*ps
=&buffer
->prs
;
86 prs_debug(ps
, depth
, desc
, "svcctl_io_service_status_process");
89 if ( !svcctl_io_service_status("status", &status
->status
, ps
, depth
) )
94 if(!prs_uint32("process_id", ps
, depth
, &status
->process_id
))
96 if(!prs_uint32("service_flags", ps
, depth
, &status
->service_flags
))
102 /*******************************************************************
103 ********************************************************************/
105 uint32
svcctl_sizeof_enum_services_status( ENUM_SERVICES_STATUS
*status
)
109 size
+= size_of_relative_string( &status
->servicename
);
110 size
+= size_of_relative_string( &status
->displayname
);
111 size
+= sizeof(SERVICE_STATUS
);
116 /********************************************************************
117 ********************************************************************/
119 static uint32
sizeof_unistr2( UNISTR2
*string
)
126 size
= sizeof(uint32
) * 3; /* length fields */
127 size
+= 2 * string
->uni_max_len
; /* string data */
128 size
+= size
% 4; /* alignment */
133 /*******************************************************************
134 ********************************************************************/
136 bool svcctl_io_q_enum_services_status(const char *desc
, SVCCTL_Q_ENUM_SERVICES_STATUS
*q_u
, prs_struct
*ps
, int depth
)
141 prs_debug(ps
, depth
, desc
, "svcctl_io_q_enum_services_status");
147 if(!smb_io_pol_hnd("scm_pol", &q_u
->handle
, ps
, depth
))
150 if(!prs_uint32("type", ps
, depth
, &q_u
->type
))
152 if(!prs_uint32("state", ps
, depth
, &q_u
->state
))
154 if(!prs_uint32("buffer_size", ps
, depth
, &q_u
->buffer_size
))
157 if(!prs_pointer("resume", ps
, depth
, (void*)&q_u
->resume
, sizeof(uint32
), (PRS_POINTER_CAST
)prs_uint32
))
163 /*******************************************************************
164 ********************************************************************/
166 bool svcctl_io_r_enum_services_status(const char *desc
, SVCCTL_R_ENUM_SERVICES_STATUS
*r_u
, prs_struct
*ps
, int depth
)
171 prs_debug(ps
, depth
, desc
, "svcctl_io_r_enum_services_status");
177 if (!prs_rpcbuffer("", ps
, depth
, &r_u
->buffer
))
183 if(!prs_uint32("needed", ps
, depth
, &r_u
->needed
))
185 if(!prs_uint32("returned", ps
, depth
, &r_u
->returned
))
188 if(!prs_pointer("resume", ps
, depth
, (void*)&r_u
->resume
, sizeof(uint32
), (PRS_POINTER_CAST
)prs_uint32
))
191 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
197 /*******************************************************************
198 ********************************************************************/
200 bool svcctl_io_q_query_service_config2(const char *desc
, SVCCTL_Q_QUERY_SERVICE_CONFIG2
*q_u
, prs_struct
*ps
, int depth
)
205 prs_debug(ps
, depth
, desc
, "svcctl_io_q_query_service_config2");
211 if(!smb_io_pol_hnd("service_pol", &q_u
->handle
, ps
, depth
))
214 if(!prs_uint32("level", ps
, depth
, &q_u
->level
))
217 if(!prs_uint32("buffer_size", ps
, depth
, &q_u
->buffer_size
))
224 /*******************************************************************
225 ********************************************************************/
227 void init_service_description_buffer(SERVICE_DESCRIPTION
*desc
, const char *service_desc
)
229 desc
->unknown
= 0x04; /* always 0x0000 0004 (no idea what this is) */
230 init_unistr( &desc
->description
, service_desc
);
233 /*******************************************************************
234 ********************************************************************/
236 bool svcctl_io_service_description( const char *desc
, SERVICE_DESCRIPTION
*description
, RPC_BUFFER
*buffer
, int depth
)
238 prs_struct
*ps
= &buffer
->prs
;
240 prs_debug(ps
, depth
, desc
, "svcctl_io_service_description");
243 if ( !prs_uint32("unknown", ps
, depth
, &description
->unknown
) )
245 if ( !prs_unistr("description", ps
, depth
, &description
->description
) )
251 /*******************************************************************
252 ********************************************************************/
254 uint32
svcctl_sizeof_service_description( SERVICE_DESCRIPTION
*desc
)
259 /* make sure to include the terminating NULL */
260 return ( sizeof(uint32
) + (2*(str_len_uni(&desc
->description
)+1)) );
263 /*******************************************************************
264 ********************************************************************/
266 static bool svcctl_io_action( const char *desc
, SC_ACTION
*action
, prs_struct
*ps
, int depth
)
269 prs_debug(ps
, depth
, desc
, "svcctl_io_action");
272 if ( !prs_uint32("type", ps
, depth
, &action
->type
) )
274 if ( !prs_uint32("delay", ps
, depth
, &action
->delay
) )
280 /*******************************************************************
281 ********************************************************************/
283 bool svcctl_io_service_fa( const char *desc
, SERVICE_FAILURE_ACTIONS
*fa
, RPC_BUFFER
*buffer
, int depth
)
285 prs_struct
*ps
= &buffer
->prs
;
288 prs_debug(ps
, depth
, desc
, "svcctl_io_service_description");
291 if ( !prs_uint32("reset_period", ps
, depth
, &fa
->reset_period
) )
294 if ( !prs_pointer( desc
, ps
, depth
, (void*)&fa
->rebootmsg
, sizeof(UNISTR2
), (PRS_POINTER_CAST
)prs_io_unistr2
) )
296 if ( !prs_pointer( desc
, ps
, depth
, (void*)&fa
->command
, sizeof(UNISTR2
), (PRS_POINTER_CAST
)prs_io_unistr2
) )
299 if ( !prs_uint32("num_actions", ps
, depth
, &fa
->num_actions
) )
302 if ( UNMARSHALLING(ps
)) {
303 if (fa
->num_actions
) {
304 if ( !(fa
->actions
= TALLOC_ARRAY( talloc_tos(), SC_ACTION
, fa
->num_actions
)) ) {
305 DEBUG(0,("svcctl_io_service_fa: talloc() failure!\n"));
313 for ( i
=0; i
<fa
->num_actions
; i
++ ) {
314 if ( !svcctl_io_action( "actions", &fa
->actions
[i
], ps
, depth
) )
321 /*******************************************************************
322 ********************************************************************/
324 uint32
svcctl_sizeof_service_fa( SERVICE_FAILURE_ACTIONS
*fa
)
331 size
= sizeof(uint32
) * 2;
332 size
+= sizeof_unistr2( fa
->rebootmsg
);
333 size
+= sizeof_unistr2( fa
->command
);
334 size
+= sizeof(SC_ACTION
) * fa
->num_actions
;
339 /*******************************************************************
340 ********************************************************************/
342 bool svcctl_io_r_query_service_config2(const char *desc
, SVCCTL_R_QUERY_SERVICE_CONFIG2
*r_u
, prs_struct
*ps
, int depth
)
347 prs_debug(ps
, depth
, desc
, "svcctl_io_r_query_service_config2");
350 if ( !prs_align(ps
) )
353 if (!prs_rpcbuffer("", ps
, depth
, &r_u
->buffer
))
358 if (!prs_uint32("needed", ps
, depth
, &r_u
->needed
))
361 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
368 /*******************************************************************
369 ********************************************************************/
371 bool svcctl_io_q_query_service_status_ex(const char *desc
, SVCCTL_Q_QUERY_SERVICE_STATUSEX
*q_u
, prs_struct
*ps
, int depth
)
376 prs_debug(ps
, depth
, desc
, "svcctl_io_q_query_service_status_ex");
382 if(!smb_io_pol_hnd("service_pol", &q_u
->handle
, ps
, depth
))
385 if(!prs_uint32("level", ps
, depth
, &q_u
->level
))
388 if(!prs_uint32("buffer_size", ps
, depth
, &q_u
->buffer_size
))
395 /*******************************************************************
396 ********************************************************************/
398 bool svcctl_io_r_query_service_status_ex(const char *desc
, SVCCTL_R_QUERY_SERVICE_STATUSEX
*r_u
, prs_struct
*ps
, int depth
)
403 prs_debug(ps
, depth
, desc
, "svcctl_io_r_query_service_status_ex");
406 if (!prs_rpcbuffer("", ps
, depth
, &r_u
->buffer
))
412 if(!prs_uint32("needed", ps
, depth
, &r_u
->needed
))
415 if(!prs_werror("status", ps
, depth
, &r_u
->status
))