]> andersk Git - moira.git/blobdiff - server/mr_glue.c
Added support for optional debugging malloc. No code changes if you are
[moira.git] / server / mr_glue.c
index aa851d3163c05f49cc9f74ea2f419a9fabf65a50..8fd1505d99f7201f21ce9a3f235ea3e4c4154c43 100644 (file)
  */
 
 #ifndef lint
-static char *rcsid_sms_glue_c = "$Header$";
+static char *rcsid_mr_glue_c = "$Header$";
 #endif lint
 
 #include <mit-copyright.h>
-#include "sms_server.h"
+#include <sys/types.h>
+#include <sys/signal.h>
+#include <sys/wait.h>
 #include <krb_et.h>
 #include <pwd.h>
 #include "query.h"
+#include "mr_server.h"
 
 static int already_connected = 0;
 
-#define CHECK_CONNECTED { if (!already_connected) return SMS_NOT_CONNECTED; }
+#define CHECK_CONNECTED { if (!already_connected) return MR_NOT_CONNECTED; }
 
 static client pseudo_client;
 extern int errno;
-extern char *malloc(), *whoami;
+extern char *whoami;
 extern time_t now;
+void reapchild();
 
-sms_connect(server)
+mr_connect(server)
 char *server;
 {
     register int status;
     extern int query_timeout;
 
-    if (already_connected) return SMS_ALREADY_CONNECTED;
+    if (already_connected) return MR_ALREADY_CONNECTED;
 
     initialize_sms_error_table();
     initialize_krb_error_table();
     bzero((char *)&pseudo_client, sizeof(pseudo_client)); /* XXX */
 
     query_timeout = 0;
-    status =  sms_open_database();
+    status =  mr_open_database();
     if (!status) already_connected = 1;
+
+    signal(SIGCHLD, reapchild);
     return status;
 }
 
-sms_disconnect()
+mr_disconnect()
 {
     CHECK_CONNECTED;
-    sms_close_database();
+    mr_close_database();
     already_connected = 0;
     return 0;
 }
 
-sms_noop()
+mr_noop()
 {
     CHECK_CONNECTED;
     return 0;
@@ -64,7 +70,7 @@ sms_noop()
 /*
  * This routine is rather bogus, as it only fills in who you claim to be.
  */
-sms_auth(prog)
+mr_auth(prog)
 char *prog;
 {
     struct passwd *pw;
@@ -78,18 +84,19 @@ char *prog;
                                                    * error code table)
                                                    */
     strcpy(pseudo_client.kname.name, pw->pw_name);
-    get_krbrlm(pseudo_client.kname.realm, 1);
+    krb_get_lrealm(pseudo_client.kname.realm, 1);
     krb_realm = pseudo_client.kname.realm;
 
     strcpy(buf, pw->pw_name);
     strcat(buf, "@");
     strcat(buf, pseudo_client.kname.realm);
-    pseudo_client.clname = malloc(strlen(buf)+1);
     strcpy(pseudo_client.clname, buf);
-    pseudo_client.users_id = get_users_id(pseudo_client.kname.name);
-    pseudo_client.entity = strsave(prog);
-    pseudo_client.args = (sms_params *) malloc(sizeof(sms_params));
-    pseudo_client.args->sms_version_no = SMS_VERSION_2;
+    pseudo_client.users_id = 0;
+    name_to_id(pseudo_client.kname.name, "USER", &pseudo_client.users_id);
+    pseudo_client.client_id = pseudo_client.users_id;
+    strcpy(pseudo_client.entity, prog);
+    pseudo_client.args = (mr_params *) malloc(sizeof(mr_params));
+    pseudo_client.args->mr_version_no = MR_VERSION_2;
     return 0;
 }
 
@@ -103,14 +110,14 @@ int argc;
 char **argv;
 struct hint *arg;
 {
-    if (sms_trim_args(argc, argv) == SMS_NO_MEM) {
-       com_err(whoami, SMS_NO_MEM, "while trimmming args");
+    if (mr_trim_args(argc, argv) == MR_NO_MEM) {
+       com_err(whoami, MR_NO_MEM, "while trimmming args");
     }
     (*arg->proc)(argc, argv, arg->hint);
 }
 
 
-int sms_query(name, argc, argv, callproc, callarg)
+int mr_query(name, argc, argv, callproc, callarg)
     char *name;                /* Query name */
     int argc;          /* Arg count */
     char **argv;               /* Args */
@@ -122,20 +129,23 @@ int sms_query(name, argc, argv, callproc, callarg)
     time(&now);
     hints.proc = callproc;
     hints.hint = callarg;
-    return sms_process_query(&pseudo_client, name, argc, argv,
-                            callback, &hints);
+    next_incremental();
+    return mr_process_query(&pseudo_client, name, argc,
+                           mr_copy_args(argv, argc), callback, &hints);
+
 }
 
-int sms_access(name, argc, argv)
+int mr_access(name, argc, argv)
     char *name;                        /* Query name */
     int argc;                  /* Arg count */
     char **argv;               /* Args */
 {
     time(&now);
-    return sms_check_access(&pseudo_client, name, argc, argv);
+    return mr_check_access(&pseudo_client, name, argc,
+                          mr_copy_args(argv, argc));
 }
 
-int sms_query_internal(argc, argv, callproc, callarg)
+int mr_query_internal(argc, argv, callproc, callarg)
     int argc;
     char **argv;
     int (*callproc)();
@@ -146,19 +156,21 @@ int sms_query_internal(argc, argv, callproc, callarg)
     time(&now);
     hints.proc = callproc;
     hints.hint = callarg;
-    return sms_process_query(&pseudo_client, argv[0], argc-1, argv+1,
-                            callback, &hints);
+    next_incremental();
+    return mr_process_query(&pseudo_client, argv[0], argc-1,
+                           mr_copy_args(argv+1, argc-1), callback, &hints);
 }
 
-int sms_access_internal(argc, argv)
+int mr_access_internal(argc, argv)
     int argc;
     char **argv;
 {
     time(&now);
-    return sms_check_access(&pseudo_client, argv[0], argc-1, argv+1);
+    return mr_check_access(&pseudo_client, argv[0], argc-1,
+                          mr_copy_args(argv+1, argc-1));
 }
 
-sms_shutdown(why)
+mr_shutdown(why)
     char *why;
 {
     fprintf(stderr, "Sorry, not implemented\n");
@@ -179,20 +191,39 @@ trigger_dcm(dummy0, dummy1, cl)
        client *cl;
 {
        register int pid, status;
+       char prog[128];
        
        if (status = check_query_access(&pseudo_query, 0, cl))
            return(status);
 
+       sprintf(prog, "%s/startdcm", BIN_DIR);
        pid = vfork();
        switch (pid) {
        case 0:
-               execl("/u1/sms/bin/startdcm", "startdcm", 0);
+               execl(prog, "startdcm", 0);
                exit(1);
                
        case -1:
                return(errno);
 
        default:
-               return(SMS_SUCCESS);
+               return(MR_SUCCESS);
        }
 }
+
+
+void reapchild()
+{
+    union wait status;
+    int pid;
+
+    while ((pid = wait3(&status, WNOHANG, (struct rusage *)0)) > 0) {
+       if (pid == inc_pid) {
+           inc_running = 0;
+           next_incremental();
+       }
+       if  (status.w_termsig != 0 || status.w_retcode != 0)
+         com_err(whoami, 0, "%d: child exits with signal %d status %d",
+                 pid, status.w_termsig, status.w_retcode);
+    }
+}
This page took 0.040379 seconds and 4 git commands to generate.