summaryrefslogtreecommitdiff
path: root/examples/libmsrpc/test/svcctl
diff options
context:
space:
mode:
authorGerald Carter <jerry@samba.org>2005-09-03 16:55:45 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 11:03:30 -0500
commit3c6b0f965588aab0edbc4d115fb9e72c884ded3b (patch)
treece3740784555e729297955c924e4701feaf69d38 /examples/libmsrpc/test/svcctl
parenta44e97c99f61916db3f7cc02cd2581c8d64be73a (diff)
downloadsamba-3c6b0f965588aab0edbc4d115fb9e72c884ded3b.tar.gz
samba-3c6b0f965588aab0edbc4d115fb9e72c884ded3b.tar.bz2
samba-3c6b0f965588aab0edbc4d115fb9e72c884ded3b.zip
r10003: in the rush for 10k, I forgot to run add the rest of Chris' libmsrpc files
(This used to be commit 32bebc452dffa8348b94c5b866350b1fe761986f)
Diffstat (limited to 'examples/libmsrpc/test/svcctl')
-rw-r--r--examples/libmsrpc/test/svcctl/svc.c303
1 files changed, 303 insertions, 0 deletions
diff --git a/examples/libmsrpc/test/svcctl/svc.c b/examples/libmsrpc/test/svcctl/svc.c
new file mode 100644
index 0000000000..db5fa27895
--- /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;
+}
+