X-Git-Url: http://andersk.mit.edu/gitweb/moira.git/blobdiff_plain/40165bd0f997851cb0d236c306d0a0d34673cc72..e448f08dfc620178994c0fe53e135c874eb54f67:/server/mr_glue.c diff --git a/server/mr_glue.c b/server/mr_glue.c index aa851d31..8fd1505d 100644 --- a/server/mr_glue.c +++ b/server/mr_glue.c @@ -12,51 +12,57 @@ */ #ifndef lint -static char *rcsid_sms_glue_c = "$Header$"; +static char *rcsid_mr_glue_c = "$Header$"; #endif lint #include -#include "sms_server.h" +#include +#include +#include #include #include #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); + } +}