]> andersk Git - moira.git/blobdiff - server/mr_scall.c
Don't create a user group with new accounts.
[moira.git] / server / mr_scall.c
index a3671b9770090aa8d88cddacdd9f2f268c3318bf..0301881259e8e251eaaae741cf38aa32e69365fd 100644 (file)
@@ -17,18 +17,25 @@ static char *rcsid_sms_scall_c = "$Header$";
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <sys/file.h>
+#include <fcntl.h>
+#include <string.h>
+#include <arpa/inet.h>
 #include <krb.h>
 #include <errno.h>
-#include "query.h"
 #include "mr_server.h"
+#include "query.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 dbms_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).
@@ -95,7 +102,6 @@ do_call(cl)
        client *cl;
 {
        int pn;
-       extern int ingres_errno;
        cl->reply.mr_argc = 0;
        cl->reply.mr_status = 0;
        cl->reply.mr_version_no = cl->args->mr_version_no;
@@ -120,7 +126,7 @@ do_call(cl)
        }
 
        /* make sure this gets cleared before every operation */
-       ingres_errno = 0;
+       dbms_errno = 0;
 
        switch(pn) {
        case MR_NOOP:
@@ -175,17 +181,26 @@ 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) {
+           dbms_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.
         */
-       mr_params *arg_tmp = (mr_params *)db_alloc(sizeof(mr_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 (mr_trim_args(argc, argv) == MR_NO_MEM) {
            com_err(whoami, MR_NO_MEM, "while trimming args");
@@ -204,7 +219,7 @@ retr_callback(argc, argv, p_cp)
        for (i = 0; i < argc; i++) {
                register int len = strlen(argv[i]) + 1;
                nargv[i] = malloc(len);
-               bcopy(argv[i], nargv[i], len);
+               memcpy(nargv[i], argv[i], len);
        }
        arg_tmp->mr_flattened = (char *)NULL;
        arg_tmp->mr_argl = (int *)NULL;
@@ -231,9 +246,7 @@ list_users(callbk, callarg)
        char buf1[30];
        int i;
        extern client **clients;
-       extern char *inet_ntoa();
        char *cp;
-       char *index();
        char *ctime();
 
        for (i = 0; i < nclients; i++) {
@@ -246,7 +259,7 @@ list_users(callbk, callarg)
                argv[2] = buf;
                sprintf(buf, "port %d", ntohs(cl->haddr.sin_port));
                argv[3] = ctime(&cl->last_time_used);
-               cp = index(argv[3], '\n');
+               cp = strchr(argv[3], '\n');
                if (cp) *cp = '\0';
                argv[4] = buf1;
                sprintf(buf1, "[#%d]", cl->id);
@@ -262,7 +275,13 @@ do_retr(cl)
 
        cl->reply.mr_argc = 0;
        cl->reply.mr_status = 0;
+       row_count = 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->mr_version_no == MR_VERSION_2)
@@ -275,12 +294,17 @@ do_retr(cl)
        else {
                cl->reply.mr_status = 
                        mr_process_query(cl,
-                                         cl->args->mr_argv[0],
+                                         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.");
 }
@@ -288,6 +312,11 @@ do_retr(cl)
 do_access(cl)
        client *cl;
 {
+       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.mr_status = 
@@ -325,8 +354,6 @@ trigger_dcm(dummy0, dummy1, cl)
        pid = vfork();
        switch (pid) {
        case 0:
-               for (dummy0 = getdtablesize() - 1; dummy0 > 2; dummy0--)
-                 close(dummy0);
                execl(prog, "startdcm", 0);
                exit(1);
                
@@ -354,6 +381,7 @@ client *cl;
     len = read(motd, buffer, sizeof(buffer) - 1);
     close(motd);
     buffer[len] = 0;
+    row_count = 0;
     retr_callback(1, arg, cl);
     cl->reply.mr_status = 0;
 }
This page took 0.037911 seconds and 4 git commands to generate.