fixed a bug in main-c.c
This commit is contained in:
parent
8be5e3fd83
commit
b3c0640ba6
20
lib/hcl-s.c
20
lib/hcl-s.c
@ -128,16 +128,6 @@
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
union sockaddr_t
|
||||
{
|
||||
struct sockaddr_in in4;
|
||||
#if (HCL_SIZEOF_STRUCT_SOCKADDR_IN6 > 0)
|
||||
struct sockaddr_in6 in6;
|
||||
#endif
|
||||
};
|
||||
typedef union sockaddr_t sockaddr_t;
|
||||
|
||||
struct bb_t
|
||||
{
|
||||
char buf[1024];
|
||||
@ -251,7 +241,7 @@ struct hcl_server_worker_t
|
||||
hcl_oow_t wid;
|
||||
|
||||
int sck;
|
||||
sockaddr_t peeraddr;
|
||||
hcl_sckaddr_t peeraddr;
|
||||
|
||||
int claimed;
|
||||
|
||||
@ -2002,7 +1992,7 @@ static HCL_INLINE void release_wid (hcl_server_t* server, hcl_server_worker_t* w
|
||||
worker->wid = HCL_SERVER_WID_INVALID;
|
||||
}
|
||||
|
||||
static hcl_server_worker_t* alloc_worker (hcl_server_t* server, int cli_sck, const sockaddr_t* peeraddr)
|
||||
static hcl_server_worker_t* alloc_worker (hcl_server_t* server, int cli_sck, const hcl_sckaddr_t* peeraddr)
|
||||
{
|
||||
hcl_server_worker_t* worker;
|
||||
|
||||
@ -2250,7 +2240,7 @@ int hcl_server_start (hcl_server_t* server, const hcl_bch_t* addrs)
|
||||
{
|
||||
hcl_sckaddr_t srv_addr;
|
||||
int srv_fd, sck_fam, optval, xret = 0;
|
||||
socklen_t srv_len;
|
||||
hcl_scklen_t srv_len;
|
||||
pthread_attr_t thr_attr;
|
||||
|
||||
/* TODO: interprete 'addrs' as a command-separated address list
|
||||
@ -2293,9 +2283,9 @@ int hcl_server_start (hcl_server_t* server, const hcl_bch_t* addrs)
|
||||
server->stopreq = 0;
|
||||
while (!server->stopreq)
|
||||
{
|
||||
sockaddr_t cli_addr;
|
||||
hcl_sckaddr_t cli_addr;
|
||||
int cli_fd;
|
||||
socklen_t cli_len;
|
||||
hcl_scklen_t cli_len;
|
||||
pthread_t thr;
|
||||
hcl_ntime_t tmout;
|
||||
hcl_server_worker_t* worker;
|
||||
|
42
lib/main-c.c
42
lib/main-c.c
@ -442,13 +442,18 @@ static int handle_logopt (hcl_client_t* client, const hcl_bch_t* str)
|
||||
|
||||
static int start_reply (hcl_client_t* client, hcl_client_reply_type_t type, const hcl_ooch_t* dptr, hcl_oow_t dlen)
|
||||
{
|
||||
client_xtn_t* client_xtn;
|
||||
client_xtn = hcl_client_getxtn(client);
|
||||
|
||||
if (dptr)
|
||||
{
|
||||
printf ("GOT SHORT-FORM RESPONSE[%d] with data <<%.*ls>>\n", (int)type, (int)dlen, dptr);
|
||||
/* short-form response - no end_reply will be called */
|
||||
client_xtn->reply_count++;
|
||||
fflush (stdout);
|
||||
}
|
||||
else
|
||||
{
|
||||
printf ("GOT LONG_FORM RESPONSE[%d]\n", (int)type);
|
||||
/* long-form response */
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@ -460,26 +465,24 @@ static int end_reply (hcl_client_t* client, hcl_client_end_reply_state_t state)
|
||||
|
||||
if (state == HCL_CLIENT_END_REPLY_STATE_REVOKED)
|
||||
{
|
||||
printf (">>>>>>>>>>>>>>>>>>>>>> REPLY revoked....\n");
|
||||
/* nothing to do here */
|
||||
}
|
||||
else
|
||||
{
|
||||
client_xtn->reply_count++;
|
||||
printf (">>>>>>>>>>>>>>>>>>>>> REPLY ENDED OK....\n");
|
||||
fflush (stdout);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int feed_attr (hcl_client_t* client, const hcl_oocs_t* key, const hcl_oocs_t* val)
|
||||
{
|
||||
printf ("GOT HEADER ====> [%.*ls] ===> [%.*ls]\n", (int)key->len, key->ptr, (int)val->len, val->ptr);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int feed_data (hcl_client_t* client, const void* ptr, hcl_oow_t len)
|
||||
{
|
||||
//printf ("GOT DATA>>>>>>>>>[%.*s]>>>>>>>\n", (int)len, ptr);
|
||||
printf ("%.*s", (int)len, ptr);
|
||||
printf ("%.*s", (int)len, ptr);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -490,11 +493,11 @@ static int handle_request (hcl_client_t* client, const char* ipaddr, const char*
|
||||
hcl_sckaddr_t sckaddr;
|
||||
hcl_scklen_t scklen;
|
||||
int sckfam;
|
||||
int sck;
|
||||
struct iovec iov[10];
|
||||
int sck = -1;
|
||||
struct iovec iov[3];
|
||||
int index, count;
|
||||
|
||||
hcl_oow_t xlen, offset;
|
||||
hcl_oow_t used, avail;
|
||||
int x;
|
||||
hcl_bch_t buf[256];
|
||||
ssize_t n;
|
||||
@ -507,22 +510,20 @@ static int handle_request (hcl_client_t* client, const char* ipaddr, const char*
|
||||
if (sckfam <= -1)
|
||||
{
|
||||
fprintf (stderr, "cannot convert ip address - %s\n", ipaddr);
|
||||
return -1;
|
||||
goto oops;
|
||||
}
|
||||
|
||||
sck = socket (sckfam, SOCK_STREAM, 0);
|
||||
if (sck <= -1)
|
||||
{
|
||||
fprintf (stderr, "cannot create a socket for %s\n", ipaddr);
|
||||
return -1;
|
||||
goto oops;
|
||||
}
|
||||
|
||||
|
||||
if (connect(sck, (struct sockaddr*)&sckaddr, scklen) <= -1)
|
||||
{
|
||||
fprintf (stderr, "cannot connect to %s\n", ipaddr);
|
||||
close (sck);
|
||||
return -1;
|
||||
goto oops;
|
||||
}
|
||||
|
||||
count = 0;
|
||||
@ -565,10 +566,10 @@ static int handle_request (hcl_client_t* client, const char* ipaddr, const char*
|
||||
client_xtn->reply_count = 0;
|
||||
|
||||
/* TODO: implement timeout? */
|
||||
offset = 0;
|
||||
avail = 0;
|
||||
while (client_xtn->reply_count == 0)
|
||||
{
|
||||
n = read(sck, &buf[offset], HCL_SIZEOF(buf) - offset); /* switch to recv */
|
||||
n = read(sck, &buf[avail], HCL_SIZEOF(buf) - avail); /* switch to recv */
|
||||
if (n <= -1)
|
||||
{
|
||||
fprintf (stderr, "Unable to read from %d - %s\n", sck, strerror(n));
|
||||
@ -584,11 +585,12 @@ static int handle_request (hcl_client_t* client, const char* ipaddr, const char*
|
||||
break;
|
||||
}
|
||||
|
||||
x = hcl_client_feed(client, buf, n, &xlen);
|
||||
avail += n;;
|
||||
x = hcl_client_feed(client, buf, avail, &used);
|
||||
if (x <= -1) goto oops;
|
||||
|
||||
offset = n - xlen;
|
||||
if (offset > 0) memmove (&buf[0], &buf[xlen], offset);
|
||||
avail -= used;
|
||||
if (avail > 0) memmove (&buf[0], &buf[used], avail);
|
||||
}
|
||||
|
||||
/* TODO: we can check if the buffer has all been consumed. if not, there is trailing garbage.. */
|
||||
|
Loading…
Reference in New Issue
Block a user