source: branches/samba-3.0/examples/libmsrpc/test/svcctl/svc.c

Last change on this file was 1, checked in by Paul Smedley, 18 years ago

Initial code import

File size: 8.3 KB
Line 
1/*Tests all of the svcctl calls (at least at time of writing)*/
2
3#include "libmsrpc.h"
4#include "test_util.h"
5
6int main(int argc, char **argv) {
7 CacServerHandle *hnd = NULL;
8 TALLOC_CTX *mem_ctx = NULL;
9
10
11 struct SvcOpenScm sos;
12 struct SvcEnumServices es;
13 struct SvcOpenService os;
14 struct SvcGetStatus gs;
15 struct SvcStartService start;
16 struct SvcStopService stop;
17 struct SvcPauseService pause;
18 struct SvcContinueService res;
19 struct SvcGetDisplayName gdn;
20 struct SvcGetServiceConfig sgc;
21
22 POLICY_HND *svc_hnd = NULL;
23
24 fstring tmp;
25 fstring input;
26
27 int i;
28
29 mem_ctx = talloc_init("cac_samgroup");
30
31 hnd = cac_NewServerHandle(True);
32
33 cac_SetAuthDataFn(hnd, cactest_GetAuthDataFn);
34
35 cac_parse_cmd_line(argc, argv, hnd);
36
37 if(!cac_Connect(hnd, NULL)) {
38 fprintf(stderr, "Could not connect to server %s. Error: %s\n", hnd->server, nt_errstr(hnd->status));
39 exit(-1);
40 }
41
42 /*open a handle to the scm*/
43 ZERO_STRUCT(sos);
44
45 sos.in.access = SC_MANAGER_ALL_ACCESS;
46
47 if(!cac_SvcOpenScm(hnd, mem_ctx, &sos)) {
48 fprintf(stderr, "Could not open SCM. Error: %s\n", nt_errstr(hnd->status));
49 goto done;
50 }
51
52 printf("Opened SCM\n");
53
54 tmp[0] = 0x00;
55 while(tmp[0] != 'q') {
56 printf("\n");
57 printf("[e] Enum Services\n");
58 printf("[o] Open Service\n");
59 printf("[x] Close Service\n");
60 printf("[g] Get service status\n");
61 printf("[s] Start service\n");
62 printf("[t] Stop service\n");
63 printf("[p] Pause service\n");
64 printf("[r] Resume service\n");
65 printf("[c] Get service config\n");
66
67 printf("[d] Get display name\n");
68
69 printf("[q]uit\n\n");
70 printf("Enter option: ");
71 cactest_readline(stdin, tmp);
72
73 printf("\n");
74
75 switch(tmp[0]) {
76 case 'e': /*enum services*/
77 ZERO_STRUCT(es);
78 es.in.scm_hnd = sos.out.scm_hnd;
79
80 if(!cac_SvcEnumServices(hnd, mem_ctx, &es)) {
81 printf("Could not enumerate services. Error: %s\n", nt_errstr(hnd->status));
82 break;
83 }
84
85 for(i = 0; i < es.out.num_services; i++) {
86 print_cac_service(es.out.services[i]);
87 }
88 printf("Enumerated %d services:\n", es.out.num_services);
89
90 break;
91
92 case 'o': /*Open service*/
93 ZERO_STRUCT(os);
94
95 printf("Enter service name: ");
96 cactest_readline(stdin, tmp);
97
98 os.in.name = talloc_strdup(mem_ctx, tmp);
99 os.in.scm_hnd = sos.out.scm_hnd;
100 os.in.access = SERVICE_ALL_ACCESS;
101
102 if(!cac_SvcOpenService(hnd, mem_ctx, &os)) {
103 printf("Could not open service. Error: %s\n", nt_errstr(hnd->status));
104 break;
105 }
106
107 printf("Opened service.\n");
108 svc_hnd = os.out.svc_hnd;
109
110 break;
111 case 'x': /*close service*/
112 if(!svc_hnd) {
113 printf("Must open service first!\n");
114 break;
115 }
116
117 cac_SvcClose(hnd, mem_ctx, svc_hnd);
118 svc_hnd = NULL;
119 break;
120 case 'g': /*get svc status*/
121
122 if(!svc_hnd) {
123 printf("Must open service first!\n");
124 break;
125 }
126
127 ZERO_STRUCT(gs);
128
129 gs.in.svc_hnd = svc_hnd;
130
131 if(!cac_SvcGetStatus(hnd, mem_ctx, &gs)) {
132 printf("Could not get status. Error: %s\n", nt_errstr(hnd->status));
133 break;
134 }
135
136 print_service_status(gs.out.status);
137 break;
138 case 's': /*start service*/
139 if(!svc_hnd) {
140 printf("Must open service first!\n");
141 break;
142 }
143
144 ZERO_STRUCT(start);
145
146 start.in.svc_hnd = svc_hnd;
147
148 printf("Enter number of parameters: ");
149 scanf("%d", &start.in.num_parms);
150
151 start.in.parms = talloc_array(mem_ctx, char *, start.in.num_parms);
152
153 for(i = 0; i < start.in.num_parms; i++) {
154 printf("Parm %d: ", i);
155 cactest_readline(stdin, tmp);
156 start.in.parms[i] = talloc_strdup(mem_ctx, tmp);
157 }
158
159 printf("Timeout (seconds): ");
160 scanf("%d", &start.in.timeout);
161
162 if(!cac_SvcStartService(hnd, mem_ctx, &start)) {
163 printf("Could not start service. Error: %s\n", nt_errstr(hnd->status));
164 }
165 else {
166 printf("Started service.\n");
167 }
168
169 break;
170 case 't': /*stop service*/
171 if(!svc_hnd) {
172 printf("Must open service first!\n");
173 break;
174 }
175
176 ZERO_STRUCT(stop);
177 stop.in.svc_hnd = svc_hnd;
178
179 printf("Timeout (seconds): ");
180 scanf("%d", &stop.in.timeout);
181
182 if(!cac_SvcStopService(hnd, mem_ctx, &stop)) {
183 if(CAC_OP_FAILED(hnd->status)) {
184 printf("Error occured: %s\n", nt_errstr(hnd->status));
185 }
186 else {
187 printf("Service was not stopped within %d seconds.\n", stop.in.timeout);
188 print_service_status(stop.out.status);
189 }
190 }
191 else {
192 printf("Done.\n");
193 print_service_status(stop.out.status);
194 }
195 break;
196 case 'd': /*get display name*/
197 if(!svc_hnd) {
198 printf("Must open service first!\n");
199 break;
200 }
201
202 ZERO_STRUCT(gdn);
203 gdn.in.svc_hnd = svc_hnd;
204
205 if(!cac_SvcGetDisplayName(hnd, mem_ctx, &gdn)) {
206 printf("Could not get display name. Error: %s\n", nt_errstr(hnd->status));
207 }
208 else {
209 printf("\tDisplay Name: %s\n", gdn.out.display_name);
210 }
211 break;
212
213 case 'p': /*pause service*/
214 if(!svc_hnd) {
215 printf("Must open service first!\n");
216 break;
217 }
218
219 ZERO_STRUCT(pause);
220 pause.in.svc_hnd = svc_hnd;
221
222 printf("Timeout (seconds): ");
223 scanf("%d", &pause.in.timeout);
224
225 if(!cac_SvcPauseService(hnd, mem_ctx, &pause)) {
226 if(CAC_OP_FAILED(hnd->status)) {
227 printf("Error occured: %s\n", nt_errstr(hnd->status));
228 }
229 else {
230 printf("Service was not paused within %d seconds.\n", pause.in.timeout);
231 print_service_status(pause.out.status);
232 }
233 }
234 else {
235 printf("Done.\n");
236 print_service_status(pause.out.status);
237 }
238
239 break;
240
241 case 'r': /*resume service*/
242 if(!svc_hnd) {
243 printf("Must open service first!\n");
244 break;
245 }
246
247 ZERO_STRUCT(res);
248 res.in.svc_hnd = svc_hnd;
249
250 printf("Timeout (seconds): ");
251 scanf("%d", &res.in.timeout);
252
253 if(!cac_SvcContinueService(hnd, mem_ctx, &res)) {
254 if(CAC_OP_FAILED(hnd->status)) {
255 printf("Error occured: %s\n", nt_errstr(hnd->status));
256 }
257 else {
258 printf("Service was not resumed within %d seconds.\n", res.in.timeout);
259 print_service_status(res.out.status);
260 }
261 }
262 else {
263 printf("Done.\n");
264 print_service_status(res.out.status);
265 }
266
267 break;
268
269 case 'c': /*get service config*/
270 if(!svc_hnd) {
271 printf("Must open service first!\n");
272 break;
273 }
274
275 ZERO_STRUCT(sgc);
276
277 sgc.in.svc_hnd = svc_hnd;
278
279 if(!cac_SvcGetServiceConfig(hnd, mem_ctx, &sgc)) {
280 printf("Could not get service config. Error: %s\n", nt_errstr(hnd->status));
281 }
282 else {
283 print_service_config(&sgc.out.config);
284 }
285 break;
286
287 case 'q': /*quit*/
288 break;
289 default:
290 printf("Invalid command\n");
291 }
292 }
293
294 cac_SvcClose(hnd, mem_ctx, sos.out.scm_hnd);
295
296 done:
297 cac_FreeHandle(hnd);
298
299 talloc_destroy(mem_ctx);
300
301 return 0;
302}
303
Note: See TracBrowser for help on using the repository browser.