#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;
static client pseudo_client;
extern int errno;
-extern char *malloc(), *whoami;
+extern char *whoami;
extern time_t now;
void reapchild();
{
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;
}
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;
hints.proc = callproc;
hints.hint = callarg;
next_incremental();
- return mr_process_query(&pseudo_client, name, argc, argv,
- callback, &hints);
+ return mr_process_query(&pseudo_client, name, argc,
+ mr_copy_args(argv, argc), callback,
+ (char *)&hints);
}
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)
hints.proc = callproc;
hints.hint = callarg;
next_incremental();
- return mr_process_query(&pseudo_client, argv[0], argc-1, argv+1,
- callback, &hints);
+ 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)
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)
void reapchild()
{
- union wait status;
- int pid;
+ int status, pid;
- while ((pid = wait3(&status, WNOHANG, (struct rusage *)0)) > 0) {
+ while ((pid = waitpid(-1, &status, WNOHANG)) > 0) {
if (pid == inc_pid) {
inc_running = 0;
next_incremental();
}
- if (status.w_termsig != 0 || status.w_retcode != 0)
+ 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));
}
}