]> andersk Git - moira.git/blobdiff - server/qsubs.c
First cut of mailman support.
[moira.git] / server / qsubs.c
index 36dfe049ed9eca165ee55239039d515788f6da69..122f9eb0237732d460dab85eb561eeaf86e9242d 100644 (file)
 
 RCSID("$Header$");
 
-extern struct query Queries2[];
-extern int QueryCount2;
+extern struct query Queries[];
+extern int QueryCount;
 
 int qcmp(const void *q1, const void *q2);
 
-struct query *get_query_by_name(char *name)
+struct query *get_query_by_name(char *name, int version)
 {
-  struct query *q;
   int i;
 
-  q = Queries2;
-  i = QueryCount2;
+  i = QueryCount;
 
   if (strlen(name) == 4)
     {
       while (--i >= 0)
        {
-         if (!strcmp(q->shortname, name))
-           return q;
-         q++;
+         if (!strcmp(Queries[i].shortname, name) &&
+             Queries[i].version <= version)
+           return &Queries[i];
        }
     }
   else
     {
       while (--i >= 0)
        {
-         if (!strcmp(q->name, name))
-           return q;
-         q++;
+         if (!strcmp(Queries[i].name, name) &&
+             Queries[i].version <= version)
+           return &Queries[i];
        }
     }
 
   return NULL;
 }
 
-void list_queries(int (*action)(int, char *[], void *), void *actarg)
+void list_queries(client *cl, int (*action)(int, char *[], void *),
+                 void *actarg)
 {
-  struct query *q;
-  int i;
-  static struct query **squeries2 = NULL;
-  struct query **sq;
+  struct query **squeries = NULL;
+  int qcount;
+  struct query *q, **sq;
   char qnames[80];
   char *qnp;
-  int count;
+  int i;
 
-  count = QueryCount2;
-  if (!squeries2)
+  squeries = sq = xmalloc(QueryCount * sizeof(struct query *));
+  q = Queries;
+  for (i = 0; i < QueryCount; i++)
     {
-      sq = xmalloc(count * sizeof(struct query *));
-      squeries2 = sq;
-      q = Queries2;
-      for (i = count; --i >= 0; )
-       *sq++ = q++;
-      qsort(squeries2, count, sizeof(struct query *), qcmp);
+      if (q->version > cl->version)
+       {
+         q++;
+         continue;
+       }
+      if (i > 0 && strcmp((*sq)->name, q->name))
+       sq++;
+      *sq = q++;
     }
-  sq = squeries2;
+  qcount = (sq - squeries) + 1;
+  qsort(squeries, qcount, sizeof(struct query *), qcmp);
+
+  sq = squeries;
 
   qnp = qnames;
-  for (i = count; --i >= 0; sq++)
+  for (i = qcount; --i >= 0; sq++)
     {
       sprintf(qnames, "%s (%s)", (*sq)->name, (*sq)->shortname);
       (*action)(1, &qnp, actarg);
@@ -82,6 +86,8 @@ void list_queries(int (*action)(int, char *[], void *), void *actarg)
   (*action)(1, &qnp, actarg);
   strcpy(qnames, "_list_users");
   (*action)(1, &qnp, actarg);
+
+  free(squeries);
 }
 
 void help_query(struct query *q, int (*action)(int, char *[], void *),
This page took 0.037214 seconds and 4 git commands to generate.