X-Git-Url: https://vcs.maemo.org/git/?p=samba;a=blobdiff_plain;f=examples%2Flibmsrpc%2Ftest%2Fsvcctl%2Fsvc.c;fp=examples%2Flibmsrpc%2Ftest%2Fsvcctl%2Fsvc.c;h=db5fa27895395b8edd3fac5b0c8369890d68f347;hp=0000000000000000000000000000000000000000;hb=6bca4ca307d55b6dc888e56cee47aebcddbce786;hpb=7fd70fa738b636089bcc6c961aa3eaa02f20dda2 diff --git a/examples/libmsrpc/test/svcctl/svc.c b/examples/libmsrpc/test/svcctl/svc.c new file mode 100644 index 0000000..db5fa27 --- /dev/null +++ b/examples/libmsrpc/test/svcctl/svc.c @@ -0,0 +1,303 @@ +/*Tests all of the svcctl calls (at least at time of writing)*/ + +#include "libmsrpc.h" +#include "test_util.h" + +int main(int argc, char **argv) { + CacServerHandle *hnd = NULL; + TALLOC_CTX *mem_ctx = NULL; + + + struct SvcOpenScm sos; + struct SvcEnumServices es; + struct SvcOpenService os; + struct SvcGetStatus gs; + struct SvcStartService start; + struct SvcStopService stop; + struct SvcPauseService pause; + struct SvcContinueService res; + struct SvcGetDisplayName gdn; + struct SvcGetServiceConfig sgc; + + POLICY_HND *svc_hnd = NULL; + + fstring tmp; + fstring input; + + int i; + + mem_ctx = talloc_init("cac_samgroup"); + + hnd = cac_NewServerHandle(True); + + cac_SetAuthDataFn(hnd, cactest_GetAuthDataFn); + + cac_parse_cmd_line(argc, argv, hnd); + + if(!cac_Connect(hnd, NULL)) { + fprintf(stderr, "Could not connect to server %s. Error: %s\n", hnd->server, nt_errstr(hnd->status)); + exit(-1); + } + + /*open a handle to the scm*/ + ZERO_STRUCT(sos); + + sos.in.access = SC_MANAGER_ALL_ACCESS; + + if(!cac_SvcOpenScm(hnd, mem_ctx, &sos)) { + fprintf(stderr, "Could not open SCM. Error: %s\n", nt_errstr(hnd->status)); + goto done; + } + + printf("Opened SCM\n"); + + tmp[0] = 0x00; + while(tmp[0] != 'q') { + printf("\n"); + printf("[e] Enum Services\n"); + printf("[o] Open Service\n"); + printf("[x] Close Service\n"); + printf("[g] Get service status\n"); + printf("[s] Start service\n"); + printf("[t] Stop service\n"); + printf("[p] Pause service\n"); + printf("[r] Resume service\n"); + printf("[c] Get service config\n"); + + printf("[d] Get display name\n"); + + printf("[q]uit\n\n"); + printf("Enter option: "); + cactest_readline(stdin, tmp); + + printf("\n"); + + switch(tmp[0]) { + case 'e': /*enum services*/ + ZERO_STRUCT(es); + es.in.scm_hnd = sos.out.scm_hnd; + + if(!cac_SvcEnumServices(hnd, mem_ctx, &es)) { + printf("Could not enumerate services. Error: %s\n", nt_errstr(hnd->status)); + break; + } + + for(i = 0; i < es.out.num_services; i++) { + print_cac_service(es.out.services[i]); + } + printf("Enumerated %d services:\n", es.out.num_services); + + break; + + case 'o': /*Open service*/ + ZERO_STRUCT(os); + + printf("Enter service name: "); + cactest_readline(stdin, tmp); + + os.in.name = talloc_strdup(mem_ctx, tmp); + os.in.scm_hnd = sos.out.scm_hnd; + os.in.access = SERVICE_ALL_ACCESS; + + if(!cac_SvcOpenService(hnd, mem_ctx, &os)) { + printf("Could not open service. Error: %s\n", nt_errstr(hnd->status)); + break; + } + + printf("Opened service.\n"); + svc_hnd = os.out.svc_hnd; + + break; + case 'x': /*close service*/ + if(!svc_hnd) { + printf("Must open service first!\n"); + break; + } + + cac_SvcClose(hnd, mem_ctx, svc_hnd); + svc_hnd = NULL; + break; + case 'g': /*get svc status*/ + + if(!svc_hnd) { + printf("Must open service first!\n"); + break; + } + + ZERO_STRUCT(gs); + + gs.in.svc_hnd = svc_hnd; + + if(!cac_SvcGetStatus(hnd, mem_ctx, &gs)) { + printf("Could not get status. Error: %s\n", nt_errstr(hnd->status)); + break; + } + + print_service_status(gs.out.status); + break; + case 's': /*start service*/ + if(!svc_hnd) { + printf("Must open service first!\n"); + break; + } + + ZERO_STRUCT(start); + + start.in.svc_hnd = svc_hnd; + + printf("Enter number of parameters: "); + scanf("%d", &start.in.num_parms); + + start.in.parms = talloc_array(mem_ctx, char *, start.in.num_parms); + + for(i = 0; i < start.in.num_parms; i++) { + printf("Parm %d: ", i); + cactest_readline(stdin, tmp); + start.in.parms[i] = talloc_strdup(mem_ctx, tmp); + } + + printf("Timeout (seconds): "); + scanf("%d", &start.in.timeout); + + if(!cac_SvcStartService(hnd, mem_ctx, &start)) { + printf("Could not start service. Error: %s\n", nt_errstr(hnd->status)); + } + else { + printf("Started service.\n"); + } + + break; + case 't': /*stop service*/ + if(!svc_hnd) { + printf("Must open service first!\n"); + break; + } + + ZERO_STRUCT(stop); + stop.in.svc_hnd = svc_hnd; + + printf("Timeout (seconds): "); + scanf("%d", &stop.in.timeout); + + if(!cac_SvcStopService(hnd, mem_ctx, &stop)) { + if(CAC_OP_FAILED(hnd->status)) { + printf("Error occured: %s\n", nt_errstr(hnd->status)); + } + else { + printf("Service was not stopped within %d seconds.\n", stop.in.timeout); + print_service_status(stop.out.status); + } + } + else { + printf("Done.\n"); + print_service_status(stop.out.status); + } + break; + case 'd': /*get display name*/ + if(!svc_hnd) { + printf("Must open service first!\n"); + break; + } + + ZERO_STRUCT(gdn); + gdn.in.svc_hnd = svc_hnd; + + if(!cac_SvcGetDisplayName(hnd, mem_ctx, &gdn)) { + printf("Could not get display name. Error: %s\n", nt_errstr(hnd->status)); + } + else { + printf("\tDisplay Name: %s\n", gdn.out.display_name); + } + break; + + case 'p': /*pause service*/ + if(!svc_hnd) { + printf("Must open service first!\n"); + break; + } + + ZERO_STRUCT(pause); + pause.in.svc_hnd = svc_hnd; + + printf("Timeout (seconds): "); + scanf("%d", &pause.in.timeout); + + if(!cac_SvcPauseService(hnd, mem_ctx, &pause)) { + if(CAC_OP_FAILED(hnd->status)) { + printf("Error occured: %s\n", nt_errstr(hnd->status)); + } + else { + printf("Service was not paused within %d seconds.\n", pause.in.timeout); + print_service_status(pause.out.status); + } + } + else { + printf("Done.\n"); + print_service_status(pause.out.status); + } + + break; + + case 'r': /*resume service*/ + if(!svc_hnd) { + printf("Must open service first!\n"); + break; + } + + ZERO_STRUCT(res); + res.in.svc_hnd = svc_hnd; + + printf("Timeout (seconds): "); + scanf("%d", &res.in.timeout); + + if(!cac_SvcContinueService(hnd, mem_ctx, &res)) { + if(CAC_OP_FAILED(hnd->status)) { + printf("Error occured: %s\n", nt_errstr(hnd->status)); + } + else { + printf("Service was not resumed within %d seconds.\n", res.in.timeout); + print_service_status(res.out.status); + } + } + else { + printf("Done.\n"); + print_service_status(res.out.status); + } + + break; + + case 'c': /*get service config*/ + if(!svc_hnd) { + printf("Must open service first!\n"); + break; + } + + ZERO_STRUCT(sgc); + + sgc.in.svc_hnd = svc_hnd; + + if(!cac_SvcGetServiceConfig(hnd, mem_ctx, &sgc)) { + printf("Could not get service config. Error: %s\n", nt_errstr(hnd->status)); + } + else { + print_service_config(&sgc.out.config); + } + break; + + case 'q': /*quit*/ + break; + default: + printf("Invalid command\n"); + } + } + + cac_SvcClose(hnd, mem_ctx, sos.out.scm_hnd); + + done: + cac_FreeHandle(hnd); + + talloc_destroy(mem_ctx); + + return 0; +} +