Skip to content

Commit 2870f94

Browse files
committed
fix file server
1 parent 656b8d7 commit 2870f94

File tree

4 files changed

+36
-63
lines changed

4 files changed

+36
-63
lines changed

http/http_response.c

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@
1010
* AUTHOR BE CONSIDERED LIABLE FOR THE USE AND PERFORMANCE OF
1111
* THIS SOFTWARE.
1212
*/
13+
#include <errno.h>
1314
#include <string.h>
15+
#include <unistd.h>
1416
#include <libkc3/kc3.h>
1517
#include "http_response.h"
1618

@@ -95,6 +97,7 @@ sw http_response_buf_write (const s_http_response *response,
9597
sw content_length = -1;
9698
s_str content_length_str = {0};
9799
s_tag default_messages = {0};
100+
s32 e;
98101
s_ident ident = {0};
99102
s_buf *in;
100103
s_tag *key = NULL;
@@ -105,8 +108,10 @@ sw http_response_buf_write (const s_http_response *response,
105108
s_str str;
106109
s_tag tag_code = {0};
107110
s_tag tag_message = {0};
111+
s_buf tmp;
108112
const s_sym *type;
109113
s_tag *value = NULL;
114+
sw w = 0;
110115
assert(response);
111116
assert(buf);
112117
if (! response->protocol.size)
@@ -224,6 +229,7 @@ sw http_response_buf_write (const s_http_response *response,
224229
if (type == &g_sym_Str) {
225230
if ((r = buf_write_str(buf, &response->body.data.str)) < 0)
226231
return r;
232+
result += r;
227233
}
228234
else if (type == &g_sym_Buf) {
229235
in = response->body.data.struct_.data;
@@ -234,16 +240,40 @@ sw http_response_buf_write (const s_http_response *response,
234240
err_inspect_str(&str);
235241
if ((r = buf_write(buf, str.ptr.pchar, str.size)) <= 0)
236242
return r;
243+
result += r;
237244
str_clean(&str);
238245
}
239246
}
247+
else if (type == &g_sym_S32) {
248+
buf_init_alloc(&tmp, BUF_SIZE);
249+
while ((r = read(response->body.data.s32,
250+
tmp.ptr.p, tmp.size)) > 0) {
251+
tmp.rpos = 0;
252+
tmp.wpos = r;
253+
while (tmp.rpos < (uw) r) {
254+
if ((w = buf_write(buf, tmp.ptr.ps8 + tmp.rpos,
255+
r - tmp.rpos)) <= 0)
256+
return w;
257+
result += w;
258+
tmp.rpos += w;
259+
}
260+
}
261+
if (r < 0) {
262+
e = errno;
263+
err_write_1("http_response_buf_write: ");
264+
err_inspect_s32(&response->body.data.s32);
265+
err_write_1(": ");
266+
err_puts(strerror(e));
267+
return r;
268+
}
269+
close(response->body.data.s32);
270+
}
240271
else {
241272
err_write_1("http_response_buf_write: unknown body type: ");
242273
err_inspect_sym(&type);
243274
err_write_1("\n");
244275
return -1;
245276
}
246-
result += r;
247277
}
248278
return result;
249279
}

lib/kc3/0.1/file.kc3

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,7 @@ defmodule File do
1717

1818
def list = cfn List "file_list" (Str, Result)
1919

20-
def open_r = cfn Buf "file_open_r" (Str, Result)
21-
22-
def open_w = cfn Buf "file_open_w" (Str, Result)
20+
def open_r = cfn S32 "file_open_r" (Str, Result)
2321

2422
def stat = cfn File.Stat "file_stat" (Str, Result)
2523

libkc3/file.c

Lines changed: 3 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -254,11 +254,10 @@ FILE * file_open (const char *path, const char *mode)
254254
return fp;
255255
}
256256

257-
s_buf * file_open_r (const s_str *path, s_buf *dest)
257+
s32 * file_open_r (const s_str *path, s32 *dest)
258258
{
259259
sw e;
260-
sw fd;
261-
s_buf tmp;
260+
s32 fd;
262261
assert(path);
263262
assert(dest);
264263
if ((fd = open(path->ptr.pchar, O_RDONLY | O_BINARY)) < 0) {
@@ -269,59 +268,7 @@ s_buf * file_open_r (const s_str *path, s_buf *dest)
269268
err_puts(strerror(e));
270269
return NULL;
271270
}
272-
if (! buf_init_alloc(&tmp, BUF_SIZE)) {
273-
close(fd);
274-
return NULL;
275-
}
276-
if (! buf_fd_open_r(&tmp, fd)) {
277-
buf_clean(&tmp);
278-
close(fd);
279-
return NULL;
280-
}
281-
*dest = tmp;
282-
return dest;
283-
}
284-
285-
s_buf_rw * file_open_rw (const s_str *path, s_buf_rw *dest)
286-
{
287-
s_buf_rw tmp = {0};
288-
assert(path);
289-
assert(dest);
290-
tmp.r = alloc(sizeof(s_buf));
291-
if (! file_open_r(path, tmp.r)) {
292-
free(tmp.r);
293-
return NULL;
294-
}
295-
tmp.w = alloc(sizeof(s_buf));
296-
if (! file_open_w(path, tmp.w)) {
297-
free(tmp.w);
298-
buf_file_close(tmp.r);
299-
free(tmp.r);
300-
return NULL;
301-
}
302-
*dest = tmp;
303-
return dest;
304-
}
305-
306-
s_buf * file_open_w (const s_str *path, s_buf *dest)
307-
{
308-
FILE *fp;
309-
s_buf tmp;
310-
assert(path);
311-
assert(dest);
312-
fp = file_open(path->ptr.pchar, "wb");
313-
if (! fp)
314-
return NULL;
315-
if (! buf_init_alloc(&tmp, BUF_SIZE)) {
316-
fclose(fp);
317-
return NULL;
318-
}
319-
if (! buf_file_open_w(&tmp, fp)) {
320-
buf_clean(&tmp);
321-
fclose(fp);
322-
return NULL;
323-
}
324-
*dest = tmp;
271+
*dest = fd;
325272
return dest;
326273
}
327274

libkc3/file.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,6 @@ s_file_stat * file_stat (const s_str *path, s_file_stat *dest);
3838
/* Operators. */
3939
s_str * file_pwd (s_str *dest);
4040
FILE * file_open (const char *path, const char *mode);
41-
s_buf * file_open_r (const s_str *path, s_buf *dest);
42-
s_buf_rw * file_open_rw (const s_str *path, s_buf_rw *dest);
43-
s_buf * file_open_w (const s_str *path, s_buf *dest);
41+
s32 * file_open_r (const s_str *path, s32 *dest);
4442

4543
#endif /* LIBKC3_FILE_H */

0 commit comments

Comments
 (0)