File rgfs.c changed (mode: 100644) (index 6a370d8..a34764c) |
... |
... |
static void xlog(char *format, ...) |
43 |
43 |
{ |
{ |
44 |
44 |
va_list ap; |
va_list ap; |
45 |
45 |
size_t len, len2; |
size_t len, len2; |
46 |
|
char line[4096]; |
|
|
46 |
|
char line[4 * 4096]; |
47 |
47 |
struct timeval tv; |
struct timeval tv; |
48 |
48 |
|
|
49 |
49 |
if (rgfs_debug == 0) |
if (rgfs_debug == 0) |
|
... |
... |
static ssize_t rgfs_recv(void *buf, const size_t buf_max) |
87 |
87 |
/* |
/* |
88 |
88 |
* Sending data |
* Sending data |
89 |
89 |
*/ |
*/ |
90 |
|
static ssize_t rgfs_send(const void *buf, size_t buf_len) |
|
|
90 |
|
static ssize_t rgfs_send(const char *op, const void *buf, size_t buf_len) |
91 |
91 |
{ |
{ |
92 |
92 |
ssize_t r; |
ssize_t r; |
93 |
93 |
|
|
|
... |
... |
static ssize_t rgfs_send(const void *buf, size_t buf_len) |
96 |
96 |
short max = buf_len > 4096 ? 4096 : buf_len; |
short max = buf_len > 4096 ? 4096 : buf_len; |
97 |
97 |
for (unsigned int i = 0; i < max; i++) |
for (unsigned int i = 0; i < max; i++) |
98 |
98 |
sprintf(debug + i * 2, "%02hhx", * (unsigned char *) (buf + i)); |
sprintf(debug + i * 2, "%02hhx", * (unsigned char *) (buf + i)); |
99 |
|
xlog(" SEND %u: %s\n", buf_len, debug); |
|
|
99 |
|
xlog(" %s: SEND %u: %s\n", op, buf_len, debug); |
100 |
100 |
} |
} |
101 |
101 |
|
|
102 |
102 |
do { |
do { |
|
... |
... |
static ssize_t rgfs_ws1(void) |
182 |
182 |
rgfs_url, rgfs_server, rgfs_port); |
rgfs_url, rgfs_server, rgfs_port); |
183 |
183 |
|
|
184 |
184 |
xlog("Sending:\n%s", out); |
xlog("Sending:\n%s", out); |
185 |
|
return rgfs_send(out, len); |
|
|
185 |
|
return rgfs_send("ws req", out, len); |
186 |
186 |
} |
} |
187 |
187 |
|
|
188 |
188 |
/* |
/* |
|
... |
... |
static int rgfs_tls(void) |
299 |
299 |
buf[1] = 0; // len H |
buf[1] = 0; // len H |
300 |
300 |
buf[2] = 1; // len L |
buf[2] = 1; // len L |
301 |
301 |
buf[3] = RGFS_PROTOCOL_VERSION; |
buf[3] = RGFS_PROTOCOL_VERSION; |
302 |
|
r = rgfs_send(buf, 4); |
|
|
302 |
|
r = rgfs_send("send ver", buf, 4); |
303 |
303 |
if (r <= 0) |
if (r <= 0) |
304 |
304 |
break; |
break; |
305 |
305 |
|
|
|
... |
... |
static int rgfs_tls(void) |
315 |
315 |
buf[1] = len >> 8; // len H |
buf[1] = len >> 8; // len H |
316 |
316 |
buf[2] = len; // len L |
buf[2] = len; // len L |
317 |
317 |
memcpy(buf + 3, rgfs_name, len); |
memcpy(buf + 3, rgfs_name, len); |
318 |
|
r = rgfs_send(buf, 3 + len); |
|
|
318 |
|
r = rgfs_send("name", buf, 3 + len); |
319 |
319 |
if (r <= 0) |
if (r <= 0) |
320 |
320 |
break; |
break; |
321 |
321 |
|
|
|
... |
... |
static int rgfs_tls(void) |
329 |
329 |
buf[5] = rgfs_pkg_repo_id >> 8; |
buf[5] = rgfs_pkg_repo_id >> 8; |
330 |
330 |
buf[6] = rgfs_pkg_repo_id; |
buf[6] = rgfs_pkg_repo_id; |
331 |
331 |
memcpy(buf + 7, rgfs_key, len); |
memcpy(buf + 7, rgfs_key, len); |
332 |
|
r = rgfs_send(buf, 7 + len); |
|
|
332 |
|
r = rgfs_send("repo&key", buf, 7 + len); |
333 |
333 |
if (r <= 0) |
if (r <= 0) |
334 |
334 |
break; |
break; |
335 |
335 |
|
|
|
... |
... |
static void rgfs_reconnect(void) |
357 |
357 |
xlog("Reconnecting...\n"); |
xlog("Reconnecting...\n"); |
358 |
358 |
r = rgfs_tls(); |
r = rgfs_tls(); |
359 |
359 |
if (r == 0) { |
if (r == 0) { |
360 |
|
xlog("Reconnecting OK!\n"); |
|
|
360 |
|
xlog(" Reconnecting OK!\n"); |
361 |
361 |
connected = 1; |
connected = 1; |
362 |
362 |
break; |
break; |
363 |
363 |
} |
} |
364 |
364 |
if (r == 1) { |
if (r == 1) { |
365 |
|
xlog("Exiting!"); |
|
|
365 |
|
xlog(" Exiting!"); |
366 |
366 |
exit(1); |
exit(1); |
367 |
367 |
} |
} |
368 |
368 |
|
|
369 |
|
xlog("Sleeping...\n"); |
|
|
369 |
|
xlog(" Sleeping...\n"); |
370 |
370 |
sleep(1); |
sleep(1); |
371 |
371 |
} |
} |
372 |
372 |
} |
} |
373 |
373 |
|
|
374 |
|
static int rgfs_recv_hl(void *buf, size_t buf_size) |
|
|
374 |
|
static int rgfs_recv_hl(const char *op, void *buf, size_t buf_size) |
375 |
375 |
{ |
{ |
376 |
376 |
int r; |
int r; |
377 |
377 |
uint32_t off, to_read = 0; |
uint32_t off, to_read = 0; |
|
... |
... |
static int rgfs_recv_hl(void *buf, size_t buf_size) |
396 |
396 |
short max = off > 4096 ? 4096 : off; |
short max = off > 4096 ? 4096 : off; |
397 |
397 |
for (unsigned int i = 0; i < max; i++) |
for (unsigned int i = 0; i < max; i++) |
398 |
398 |
sprintf(debug + i * 2, "%02hhx", * (unsigned char *) (buf + i)); |
sprintf(debug + i * 2, "%02hhx", * (unsigned char *) (buf + i)); |
399 |
|
xlog(" RECV %u: %s\n", off, debug); |
|
|
399 |
|
xlog(" %s: RECV %u: %s\n", op, off, debug); |
400 |
400 |
} |
} |
401 |
401 |
|
|
402 |
402 |
if (off == 4 + to_read) { |
if (off == 4 + to_read) { |
|
... |
... |
static int rgfs_recv_hl(void *buf, size_t buf_size) |
406 |
406 |
} |
} |
407 |
407 |
} |
} |
408 |
408 |
|
|
409 |
|
static ssize_t rgfs_send_recv(const void *out_buf, size_t out_buf_len, |
|
|
409 |
|
static ssize_t rgfs_send_recv(const char *op, |
|
410 |
|
const void *out_buf, size_t out_buf_len, |
410 |
411 |
void *in_buf, size_t in_buf_size) |
void *in_buf, size_t in_buf_size) |
411 |
412 |
{ |
{ |
412 |
413 |
int r; |
int r; |
|
... |
... |
static ssize_t rgfs_send_recv(const void *out_buf, size_t out_buf_len, |
416 |
417 |
|
|
417 |
418 |
while (1) { |
while (1) { |
418 |
419 |
//xlog(" Sending %zu bytes\n", out_buf_len); |
//xlog(" Sending %zu bytes\n", out_buf_len); |
419 |
|
r = rgfs_send(out_buf, out_buf_len); |
|
|
420 |
|
r = rgfs_send(op, out_buf, out_buf_len); |
420 |
421 |
if (r <= 0) { |
if (r <= 0) { |
421 |
422 |
rgfs_reconnect(); |
rgfs_reconnect(); |
422 |
423 |
continue; |
continue; |
423 |
424 |
} |
} |
424 |
425 |
|
|
425 |
|
r = rgfs_recv_hl(in_buf, in_buf_size); |
|
|
426 |
|
r = rgfs_recv_hl(op, in_buf, in_buf_size); |
426 |
427 |
if (r <= 0) { |
if (r <= 0) { |
427 |
428 |
rgfs_reconnect(); |
rgfs_reconnect(); |
428 |
429 |
continue; |
continue; |
|
... |
... |
static int rgfs_fuse_getattr(const char *path, struct stat *s) |
455 |
456 |
buf[i++] = (len - 1 - 2) >> 8; |
buf[i++] = (len - 1 - 2) >> 8; |
456 |
457 |
buf[i++] = len - 1 - 2; |
buf[i++] = len - 1 - 2; |
457 |
458 |
memcpy(buf + i, path, path_len); i += path_len; |
memcpy(buf + i, path, path_len); i += path_len; |
458 |
|
r = rgfs_send_recv(buf, i, buf, sizeof(buf)); |
|
|
459 |
|
r = rgfs_send_recv("getattr", buf, i, buf, sizeof(buf)); |
459 |
460 |
|
|
460 |
461 |
memset(s, 0, sizeof(struct stat)); |
memset(s, 0, sizeof(struct stat)); |
461 |
462 |
i = 4; |
i = 4; |
|
... |
... |
static int rgfs_fuse_readdir(const char *dir, void *out, |
509 |
510 |
buf[i++] = len - 1 - 2; |
buf[i++] = len - 1 - 2; |
510 |
511 |
u64 = htobe64(offset); memcpy(buf + i, &u64, 8); i += 8; |
u64 = htobe64(offset); memcpy(buf + i, &u64, 8); i += 8; |
511 |
512 |
memcpy(buf + i, dir, path_len); i += path_len; |
memcpy(buf + i, dir, path_len); i += path_len; |
512 |
|
r = rgfs_send_recv(buf, i, buf, sizeof(buf)); |
|
|
513 |
|
r = rgfs_send_recv("readdir", buf, i, buf, sizeof(buf)); |
513 |
514 |
|
|
514 |
515 |
// standard |
// standard |
515 |
516 |
filler(out, ".", NULL, 0); |
filler(out, ".", NULL, 0); |
|
... |
... |
static int rgfs_fuse_read(const char *path, char *out, size_t size, |
588 |
589 |
u64 = htobe64(offset); memcpy(buf + i, &u64, 8); i += 8; |
u64 = htobe64(offset); memcpy(buf + i, &u64, 8); i += 8; |
589 |
590 |
u64 = htobe64(size); memcpy(buf + i, &u64, 8); i += 8; |
u64 = htobe64(size); memcpy(buf + i, &u64, 8); i += 8; |
590 |
591 |
memcpy(buf + i, path, path_len); i += path_len; |
memcpy(buf + i, path, path_len); i += path_len; |
591 |
|
r = rgfs_send_recv(buf, i, buf, sizeof(buf)); |
|
|
592 |
|
r = rgfs_send_recv("read", buf, i, buf, sizeof(buf)); |
592 |
593 |
|
|
593 |
594 |
i = 4; |
i = 4; |
594 |
595 |
if (i < r) { |
if (i < r) { |
|
... |
... |
static int rgfs_fuse_write(const char *path, const char *in, size_t size, |
623 |
624 |
(void) fi; |
(void) fi; |
624 |
625 |
|
|
625 |
626 |
xlog("write: path=%s size=%zu offset=%zd\n", path, size, offset); |
xlog("write: path=%s size=%zu offset=%zd\n", path, size, offset); |
626 |
|
#if 0 |
|
627 |
|
for (unsigned int j = 0; j < 32; j++) |
|
628 |
|
xlog("%02hhx", in[j]); |
|
629 |
|
xlog("\n"); |
|
630 |
|
#endif |
|
631 |
627 |
|
|
632 |
628 |
path_len = strlen(path); |
path_len = strlen(path); |
633 |
629 |
len = 1 + 2 + 2 + 8 + path_len + size; |
len = 1 + 2 + 2 + 8 + path_len + size; |
|
... |
... |
static int rgfs_fuse_write(const char *path, const char *in, size_t size, |
644 |
640 |
u64 = htobe64(offset); memcpy(buf + i, &u64, 8); i += 8; |
u64 = htobe64(offset); memcpy(buf + i, &u64, 8); i += 8; |
645 |
641 |
memcpy(buf + i, path, path_len); i += path_len; |
memcpy(buf + i, path, path_len); i += path_len; |
646 |
642 |
memcpy(buf + i, in, size); i += size; |
memcpy(buf + i, in, size); i += size; |
647 |
|
r = rgfs_send_recv(buf, i, buf, sizeof(buf)); |
|
|
643 |
|
r = rgfs_send_recv("write", buf, i, buf, sizeof(buf)); |
648 |
644 |
|
|
649 |
645 |
i = 4; |
i = 4; |
650 |
646 |
if (i < r) { |
if (i < r) { |
|
... |
... |
static int rgfs_fuse_create(const char *path, mode_t mode, |
692 |
688 |
buf[i++] = len - 1 - 2; |
buf[i++] = len - 1 - 2; |
693 |
689 |
u32 = htobe32(mode); memcpy(buf + i, &u32, 4); i += 4; |
u32 = htobe32(mode); memcpy(buf + i, &u32, 4); i += 4; |
694 |
690 |
memcpy(buf + i, path, path_len); i += path_len; |
memcpy(buf + i, path, path_len); i += path_len; |
695 |
|
r = rgfs_send_recv(buf, i, buf, sizeof(buf)); |
|
|
691 |
|
r = rgfs_send_recv("create", buf, i, buf, sizeof(buf)); |
696 |
692 |
|
|
697 |
693 |
i = 4; |
i = 4; |
698 |
694 |
if (i < r) { |
if (i < r) { |
|
... |
... |
static int rgfs_fuse_mkdir(const char *path, mode_t mode) |
732 |
728 |
buf[i++] = len - 1 - 2; |
buf[i++] = len - 1 - 2; |
733 |
729 |
u32 = htobe32(mode); memcpy(buf + i, &u32, 4); i += 4; |
u32 = htobe32(mode); memcpy(buf + i, &u32, 4); i += 4; |
734 |
730 |
memcpy(buf + i, path, path_len); i += path_len; |
memcpy(buf + i, path, path_len); i += path_len; |
735 |
|
r = rgfs_send_recv(buf, i, buf, sizeof(buf)); |
|
|
731 |
|
r = rgfs_send_recv("mkdir", buf, i, buf, sizeof(buf)); |
736 |
732 |
|
|
737 |
733 |
i = 4; |
i = 4; |
738 |
734 |
if (i < r) { |
if (i < r) { |
|
... |
... |
static int rgfs_fuse_unlink(const char *path) |
770 |
766 |
buf[i++] = (len - 1 - 2) >> 8; |
buf[i++] = (len - 1 - 2) >> 8; |
771 |
767 |
buf[i++] = len - 1 - 2; |
buf[i++] = len - 1 - 2; |
772 |
768 |
memcpy(buf + i, path, path_len); i += path_len; |
memcpy(buf + i, path, path_len); i += path_len; |
773 |
|
r = rgfs_send_recv(buf, i, buf, sizeof(buf)); |
|
|
769 |
|
r = rgfs_send_recv("unlink", buf, i, buf, sizeof(buf)); |
774 |
770 |
|
|
775 |
771 |
i = 4; |
i = 4; |
776 |
772 |
if (i < r) { |
if (i < r) { |
|
... |
... |
static int rgfs_fuse_rmdir(const char *path) |
808 |
804 |
buf[i++] = (len - 1 - 2) >> 8; |
buf[i++] = (len - 1 - 2) >> 8; |
809 |
805 |
buf[i++] = len - 1 - 2; |
buf[i++] = len - 1 - 2; |
810 |
806 |
memcpy(buf + i, path, path_len); i += path_len; |
memcpy(buf + i, path, path_len); i += path_len; |
811 |
|
r = rgfs_send_recv(buf, i, buf, sizeof(buf)); |
|
|
807 |
|
r = rgfs_send_recv("rmdir", buf, i, buf, sizeof(buf)); |
812 |
808 |
|
|
813 |
809 |
i = 4; |
i = 4; |
814 |
810 |
if (i < r) { |
if (i < r) { |
|
... |
... |
static int rgfs_fuse_rename(const char *old, const char *new) |
850 |
846 |
u16 = htobe16(new_len); memcpy(buf + i, &u16, 2); i += 2; |
u16 = htobe16(new_len); memcpy(buf + i, &u16, 2); i += 2; |
851 |
847 |
memcpy(buf + i, old, old_len); i += old_len; |
memcpy(buf + i, old, old_len); i += old_len; |
852 |
848 |
memcpy(buf + i, new, new_len); i += new_len; |
memcpy(buf + i, new, new_len); i += new_len; |
853 |
|
r = rgfs_send_recv(buf, i, buf, sizeof(buf)); |
|
|
849 |
|
r = rgfs_send_recv("rename", buf, i, buf, sizeof(buf)); |
854 |
850 |
|
|
855 |
851 |
i = 4; |
i = 4; |
856 |
852 |
if (i < r) { |
if (i < r) { |
|
... |
... |
static int rgfs_fuse_truncate(const char *path, off_t off) |
890 |
886 |
buf[i++] = len - 1 - 2; |
buf[i++] = len - 1 - 2; |
891 |
887 |
u64 = htobe64(off); memcpy(buf + i, &u64, 8); i += 8; |
u64 = htobe64(off); memcpy(buf + i, &u64, 8); i += 8; |
892 |
888 |
memcpy(buf + i, path, path_len); i += path_len; |
memcpy(buf + i, path, path_len); i += path_len; |
893 |
|
r = rgfs_send_recv(buf, i, buf, sizeof(buf)); |
|
|
889 |
|
r = rgfs_send_recv("truncate", buf, i, buf, sizeof(buf)); |
894 |
890 |
|
|
895 |
891 |
i = 4; |
i = 4; |
896 |
892 |
if (i < r) { |
if (i < r) { |
|
... |
... |
static int rgfs_fuse_utimens(const char *path, const struct timespec tv[2]) |
935 |
931 |
u64 = htobe64(tv[1].tv_sec); memcpy(buf + i, &u64, 8); i += 8; |
u64 = htobe64(tv[1].tv_sec); memcpy(buf + i, &u64, 8); i += 8; |
936 |
932 |
u64 = htobe64(tv[1].tv_nsec); memcpy(buf + i, &u64, 8); i += 8; |
u64 = htobe64(tv[1].tv_nsec); memcpy(buf + i, &u64, 8); i += 8; |
937 |
933 |
memcpy(buf + i, path, path_len); i += path_len; |
memcpy(buf + i, path, path_len); i += path_len; |
938 |
|
r = rgfs_send_recv(buf, i, buf, sizeof(buf)); |
|
|
934 |
|
r = rgfs_send_recv("utimens", buf, i, buf, sizeof(buf)); |
939 |
935 |
|
|
940 |
936 |
i = 4; |
i = 4; |
941 |
937 |
if (i < r) { |
if (i < r) { |
|
... |
... |
static int rgfs_fuse_readlink(const char *path, char *out, size_t out_size) |
974 |
970 |
buf[i++] = (len - 1 - 2) >> 8; |
buf[i++] = (len - 1 - 2) >> 8; |
975 |
971 |
buf[i++] = len - 1 - 2; |
buf[i++] = len - 1 - 2; |
976 |
972 |
memcpy(buf + i, path, path_len); i += path_len; |
memcpy(buf + i, path, path_len); i += path_len; |
977 |
|
r = rgfs_send_recv(buf, i, buf, sizeof(buf)); |
|
|
973 |
|
r = rgfs_send_recv("readlink", buf, i, buf, sizeof(buf)); |
978 |
974 |
|
|
979 |
|
// 00000022 01 0006626c613132330100026f73010009726f6f745f6161615f010001780100 |
|
980 |
975 |
i = 4; |
i = 4; |
981 |
976 |
if (i < r) { |
if (i < r) { |
982 |
977 |
cmd = buf[i++]; |
cmd = buf[i++]; |
|
... |
... |
static int rgfs_fuse_symlink(const char *target, const char *link) |
1027 |
1022 |
u16 = htobe16(link_len); memcpy(buf + i, &u16, 2); i += 2; |
u16 = htobe16(link_len); memcpy(buf + i, &u16, 2); i += 2; |
1028 |
1023 |
memcpy(buf + i, target, target_len); i += target_len; |
memcpy(buf + i, target, target_len); i += target_len; |
1029 |
1024 |
memcpy(buf + i, link, link_len); i += link_len; |
memcpy(buf + i, link, link_len); i += link_len; |
1030 |
|
r = rgfs_send_recv(buf, i, buf, sizeof(buf)); |
|
|
1025 |
|
r = rgfs_send_recv("symlink", buf, i, buf, sizeof(buf)); |
1031 |
1026 |
|
|
1032 |
1027 |
i = 4; |
i = 4; |
1033 |
1028 |
if (i < r) { |
if (i < r) { |
|
... |
... |
static int rgfs_fuse_link(const char *target, const char *link) |
1069 |
1064 |
u16 = htobe16(link_len); memcpy(buf + i, &u16, 2); i += 2; |
u16 = htobe16(link_len); memcpy(buf + i, &u16, 2); i += 2; |
1070 |
1065 |
memcpy(buf + i, target, target_len); i += target_len; |
memcpy(buf + i, target, target_len); i += target_len; |
1071 |
1066 |
memcpy(buf + i, link, link_len); i += link_len; |
memcpy(buf + i, link, link_len); i += link_len; |
1072 |
|
r = rgfs_send_recv(buf, i, buf, sizeof(buf)); |
|
|
1067 |
|
r = rgfs_send_recv("link", buf, i, buf, sizeof(buf)); |
1073 |
1068 |
|
|
1074 |
1069 |
i = 4; |
i = 4; |
1075 |
1070 |
if (i < r) { |
if (i < r) { |