• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/router/samba-3.5.8/source3/services/
1/*
2 *  Unix SMB/CIFS implementation.
3 *  Service Control API Implementation
4 *  Copyright (C) Gerald Carter                   2005.
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 3 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, see <http://www.gnu.org/licenses/>.
18 */
19
20#include "includes.h"
21
22/*********************************************************************
23*********************************************************************/
24
25static WERROR rcinit_stop( const char *service, struct SERVICE_STATUS *status )
26{
27	char *command = NULL;
28	int ret, fd;
29
30	if (asprintf(&command, "%s/%s/%s stop",
31				get_dyn_MODULESDIR(), SVCCTL_SCRIPT_DIR, service) < 0) {
32		return WERR_NOMEM;
33	}
34
35	/* we've already performed the access check when the service was opened */
36
37	become_root();
38	ret = smbrun( command , &fd );
39	unbecome_root();
40
41	DEBUGADD(5, ("rcinit_start: [%s] returned [%d]\n", command, ret));
42	close(fd);
43
44	SAFE_FREE(command);
45
46	ZERO_STRUCTP( status );
47
48	status->type			= SERVICE_TYPE_WIN32_SHARE_PROCESS;
49	status->state			= (ret == 0 ) ? SVCCTL_STOPPED : SVCCTL_RUNNING;
50	status->controls_accepted	= SVCCTL_ACCEPT_STOP |
51					  SVCCTL_ACCEPT_SHUTDOWN;
52
53	return ( ret == 0 ) ? WERR_OK : WERR_ACCESS_DENIED;
54}
55
56/*********************************************************************
57*********************************************************************/
58
59static WERROR rcinit_start( const char *service )
60{
61	char *command = NULL;
62	int ret, fd;
63
64	if (asprintf(&command, "%s/%s/%s start",
65				get_dyn_MODULESDIR(), SVCCTL_SCRIPT_DIR, service) < 0) {
66		return WERR_NOMEM;
67	}
68
69	/* we've already performed the access check when the service was opened */
70
71	become_root();
72	ret = smbrun( command , &fd );
73	unbecome_root();
74
75	DEBUGADD(5, ("rcinit_start: [%s] returned [%d]\n", command, ret));
76	close(fd);
77
78	SAFE_FREE(command);
79
80	return ( ret == 0 ) ? WERR_OK : WERR_ACCESS_DENIED;
81}
82
83/*********************************************************************
84*********************************************************************/
85
86static WERROR rcinit_status( const char *service, struct SERVICE_STATUS *status )
87{
88	char *command = NULL;
89	int ret, fd;
90
91	if (asprintf(&command, "%s/%s/%s status",
92				get_dyn_MODULESDIR(), SVCCTL_SCRIPT_DIR, service) < 0) {
93		return WERR_NOMEM;
94	}
95
96	/* we've already performed the access check when the service was opened */
97	/* assume as return code of 0 means that the service is ok.  Anything else
98	   is STOPPED */
99
100	become_root();
101	ret = smbrun( command , &fd );
102	unbecome_root();
103
104	DEBUGADD(5, ("rcinit_start: [%s] returned [%d]\n", command, ret));
105	close(fd);
106
107	SAFE_FREE(command);
108
109	ZERO_STRUCTP( status );
110
111	status->type			= SERVICE_TYPE_WIN32_SHARE_PROCESS;
112	status->state			= (ret == 0 ) ? SVCCTL_RUNNING : SVCCTL_STOPPED;
113	status->controls_accepted	= SVCCTL_ACCEPT_STOP |
114					  SVCCTL_ACCEPT_SHUTDOWN;
115
116	return WERR_OK;
117}
118
119/*********************************************************************
120*********************************************************************/
121
122/* struct for svcctl control to manipulate rcinit service */
123
124SERVICE_CONTROL_OPS rcinit_svc_ops = {
125	rcinit_stop,
126	rcinit_start,
127	rcinit_status
128};
129