]> andersk Git - moira.git/blobdiff - server/mr_glue.c
Remove `delete_user_by_uid' since it's never been used in any logs we have,
[moira.git] / server / mr_glue.c
index a7b4d80a1c911888fe52ccd705ccf01e374011bf..6643a24c84b390c25d4b2932124409bc8259c0a9 100644 (file)
@@ -16,12 +16,12 @@ static char *rcsid_mr_glue_c = "$Header$";
 #endif lint
 
 #include <mit-copyright.h>
-#include "mr_server.h"
 #include <sys/types.h>
 #include <sys/signal.h>
 #include <sys/wait.h>
 #include <krb_et.h>
 #include <pwd.h>
+#include "mr_server.h"
 #include "query.h"
 
 static int already_connected = 0;
@@ -30,7 +30,7 @@ static int already_connected = 0;
 
 static client pseudo_client;
 extern int errno;
-extern char *malloc(), *whoami;
+extern char *whoami;
 extern time_t now;
 void reapchild();
 
@@ -39,18 +39,26 @@ char *server;
 {
     register int status;
     extern int query_timeout;
+    struct sigaction action;
 
     if (already_connected) return MR_ALREADY_CONNECTED;
 
     initialize_sms_error_table();
     initialize_krb_error_table();
-    bzero((char *)&pseudo_client, sizeof(pseudo_client)); /* XXX */
+    memset((char *)&pseudo_client, 0, sizeof(pseudo_client)); /* XXX */
 
     query_timeout = 0;
     status =  mr_open_database();
     if (!status) already_connected = 1;
 
-    signal(SIGCHLD, reapchild);
+    action.sa_flags = 0;
+    sigemptyset(&action.sa_mask);
+    sigaddset(&action.sa_mask, SIGCHLD);
+    action.sa_handler = reapchild;
+    if (sigaction(SIGCHLD, &action, NULL) < 0) {
+      com_err(whoami, errno, "Unable to establish signal handlers.");
+      exit(1);
+    }
     return status;
 }
 
@@ -92,9 +100,9 @@ char *prog;
     strcat(buf, pseudo_client.kname.realm);
     strcpy(pseudo_client.clname, buf);
     pseudo_client.users_id = 0;
-    name_to_id(pseudo_client.kname.name, "USER", &pseudo_client.users_id);
+    name_to_id(pseudo_client.kname.name, USERS_TABLE, &pseudo_client.users_id);
     pseudo_client.client_id = pseudo_client.users_id;
-    strcpy(pseudo_client.entity, prog);
+    strncpy(pseudo_client.entity, prog, 8);
     pseudo_client.args = (mr_params *) malloc(sizeof(mr_params));
     pseudo_client.args->mr_version_no = MR_VERSION_2;
     return 0;
@@ -129,8 +137,11 @@ int mr_query(name, argc, argv, callproc, callarg)
     time(&now);
     hints.proc = callproc;
     hints.hint = callarg;
-    return mr_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,
+                           (char *)&hints);
+
 }
 
 int mr_access(name, argc, argv)
@@ -139,7 +150,8 @@ int mr_access(name, argc, argv)
     char **argv;               /* Args */
 {
     time(&now);
-    return mr_check_access(&pseudo_client, name, argc, argv);
+    return mr_check_access(&pseudo_client, name, argc,
+                          mr_copy_args(argv, argc));
 }
 
 int mr_query_internal(argc, argv, callproc, callarg)
@@ -153,8 +165,10 @@ int mr_query_internal(argc, argv, callproc, callarg)
     time(&now);
     hints.proc = callproc;
     hints.hint = callarg;
-    return mr_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,
+                           (char *)&hints);
 }
 
 int mr_access_internal(argc, argv)
@@ -162,7 +176,8 @@ int mr_access_internal(argc, argv)
     char **argv;
 {
     time(&now);
-    return mr_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));
 }
 
 mr_shutdown(why)
@@ -209,12 +224,15 @@ trigger_dcm(dummy0, dummy1, cl)
 
 void reapchild()
 {
-    union wait status;
-    int pid;
+    int status, pid;
 
-    while ((pid = wait3(&status, WNOHANG, (struct rusage *)0)) > 0) {
-       if  (status.w_termsig != 0 || status.w_retcode != 0)
+    while ((pid = waitpid(-1, &status, WNOHANG)) > 0) {
+       if (pid == inc_pid) {
+           inc_running = 0;
+           next_incremental();
+       }
+       if  (WTERMSIG(status) != 0 || WEXITSTATUS(status) != 0)
          com_err(whoami, 0, "%d: child exits with signal %d status %d",
-                 pid, status.w_termsig, status.w_retcode);
+                 pid, WTERMSIG(status), WEXITSTATUS(status));
     }
 }
This page took 0.129297 seconds and 4 git commands to generate.