X-Git-Url: http://andersk.mit.edu/gitweb/moira.git/blobdiff_plain/9cad7c8fc2cb927d3a5b8eee101cb9f5ab457531..refs/heads/LOCKING:/server/mr_scall.c diff --git a/server/mr_scall.c b/server/mr_scall.c index 574ced8e..eecc2d0d 100644 --- a/server/mr_scall.c +++ b/server/mr_scall.c @@ -20,15 +20,19 @@ static char *rcsid_sms_scall_c = "$Header$"; #include #include #include "query.h" -#include "sms_server.h" +#include "mr_server.h" extern char buf1[]; extern int nclients; extern char *whoami; -extern char *malloc(); extern int errno; extern void clist_delete(), do_auth(), do_shutdown(); void do_call(); +extern int ingres_errno, mr_errcode; +static int row_count; + +/* Put this in a variable so that we can patch it if necessary */ +int max_row_count = 2048; /* * Welcome to the (finite state) machine (highest level). @@ -51,7 +55,7 @@ do_client(cp) * go down, then go down now. */ if ((dormant == AWAKE) && (nclients == 0) && - (stat(SMS_MOTD_FILE, &stbuf) == 0)) { + (stat(MOIRA_MOTD_FILE, &stbuf) == 0)) { com_err(whoami, 0, "motd file exists, slumbertime"); dormant = SLEEPY; } @@ -61,7 +65,7 @@ do_client(cp) case CL_ACCEPT: case CL_SEND: /* Start recieving next request */ - initialize_operation(cp->pending_op, sms_start_recv, + initialize_operation(cp->pending_op, mr_start_recv, (char *)&cp->args, (int (*)())NULL); queue_operation(cp->con, CON_INPUT, cp->pending_op); cp->action = CL_RECEIVE; @@ -69,9 +73,9 @@ do_client(cp) case CL_RECEIVE: /* Data is here. Process it & start it heading back */ do_call(cp); /* This may block for a while. */ - sms_destroy_reply(cp->args); + mr_destroy_reply(cp->args); cp->args = NULL; - initialize_operation(cp->pending_op, sms_start_send, + initialize_operation(cp->pending_op, mr_start_send, (char *)&cp->reply, (int (*)())NULL); queue_operation(cp->con, CON_OUTPUT, cp->pending_op); cp->action = CL_SEND; @@ -95,55 +99,59 @@ do_call(cl) client *cl; { int pn; - cl->reply.sms_argc = 0; - cl->reply.sms_status = 0; - cl->reply.sms_version_no = cl->args->sms_version_no; - if (((pn = cl->args->sms_procno) < 0) || - (pn > SMS_MAX_PROC)) { + extern int ingres_errno; + cl->reply.mr_argc = 0; + cl->reply.mr_status = 0; + cl->reply.mr_version_no = cl->args->mr_version_no; + if (((pn = cl->args->mr_procno) < 0) || + (pn > MR_MAX_PROC)) { com_err(whoami, 0, "procno out of range"); - cl->reply.sms_status = SMS_UNKNOWN_PROC; + cl->reply.mr_status = MR_UNKNOWN_PROC; return; } if (log_flags & LOG_ARGS) - log_args(procnames[pn], cl->args->sms_version_no, - cl->args->sms_argc, cl->args->sms_argv); + log_args(procnames[pn], cl->args->mr_version_no, + cl->args->mr_argc, cl->args->mr_argv); else if (log_flags & LOG_REQUESTS) com_err(whoami, 0, "%s", procnames[pn]); if ((dormant == ASLEEP || dormant == GROGGY) && - pn != SMS_NOOP && pn != SMS_MOTD) { - cl->reply.sms_status = SMS_DOWN; + pn != MR_NOOP && pn != MR_MOTD) { + cl->reply.mr_status = MR_DOWN; if (log_flags & LOG_RES) - com_err(whoami, SMS_DOWN, "(query refused)"); + com_err(whoami, MR_DOWN, "(query refused)"); return; } + /* make sure this gets cleared before every operation */ + ingres_errno = 0; + switch(pn) { - case SMS_NOOP: - cl->reply.sms_status = 0; + case MR_NOOP: + cl->reply.mr_status = 0; return; - case SMS_AUTH: + case MR_AUTH: do_auth(cl); return; - case SMS_QUERY: + case MR_QUERY: do_retr(cl); return; - case SMS_ACCESS: + case MR_ACCESS: do_access(cl); return; - case SMS_SHUTDOWN: + case MR_SHUTDOWN: do_shutdown(cl); return; - case SMS_DO_UPDATE: + case MR_DO_UPDATE: trigger_dcm(0, 0, cl); return; - case SMS_MOTD: + case MR_MOTD: get_motd(cl); return; } @@ -158,7 +166,7 @@ free_rtn_tuples(cp) temp = t1->next; if (t1 == cp->last) cp->last = NULL; - sms_destroy_reply(t1->retval); + mr_destroy_reply(t1->retval); delete_operation(t1->op); free(t1); } @@ -171,39 +179,48 @@ retr_callback(argc, argv, p_cp) char *p_cp; { register client *cp = (client *)p_cp; + mr_params *arg_tmp; + returned_tuples *tp; + OPERATION op_tmp; + register char **nargv; + register int i; + + if (row_count++ >= max_row_count) { + ingres_errno = mr_errcode = MR_NO_MEM; + return; + } + /* * This takes too much advantage of the fact that * serialization of the data happens during the queue operation. */ - sms_params *arg_tmp = (sms_params *)db_alloc(sizeof(sms_params)); - returned_tuples *tp = (returned_tuples *) - db_alloc(sizeof(returned_tuples)); - register char **nargv = (char **)malloc(argc * sizeof(char *)); - register int i; + arg_tmp = (mr_params *)db_alloc(sizeof(mr_params)); + tp = (returned_tuples *)db_alloc(sizeof(returned_tuples)); + nargv = (char **)malloc(argc * sizeof(char *)); - OPERATION op_tmp = create_operation(); + op_tmp = create_operation(); - if (sms_trim_args(argc, argv) == SMS_NO_MEM) { - com_err(whoami, SMS_NO_MEM, "while trimming args"); + if (mr_trim_args(argc, argv) == MR_NO_MEM) { + com_err(whoami, MR_NO_MEM, "while trimming args"); } if (log_flags & LOG_RESP) - log_args("return: ", cp->args->sms_version_no, argc, argv); + log_args("return: ", cp->args->mr_version_no, argc, argv); tp->op = op_tmp; tp->retval = arg_tmp; tp->next = NULL; - arg_tmp->sms_status = SMS_MORE_DATA; - arg_tmp->sms_version_no = cp->args->sms_version_no; - arg_tmp->sms_argc = argc; - arg_tmp->sms_argv = nargv; + arg_tmp->mr_status = MR_MORE_DATA; + arg_tmp->mr_version_no = cp->args->mr_version_no; + arg_tmp->mr_argc = argc; + arg_tmp->mr_argv = nargv; for (i = 0; i < argc; i++) { register int len = strlen(argv[i]) + 1; nargv[i] = malloc(len); bcopy(argv[i], nargv[i], len); } - arg_tmp->sms_flattened = (char *)NULL; - arg_tmp->sms_argl = (int *)NULL; + arg_tmp->mr_flattened = (char *)NULL; + arg_tmp->mr_argl = (int *)NULL; if (cp->last) { cp->last->next = tp; @@ -213,7 +230,7 @@ retr_callback(argc, argv, p_cp) } reset_operation(op_tmp); - initialize_operation(op_tmp, sms_start_send, (char *)arg_tmp, + initialize_operation(op_tmp, mr_start_send, (char *)arg_tmp, (int (*)())NULL); queue_operation(cp->con, CON_OUTPUT, op_tmp); } @@ -229,7 +246,6 @@ list_users(callbk, callarg) extern client **clients; extern char *inet_ntoa(); char *cp; - char *index(); char *ctime(); for (i = 0; i < nclients; i++) { @@ -256,27 +272,38 @@ do_retr(cl) { register char *queryname; - cl->reply.sms_argc = 0; - cl->reply.sms_status = 0; + cl->reply.mr_argc = 0; + cl->reply.mr_status = 0; + row_count = 0; - queryname = cl->args->sms_argv[0]; + if (cl->args->mr_argc < 1) { + cl->reply.mr_status = MR_ARGS; + com_err(whoami, MR_ARGS, "got nameless query"); + return; + } + queryname = cl->args->mr_argv[0]; - if (cl->args->sms_version_no == SMS_VERSION_2) + if (cl->args->mr_version_no == MR_VERSION_2) newqueries++; else oldqueries++; if (strcmp(queryname, "_list_users") == 0) - cl->reply.sms_status = list_users(retr_callback, (char *)cl); + cl->reply.mr_status = list_users(retr_callback, (char *)cl); else { - cl->reply.sms_status = - sms_process_query(cl, - cl->args->sms_argv[0], - cl->args->sms_argc-1, - cl->args->sms_argv+1, + cl->reply.mr_status = + mr_process_query(cl, + queryname, + cl->args->mr_argc-1, + cl->args->mr_argv+1, retr_callback, (char *)cl); } + if (row_count >= max_row_count) { + critical_alert("moirad", "attempted query %s with %d rows\n", + queryname, row_count); + } + if (log_flags & LOG_RES) com_err(whoami, 0, "Query complete."); } @@ -284,13 +311,18 @@ do_retr(cl) do_access(cl) client *cl; { - cl->reply.sms_argc = 0; + if (cl->args->mr_argc < 1) { + cl->reply.mr_status = MR_ARGS; + com_err(whoami, MR_ARGS, "got nameless access"); + return; + } + cl->reply.mr_argc = 0; - cl->reply.sms_status = - sms_check_access(cl, - cl->args->sms_argv[0], - cl->args->sms_argc-1, - cl->args->sms_argv+1); + cl->reply.mr_status = + mr_check_access(cl, + cl->args->mr_argv[0], + cl->args->mr_argc-1, + cl->args->mr_argv+1); com_err(whoami, 0, "Access check complete."); } @@ -310,22 +342,24 @@ trigger_dcm(dummy0, dummy1, cl) client *cl; { register int pid; - - cl->reply.sms_argc = 0; + char prog[128]; + + cl->reply.mr_argc = 0; - if (cl->reply.sms_status = check_query_access(&pseudo_query, 0, cl) ) - return(cl->reply.sms_status); + if (cl->reply.mr_status = check_query_access(&pseudo_query, 0, cl) ) + return(cl->reply.mr_status); + sprintf(prog, "%s/startdcm", BIN_DIR); pid = vfork(); switch (pid) { case 0: for (dummy0 = getdtablesize() - 1; dummy0 > 2; dummy0--) close(dummy0); - execl("/u1/sms/bin/startdcm", "startdcm", 0); + execl(prog, "startdcm", 0); exit(1); case -1: - cl->reply.sms_status = errno; + cl->reply.mr_status = errno; return(0); default: @@ -342,12 +376,13 @@ client *cl; char *arg[1]; arg[0] = buffer; - cl->reply.sms_status = 0; - motd = open(SMS_MOTD_FILE, 0, O_RDONLY); + cl->reply.mr_status = 0; + motd = open(MOIRA_MOTD_FILE, 0, O_RDONLY); if (motd < 0) return; len = read(motd, buffer, sizeof(buffer) - 1); close(motd); buffer[len] = 0; + row_count = 0; retr_callback(1, arg, cl); - cl->reply.sms_status = 0; + cl->reply.mr_status = 0; }