Initial import
[samba] / examples / libmsrpc / test / svcctl / svc.c
diff --git a/examples/libmsrpc/test/svcctl/svc.c b/examples/libmsrpc/test/svcctl/svc.c
new file mode 100644 (file)
index 0000000..db5fa27
--- /dev/null
@@ -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;
+}
+