Fixed bug in inetd code. The server listened on tcp:@:9999 even
[yaz-moved-to-github.git] / server / requestq.c
1 /*
2  * Copyright (C) 1994, Index Data.
3  * See the file LICENSE for details.
4  * Sebastian Hammer, Adam Dickmeiss
5  *
6  * $Log: requestq.c,v $
7  * Revision 1.4  1997-10-27 13:55:03  adam
8  * Fixed memory leak: member response wasn't freed when queue
9  * was destroyed.
10  *
11  * Revision 1.3  1997/09/01 08:53:00  adam
12  * New windows NT/95 port using MSV5.0. The test server 'ztest' was
13  * moved a separate directory. MSV5.0 project server.dsp created.
14  * As an option, the server can now operate as an NT service.
15  *
16  * Revision 1.2  1995/11/01 13:54:57  quinn
17  * Minor adjustments
18  *
19  * Revision 1.1  1995/05/15  12:12:22  quinn
20  * Request queue.
21  *
22  *
23  */
24
25 /*
26  * Simple queue management.
27  *
28  * We also use the request-freelist to store encoding buffers, rather than
29  * freeing and xmalloc'ing them on each cycle.
30  */
31
32 #include <stdlib.h>
33
34 #include <xmalloc.h>
35 #include "session.h"
36
37 void request_enq(request_q *q, request *r)
38 {
39     if (q->tail)
40         q->tail->next = r;
41     else
42         q->head = r;
43     q->tail = r;
44     q->num++;
45 }
46
47 request *request_head(request_q *q)
48 {
49     return q->head;
50 }
51
52 request *request_deq(request_q *q)
53 {
54     request *r = q->head;
55
56     if (!r)
57         return 0;
58     q->head = q->head->next;
59     if (!q->head)
60         q->tail = 0;
61     q->num--;
62     return r;
63 }
64
65 void request_initq(request_q *q)
66 {
67     q->head = q->tail = q->list = 0;
68     q->num = 0;
69 }
70
71 void request_delq(request_q *q)
72 {
73     request *r1, *r = q->list;
74     while (r)
75     {
76         xfree (r->response);
77         r1 = r;
78         r = r->next;
79         xfree (r1);
80     }
81 }
82
83 request *request_get(request_q *q)
84 {
85     request *r = q->list;
86
87     if (r)
88         q->list = r->next;
89     else
90     {
91         if (!(r = xmalloc(sizeof(*r))))
92             abort();
93         r->response = 0;
94         r->size_response = 0;
95     }
96     r->q = q;
97     r->len_refid = 0;
98     r->request = 0;
99     r->request_mem = 0;
100     r->len_response = 0;
101     r->state = REQUEST_IDLE;
102     r->next = 0;
103     return r;
104 }
105
106 void request_release(request *r)
107 {
108     request_q *q = r->q;
109     r->next = q->list;
110     q->list = r;
111 }