source: bin/varnishtest/vtc_client.c @ 8aa1d8

Revision 8aa1d8, 5.7 KB checked in by Poul-Henning Kamp <phk@…>, 3 years ago (diff)

Eliminate nested <*.h> includes from include/*

Sort #includes according to rules which are for me to know and you
to guess.

  • Property mode set to 100644
Line 
1/*-
2 * Copyright (c) 2008-2011 Varnish Software AS
3 * All rights reserved.
4 *
5 * Author: Poul-Henning Kamp <phk@phk.freebsd.dk>
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 */
28
29#include "config.h"
30
31#include <sys/types.h>
32#include <sys/socket.h>
33
34#include <stdio.h>
35#include <stdlib.h>
36#include <string.h>
37
38#include "vtc.h"
39
40#include "vss.h"
41#include "vtcp.h"
42
43struct client {
44        unsigned                magic;
45#define CLIENT_MAGIC            0x6242397c
46        char                    *name;
47        struct vtclog           *vl;
48        VTAILQ_ENTRY(client)    list;
49
50        char                    *spec;
51
52        char                    connect[256];
53
54        unsigned                repeat;
55
56        pthread_t               tp;
57        unsigned                running;
58};
59
60static VTAILQ_HEAD(, client)    clients =
61    VTAILQ_HEAD_INITIALIZER(clients);
62
63/**********************************************************************
64 * Server thread
65 */
66
67static void *
68client_thread(void *priv)
69{
70        struct client *c;
71        struct vtclog *vl;
72        int fd;
73        unsigned u;
74        struct vsb *vsb;
75        char *p;
76        char mabuf[32], mpbuf[32];
77
78        CAST_OBJ_NOTNULL(c, priv, CLIENT_MAGIC);
79        AN(*c->connect);
80
81        vl = vtc_logopen(c->name);
82
83        p = strdup(c->connect);
84        AN(p);
85        vsb = macro_expand(vl, p);
86        AN(vsb);
87
88        if (c->repeat == 0)
89                c->repeat = 1;
90        if (c->repeat != 1)
91                vtc_log(vl, 2, "Started (%u iterations)", c->repeat);
92        for (u = 0; u < c->repeat; u++) {
93                vtc_log(vl, 3, "Connect to %s", VSB_data(vsb));
94                fd = VSS_open(VSB_data(vsb), 10.);
95                if (fd < 0)
96                        vtc_log(c->vl, 0, "Failed to open %s", VSB_data(vsb));
97                assert(fd >= 0);
98                VTCP_blocking(fd);
99                VTCP_myname(fd, mabuf, sizeof mabuf, mpbuf, sizeof mpbuf);
100                vtc_log(vl, 3, "connected fd %d from %s %s to %s",
101                    fd, mabuf, mpbuf, VSB_data(vsb));
102                fd = http_process(vl, c->spec, fd, NULL);
103                vtc_log(vl, 3, "closing fd %d", fd);
104                VTCP_close(&fd);
105        }
106        vtc_log(vl, 2, "Ending");
107        VSB_delete(vsb);
108        free(p);
109        return (NULL);
110}
111
112/**********************************************************************
113 * Allocate and initialize a client
114 */
115
116static struct client *
117client_new(const char *name)
118{
119        struct client *c;
120
121        AN(name);
122        ALLOC_OBJ(c, CLIENT_MAGIC);
123        AN(c);
124        REPLACE(c->name, name);
125        c->vl = vtc_logopen(name);
126        AN(c->vl);
127        if (*c->name != 'c')
128                vtc_log(c->vl, 0, "Client name must start with 'c'");
129
130        bprintf(c->connect, "%s", "${v1_sock}");
131        VTAILQ_INSERT_TAIL(&clients, c, list);
132        return (c);
133}
134
135/**********************************************************************
136 * Clean up client
137 */
138
139static void
140client_delete(struct client *c)
141{
142
143        CHECK_OBJ_NOTNULL(c, CLIENT_MAGIC);
144        vtc_logclose(c->vl);
145        free(c->spec);
146        free(c->name);
147        /* XXX: MEMLEAK (?)*/
148        FREE_OBJ(c);
149}
150
151/**********************************************************************
152 * Start the client thread
153 */
154
155static void
156client_start(struct client *c)
157{
158
159        CHECK_OBJ_NOTNULL(c, CLIENT_MAGIC);
160        vtc_log(c->vl, 2, "Starting client");
161        AZ(pthread_create(&c->tp, NULL, client_thread, c));
162        c->running = 1;
163}
164
165/**********************************************************************
166 * Wait for client thread to stop
167 */
168
169static void
170client_wait(struct client *c)
171{
172        void *res;
173
174        CHECK_OBJ_NOTNULL(c, CLIENT_MAGIC);
175        vtc_log(c->vl, 2, "Waiting for client");
176        AZ(pthread_join(c->tp, &res));
177        if (res != NULL)
178                vtc_log(c->vl, 0, "Client returned \"%s\"", (char *)res);
179        c->tp = 0;
180        c->running = 0;
181}
182
183/**********************************************************************
184 * Run the client thread
185 */
186
187static void
188client_run(struct client *c)
189{
190
191        client_start(c);
192        client_wait(c);
193}
194
195
196/**********************************************************************
197 * Server command dispatch
198 */
199
200void
201cmd_client(CMD_ARGS)
202{
203        struct client *c, *c2;
204
205        (void)priv;
206        (void)cmd;
207        (void)vl;
208
209        if (av == NULL) {
210                /* Reset and free */
211                VTAILQ_FOREACH_SAFE(c, &clients, list, c2) {
212                        VTAILQ_REMOVE(&clients, c, list);
213                        if (c->tp != 0)
214                                client_wait(c);
215                        client_delete(c);
216                }
217                return;
218        }
219
220        assert(!strcmp(av[0], "client"));
221        av++;
222
223        VTAILQ_FOREACH(c, &clients, list)
224                if (!strcmp(c->name, av[0]))
225                        break;
226        if (c == NULL)
227                c = client_new(av[0]);
228        av++;
229
230        for (; *av != NULL; av++) {
231                if (vtc_error)
232                        break;
233
234                if (!strcmp(*av, "-wait")) {
235                        client_wait(c);
236                        continue;
237                }
238
239                /* Don't muck about with a running client */
240                if (c->running)
241                        client_wait(c);
242
243                if (!strcmp(*av, "-connect")) {
244                        bprintf(c->connect, "%s", av[1]);
245                        av++;
246                        continue;
247                }
248                if (!strcmp(*av, "-repeat")) {
249                        c->repeat = atoi(av[1]);
250                        av++;
251                        continue;
252                }
253                if (!strcmp(*av, "-start")) {
254                        client_start(c);
255                        continue;
256                }
257                if (!strcmp(*av, "-run")) {
258                        client_run(c);
259                        continue;
260                }
261                if (**av == '-')
262                        vtc_log(c->vl, 0, "Unknown client argument: %s", *av);
263                REPLACE(c->spec, *av);
264        }
265}
Note: See TracBrowser for help on using the repository browser.