File rgfs.c changed (mode: 100644) (index 1162fea..fc94f54) |
... |
... |
static int rgfs_fuse_readdir(const char *dir, void *out, |
484 |
484 |
char path[512]; |
char path[512]; |
485 |
485 |
uint64_t u64; |
uint64_t u64; |
486 |
486 |
|
|
487 |
|
(void) offset; |
|
488 |
487 |
(void) fi; |
(void) fi; |
489 |
488 |
xlog("readdir: dir=%s offset=%zd\n", dir, offset); |
xlog("readdir: dir=%s offset=%zd\n", dir, offset); |
490 |
489 |
|
|
|
... |
... |
static int rgfs_fuse_open(const char *path, struct fuse_file_info *fi) |
551 |
550 |
return 0; |
return 0; |
552 |
551 |
} |
} |
553 |
552 |
|
|
554 |
|
static int rgfs_fuse_create(const char *path, mode_t mode, |
|
555 |
|
struct fuse_file_info *fi) |
|
|
553 |
|
static int rgfs_fuse_read(const char *path, char *out, size_t size, |
|
554 |
|
off_t offset, struct fuse_file_info *fi) |
556 |
555 |
{ |
{ |
557 |
|
int err = 0, r, i; |
|
558 |
|
uint16_t u16, path_len, len; |
|
559 |
|
unsigned char buf[4 * 4096], cmd; |
|
|
556 |
|
int r, err = 0, i; |
|
557 |
|
unsigned char buf[16 * 4096], cmd; |
|
558 |
|
uint16_t path_len, len; |
|
559 |
|
uint64_t u64; |
560 |
560 |
|
|
561 |
|
(void) mode; |
|
562 |
561 |
(void) fi; |
(void) fi; |
563 |
|
xlog("create: path=%s\n", path); |
|
|
562 |
|
xlog("read: path=%s size=%zu offset=%zd\n", |
|
563 |
|
path, size, offset); |
|
564 |
|
|
|
565 |
|
// Limit how much data we request to the server |
|
566 |
|
// 1 + 4 + 8 is the answer's header. |
|
567 |
|
if (size > sizeof(buf) - 1 - 4) |
|
568 |
|
size = sizeof(buf) - 1 - 4; |
564 |
569 |
|
|
565 |
570 |
path_len = strlen(path); |
path_len = strlen(path); |
566 |
|
len = 1 + 2 + 2 + path_len; |
|
|
571 |
|
len = 1 + 2 + 8 + 8 + path_len; |
567 |
572 |
if (len > sizeof(buf)) { |
if (len > sizeof(buf)) { |
568 |
573 |
xlog(" buffer too small\n"); |
xlog(" buffer too small\n"); |
569 |
574 |
return -EIO; |
return -EIO; |
570 |
575 |
} |
} |
571 |
576 |
|
|
572 |
577 |
i = 0; |
i = 0; |
573 |
|
buf[i++] = 0x06; |
|
|
578 |
|
buf[i++] = 0x04; |
574 |
579 |
buf[i++] = (len - 1 - 2) >> 8; |
buf[i++] = (len - 1 - 2) >> 8; |
575 |
580 |
buf[i++] = len - 1 - 2; |
buf[i++] = len - 1 - 2; |
576 |
|
u16 = htobe16(path_len); memcpy(buf + i, &u16, 2); i += 2; |
|
|
581 |
|
u64 = htobe64(offset); memcpy(buf + i, &u64, 8); i += 8; |
|
582 |
|
u64 = htobe64(size); memcpy(buf + i, &u64, 8); i += 8; |
577 |
583 |
memcpy(buf + i, path, path_len); i += path_len; |
memcpy(buf + i, path, path_len); i += path_len; |
578 |
584 |
r = rgfs_send_recv(buf, i, buf, sizeof(buf)); |
r = rgfs_send_recv(buf, i, buf, sizeof(buf)); |
579 |
585 |
|
|
580 |
586 |
i = 4; |
i = 4; |
581 |
|
while (i < r) { |
|
|
587 |
|
if (i < r) { |
582 |
588 |
cmd = buf[i++]; |
cmd = buf[i++]; |
583 |
589 |
//xlog(" cmd=0x%02hhx\n", cmd); |
//xlog(" cmd=0x%02hhx\n", cmd); |
584 |
590 |
switch (cmd) { |
switch (cmd) { |
585 |
|
case 0x00: err = - be32toh(*(uint32_t *) (buf + i)); i += 4; break; |
|
|
591 |
|
case 0x00: err = - be32toh(*(uint32_t *) (buf + i)); break; |
|
592 |
|
case 0x01: /* block */ |
|
593 |
|
xlog(" received %llu bytes block\n", r - i); |
|
594 |
|
memcpy(out, buf + i, r - i); |
|
595 |
|
break; |
586 |
596 |
default: xlog("Unexpected subcode 0x%02hhx!\n", cmd); exit(EXIT_FAILURE); |
default: xlog("Unexpected subcode 0x%02hhx!\n", cmd); exit(EXIT_FAILURE); |
587 |
597 |
} |
} |
588 |
598 |
} |
} |
|
... |
... |
static int rgfs_fuse_create(const char *path, mode_t mode, |
592 |
602 |
return err; |
return err; |
593 |
603 |
} |
} |
594 |
604 |
|
|
595 |
|
return 0; |
|
|
605 |
|
return r - i; |
596 |
606 |
} |
} |
597 |
607 |
|
|
598 |
|
static int rgfs_fuse_mkdir(const char *path, mode_t mode) |
|
|
608 |
|
static int rgfs_fuse_write(const char *path, const char *in, size_t size, |
|
609 |
|
off_t offset, struct fuse_file_info *fi) |
599 |
610 |
{ |
{ |
600 |
|
int err = 0, r, i; |
|
601 |
|
uint16_t u16, path_len, len; |
|
|
611 |
|
int r, err = 0, i; |
602 |
612 |
unsigned char buf[4 * 4096], cmd; |
unsigned char buf[4 * 4096], cmd; |
|
613 |
|
uint16_t path_len, len; |
|
614 |
|
uint64_t u64; |
|
615 |
|
|
|
616 |
|
(void) fi; |
603 |
617 |
|
|
604 |
|
(void) mode; |
|
605 |
|
xlog("mkdir: path=%s\n", path); |
|
|
618 |
|
xlog("write: path=%s size=%zu offset=%zd\n", path, size, offset); |
|
619 |
|
#if 0 |
|
620 |
|
for (unsigned int j = 0; j < 32; j++) |
|
621 |
|
xlog("%02hhx", in[j]); |
|
622 |
|
xlog("\n"); |
|
623 |
|
#endif |
606 |
624 |
|
|
607 |
625 |
path_len = strlen(path); |
path_len = strlen(path); |
608 |
|
len = 1 + 2 + 2 + path_len; |
|
|
626 |
|
len = 1 + 2 + 8 + path_len + 1 + size; |
609 |
627 |
if (len > sizeof(buf)) { |
if (len > sizeof(buf)) { |
610 |
628 |
xlog(" buffer too small\n"); |
xlog(" buffer too small\n"); |
611 |
629 |
return -EIO; |
return -EIO; |
612 |
630 |
} |
} |
613 |
631 |
|
|
614 |
632 |
i = 0; |
i = 0; |
615 |
|
buf[i++] = 0x07; |
|
616 |
|
buf[i++] = (2 + path_len) / 256; |
|
617 |
|
buf[i++] = 2 + path_len; |
|
618 |
|
u16 = htobe16(path_len); memcpy(buf + i, &u16, 2); i += 2; |
|
619 |
|
memcpy(buf + i, path, path_len); i += path_len; |
|
|
633 |
|
buf[i++] = 0x05; |
|
634 |
|
buf[i++] = (len - 1 - 2) >> 8; |
|
635 |
|
buf[i++] = len - 1 - 2; |
|
636 |
|
u64 = htobe64(offset); memcpy(buf + i, &u64, 8); i += 8; |
|
637 |
|
memcpy(buf + i, path, path_len); buf[i] = '\0'; i += path_len + 1; |
|
638 |
|
memcpy(buf + i, in, size); i += size; |
620 |
639 |
r = rgfs_send_recv(buf, i, buf, sizeof(buf)); |
r = rgfs_send_recv(buf, i, buf, sizeof(buf)); |
621 |
640 |
|
|
622 |
641 |
i = 4; |
i = 4; |
623 |
|
while (i < r) { |
|
|
642 |
|
if (i < r) { |
624 |
643 |
cmd = buf[i++]; |
cmd = buf[i++]; |
625 |
644 |
//xlog(" cmd=0x%02hhx\n", cmd); |
//xlog(" cmd=0x%02hhx\n", cmd); |
626 |
645 |
switch (cmd) { |
switch (cmd) { |
627 |
|
case 0x00: err = - be32toh(*(uint32_t *) (buf + i)); i += 4; break; |
|
|
646 |
|
case 0x00: err = - be32toh(*(uint32_t *) (buf + i)); break; |
|
647 |
|
case 0x01: /* block */ |
|
648 |
|
u64 = be64toh(*(uint64_t *) (buf + i)); |
|
649 |
|
if (u64 != size) |
|
650 |
|
xlog(" wrote only %llu bytes\n", u64); |
|
651 |
|
break; |
628 |
652 |
default: xlog("Unexpected subcode 0x%02hhx!\n", cmd); exit(EXIT_FAILURE); |
default: xlog("Unexpected subcode 0x%02hhx!\n", cmd); exit(EXIT_FAILURE); |
629 |
653 |
} |
} |
630 |
654 |
} |
} |
|
... |
... |
static int rgfs_fuse_mkdir(const char *path, mode_t mode) |
634 |
658 |
return err; |
return err; |
635 |
659 |
} |
} |
636 |
660 |
|
|
637 |
|
return 0; |
|
|
661 |
|
return u64; |
638 |
662 |
} |
} |
639 |
663 |
|
|
640 |
|
static int rgfs_fuse_unlink(const char *path) |
|
|
664 |
|
static int rgfs_fuse_create(const char *path, mode_t mode, |
|
665 |
|
struct fuse_file_info *fi) |
641 |
666 |
{ |
{ |
642 |
667 |
int err = 0, r, i; |
int err = 0, r, i; |
643 |
|
uint16_t u16, path_len, len; |
|
|
668 |
|
uint16_t path_len, len; |
644 |
669 |
unsigned char buf[4 * 4096], cmd; |
unsigned char buf[4 * 4096], cmd; |
|
670 |
|
uint32_t u32; |
645 |
671 |
|
|
646 |
|
xlog("unlink: path=%s\n", path); |
|
|
672 |
|
(void) fi; |
|
673 |
|
xlog("create: path=%s mode=%u\n", path, mode); |
647 |
674 |
|
|
648 |
675 |
path_len = strlen(path); |
path_len = strlen(path); |
649 |
|
len = 1 + 2 + 2 + path_len; |
|
|
676 |
|
len = 1 + 2 + 4 + path_len; |
650 |
677 |
if (len > sizeof(buf)) { |
if (len > sizeof(buf)) { |
651 |
678 |
xlog(" buffer too small\n"); |
xlog(" buffer too small\n"); |
652 |
679 |
return -EIO; |
return -EIO; |
653 |
680 |
} |
} |
654 |
681 |
|
|
655 |
682 |
i = 0; |
i = 0; |
656 |
|
buf[i++] = 0x08; |
|
|
683 |
|
buf[i++] = 0x06; |
657 |
684 |
buf[i++] = (len - 1 - 2) >> 8; |
buf[i++] = (len - 1 - 2) >> 8; |
658 |
685 |
buf[i++] = len - 1 - 2; |
buf[i++] = len - 1 - 2; |
659 |
|
u16 = htobe16(path_len); memcpy(buf + i, &u16, 2); i += 2; |
|
|
686 |
|
u32 = htobe16(mode); memcpy(buf + i, &u32, 4); i += 4; |
660 |
687 |
memcpy(buf + i, path, path_len); i += path_len; |
memcpy(buf + i, path, path_len); i += path_len; |
661 |
688 |
r = rgfs_send_recv(buf, i, buf, sizeof(buf)); |
r = rgfs_send_recv(buf, i, buf, sizeof(buf)); |
662 |
689 |
|
|
663 |
690 |
i = 4; |
i = 4; |
664 |
|
while (i < r) { |
|
|
691 |
|
if (i < r) { |
665 |
692 |
cmd = buf[i++]; |
cmd = buf[i++]; |
666 |
693 |
//xlog(" cmd=0x%02hhx\n", cmd); |
//xlog(" cmd=0x%02hhx\n", cmd); |
667 |
694 |
switch (cmd) { |
switch (cmd) { |
668 |
|
case 0x00: err = - be32toh(*(uint32_t *) (buf + i)); i += 4; break; |
|
|
695 |
|
case 0x00: err = - be32toh(*(uint32_t *) (buf + i)); break; |
669 |
696 |
default: xlog("Unexpected subcode 0x%02hhx!\n", cmd); exit(EXIT_FAILURE); |
default: xlog("Unexpected subcode 0x%02hhx!\n", cmd); exit(EXIT_FAILURE); |
670 |
697 |
} |
} |
671 |
698 |
} |
} |
|
... |
... |
static int rgfs_fuse_unlink(const char *path) |
678 |
705 |
return 0; |
return 0; |
679 |
706 |
} |
} |
680 |
707 |
|
|
681 |
|
static int rgfs_fuse_rmdir(const char *path) |
|
|
708 |
|
static int rgfs_fuse_mkdir(const char *path, mode_t mode) |
682 |
709 |
{ |
{ |
683 |
710 |
int err = 0, r, i; |
int err = 0, r, i; |
684 |
|
uint16_t u16, path_len, len; |
|
685 |
|
unsigned char buf[4096], cmd; |
|
|
711 |
|
uint16_t path_len, len; |
|
712 |
|
unsigned char buf[4 * 4096], cmd; |
|
713 |
|
uint32_t u32; |
686 |
714 |
|
|
687 |
|
xlog("rmdir: path=%s\n", path); |
|
|
715 |
|
xlog("mkdir: path=%s mode=%u\n", path, mode); |
688 |
716 |
|
|
689 |
717 |
path_len = strlen(path); |
path_len = strlen(path); |
690 |
|
len = 1 + 2 + 2 + path_len; |
|
|
718 |
|
len = 1 + 2 + 4 + path_len; |
691 |
719 |
if (len > sizeof(buf)) { |
if (len > sizeof(buf)) { |
692 |
720 |
xlog(" buffer too small\n"); |
xlog(" buffer too small\n"); |
693 |
721 |
return -EIO; |
return -EIO; |
694 |
722 |
} |
} |
695 |
723 |
|
|
696 |
724 |
i = 0; |
i = 0; |
697 |
|
buf[i++] = 0x09; |
|
|
725 |
|
buf[i++] = 0x07; |
698 |
726 |
buf[i++] = (len - 1 - 2) >> 8; |
buf[i++] = (len - 1 - 2) >> 8; |
699 |
727 |
buf[i++] = len - 1 - 2; |
buf[i++] = len - 1 - 2; |
700 |
|
u16 = htobe16(path_len); memcpy(buf + i, &u16, 2); i += 2; |
|
|
728 |
|
u32 = htobe16(mode); memcpy(buf + i, &u32, 4); i += 4; |
701 |
729 |
memcpy(buf + i, path, path_len); i += path_len; |
memcpy(buf + i, path, path_len); i += path_len; |
702 |
730 |
r = rgfs_send_recv(buf, i, buf, sizeof(buf)); |
r = rgfs_send_recv(buf, i, buf, sizeof(buf)); |
703 |
731 |
|
|
704 |
732 |
i = 4; |
i = 4; |
705 |
|
while (i < r) { |
|
|
733 |
|
if (i < r) { |
706 |
734 |
cmd = buf[i++]; |
cmd = buf[i++]; |
707 |
735 |
//xlog(" cmd=0x%02hhx\n", cmd); |
//xlog(" cmd=0x%02hhx\n", cmd); |
708 |
736 |
switch (cmd) { |
switch (cmd) { |
709 |
|
case 0x00: err = - be32toh(*(uint32_t *) (buf + i)); i += 4; break; |
|
|
737 |
|
case 0x00: err = - be32toh(*(uint32_t *) (buf + i)); break; |
710 |
738 |
default: xlog("Unexpected subcode 0x%02hhx!\n", cmd); exit(EXIT_FAILURE); |
default: xlog("Unexpected subcode 0x%02hhx!\n", cmd); exit(EXIT_FAILURE); |
711 |
739 |
} |
} |
712 |
740 |
} |
} |
|
... |
... |
static int rgfs_fuse_rmdir(const char *path) |
719 |
747 |
return 0; |
return 0; |
720 |
748 |
} |
} |
721 |
749 |
|
|
722 |
|
static int rgfs_fuse_truncate(const char *path, off_t off) |
|
|
750 |
|
static int rgfs_fuse_unlink(const char *path) |
723 |
751 |
{ |
{ |
724 |
752 |
int err = 0, r, i; |
int err = 0, r, i; |
725 |
|
uint16_t u16, path_len, len; |
|
726 |
|
uint64_t u64; |
|
727 |
|
unsigned char buf[4096], cmd; |
|
|
753 |
|
uint16_t path_len, len; |
|
754 |
|
unsigned char buf[4 * 4096], cmd; |
728 |
755 |
|
|
729 |
|
xlog("truncate: path=%s off=%ld\n", path, off); |
|
|
756 |
|
xlog("unlink: path=%s\n", path); |
730 |
757 |
|
|
731 |
758 |
path_len = strlen(path); |
path_len = strlen(path); |
732 |
|
len = 1 + 2 + 2 + 8 + path_len; |
|
|
759 |
|
len = 1 + 2 + path_len; |
733 |
760 |
if (len > sizeof(buf)) { |
if (len > sizeof(buf)) { |
734 |
761 |
xlog(" buffer too small\n"); |
xlog(" buffer too small\n"); |
735 |
762 |
return -EIO; |
return -EIO; |
736 |
763 |
} |
} |
737 |
764 |
|
|
738 |
765 |
i = 0; |
i = 0; |
739 |
|
buf[i++] = 0x0b; |
|
|
766 |
|
buf[i++] = 0x08; |
740 |
767 |
buf[i++] = (len - 1 - 2) >> 8; |
buf[i++] = (len - 1 - 2) >> 8; |
741 |
768 |
buf[i++] = len - 1 - 2; |
buf[i++] = len - 1 - 2; |
742 |
|
u16 = htobe16(path_len); memcpy(buf + i, &u16, 2); i += 2; |
|
743 |
|
u64 = htobe64(off); memcpy(buf + i, &u64, 8); i += 8; |
|
744 |
769 |
memcpy(buf + i, path, path_len); i += path_len; |
memcpy(buf + i, path, path_len); i += path_len; |
745 |
770 |
r = rgfs_send_recv(buf, i, buf, sizeof(buf)); |
r = rgfs_send_recv(buf, i, buf, sizeof(buf)); |
746 |
771 |
|
|
747 |
772 |
i = 4; |
i = 4; |
748 |
|
while (i < r) { |
|
|
773 |
|
if (i < r) { |
749 |
774 |
cmd = buf[i++]; |
cmd = buf[i++]; |
750 |
|
xlog(" cmd=0x%02hhx\n", cmd); |
|
|
775 |
|
//xlog(" cmd=0x%02hhx\n", cmd); |
751 |
776 |
switch (cmd) { |
switch (cmd) { |
752 |
|
case 0x00: err = - be32toh(*(uint32_t *) (buf + i)); i += 4; break; |
|
|
777 |
|
case 0x00: err = - be32toh(*(uint32_t *) (buf + i)); break; |
753 |
778 |
default: xlog("Unexpected subcode 0x%02hhx!\n", cmd); exit(EXIT_FAILURE); |
default: xlog("Unexpected subcode 0x%02hhx!\n", cmd); exit(EXIT_FAILURE); |
754 |
779 |
} |
} |
755 |
780 |
} |
} |
|
... |
... |
static int rgfs_fuse_truncate(const char *path, off_t off) |
762 |
787 |
return 0; |
return 0; |
763 |
788 |
} |
} |
764 |
789 |
|
|
765 |
|
static int rgfs_fuse_read(const char *path, char *out, size_t size, |
|
766 |
|
off_t offset, struct fuse_file_info *fi) |
|
|
790 |
|
static int rgfs_fuse_rmdir(const char *path) |
767 |
791 |
{ |
{ |
768 |
|
int r, err = 0, i; |
|
769 |
|
unsigned char buf[16 * 4096], cmd; |
|
|
792 |
|
int err = 0, r, i; |
770 |
793 |
uint16_t path_len, len; |
uint16_t path_len, len; |
771 |
|
uint64_t u64; |
|
772 |
|
|
|
773 |
|
(void) fi; |
|
774 |
|
xlog("read: path=%s size=%zu offset=%zd\n", |
|
775 |
|
path, size, offset); |
|
|
794 |
|
unsigned char buf[4096], cmd; |
776 |
795 |
|
|
777 |
|
if (size > sizeof(buf) - 1 - 4 - 1 - 8) |
|
778 |
|
size = sizeof(buf) - 1 - 4 - 1 - 8; |
|
|
796 |
|
xlog("rmdir: path=%s\n", path); |
779 |
797 |
|
|
780 |
798 |
path_len = strlen(path); |
path_len = strlen(path); |
781 |
|
len = 1 + 2 + 8 + 8 + path_len; |
|
|
799 |
|
len = 1 + 2 + path_len; |
782 |
800 |
if (len > sizeof(buf)) { |
if (len > sizeof(buf)) { |
783 |
801 |
xlog(" buffer too small\n"); |
xlog(" buffer too small\n"); |
784 |
802 |
return -EIO; |
return -EIO; |
785 |
803 |
} |
} |
786 |
804 |
|
|
787 |
805 |
i = 0; |
i = 0; |
788 |
|
buf[i++] = 0x04; |
|
|
806 |
|
buf[i++] = 0x09; |
789 |
807 |
buf[i++] = (len - 1 - 2) >> 8; |
buf[i++] = (len - 1 - 2) >> 8; |
790 |
808 |
buf[i++] = len - 1 - 2; |
buf[i++] = len - 1 - 2; |
791 |
|
u64 = htobe64(offset); memcpy(buf + i, &u64, 8); i += 8; |
|
792 |
|
u64 = htobe64(size); memcpy(buf + i, &u64, 8); i += 8; |
|
793 |
809 |
memcpy(buf + i, path, path_len); i += path_len; |
memcpy(buf + i, path, path_len); i += path_len; |
794 |
810 |
r = rgfs_send_recv(buf, i, buf, sizeof(buf)); |
r = rgfs_send_recv(buf, i, buf, sizeof(buf)); |
795 |
811 |
|
|
796 |
812 |
i = 4; |
i = 4; |
797 |
|
while (i < r) { |
|
|
813 |
|
if (i < r) { |
798 |
814 |
cmd = buf[i++]; |
cmd = buf[i++]; |
799 |
815 |
//xlog(" cmd=0x%02hhx\n", cmd); |
//xlog(" cmd=0x%02hhx\n", cmd); |
800 |
816 |
switch (cmd) { |
switch (cmd) { |
801 |
|
case 0x00: err = - be32toh(*(uint32_t *) (buf + i)); i += 4; break; |
|
802 |
|
case 0x01: /* block */ |
|
803 |
|
u64 = be64toh(*(uint64_t *) (buf + i)); i += 8; |
|
804 |
|
xlog(" received %llu bytes block\n", u64); |
|
805 |
|
if (i + u64 > (unsigned int) r) { |
|
806 |
|
xlog(" packet error: i=%d + u64=%llu > r=%d\n", |
|
807 |
|
i, u64, r); |
|
808 |
|
return -EIO; |
|
809 |
|
} |
|
810 |
|
memcpy(out, buf + i, u64); i += u64; |
|
811 |
|
break; |
|
|
817 |
|
case 0x00: err = - be32toh(*(uint32_t *) (buf + i)); break; |
812 |
818 |
default: xlog("Unexpected subcode 0x%02hhx!\n", cmd); exit(EXIT_FAILURE); |
default: xlog("Unexpected subcode 0x%02hhx!\n", cmd); exit(EXIT_FAILURE); |
813 |
819 |
} |
} |
814 |
820 |
} |
} |
|
... |
... |
static int rgfs_fuse_read(const char *path, char *out, size_t size, |
818 |
824 |
return err; |
return err; |
819 |
825 |
} |
} |
820 |
826 |
|
|
821 |
|
return u64; |
|
|
827 |
|
return 0; |
822 |
828 |
} |
} |
823 |
829 |
|
|
824 |
|
static int rgfs_fuse_write(const char *path, const char *in, size_t size, |
|
825 |
|
off_t offset, struct fuse_file_info *fi) |
|
|
830 |
|
static int rgfs_fuse_rename(const char *old, const char *new) |
826 |
831 |
{ |
{ |
827 |
832 |
int r, err = 0, i; |
int r, err = 0, i; |
828 |
833 |
unsigned char buf[4 * 4096], cmd; |
unsigned char buf[4 * 4096], cmd; |
829 |
|
uint16_t u16, path_len, len; |
|
830 |
|
uint64_t u64; |
|
|
834 |
|
uint16_t old_len, new_len, len; |
831 |
835 |
|
|
832 |
|
(void) fi; |
|
833 |
|
|
|
834 |
|
xlog("write: path=%s size=%zu offset=%zd\n", path, size, offset); |
|
835 |
|
#if 0 |
|
836 |
|
for (unsigned int j = 0; j < 32; j++) |
|
837 |
|
xlog("%02hhx", in[j]); |
|
838 |
|
xlog("\n"); |
|
839 |
|
#endif |
|
|
836 |
|
xlog("rename: old=%s new=%s\n", old, new); |
840 |
837 |
|
|
841 |
|
path_len = strlen(path); |
|
842 |
|
len = 1 + 2 + 2 + 8 + path_len + size; |
|
|
838 |
|
old_len = strlen(old); |
|
839 |
|
new_len = strlen(new); |
|
840 |
|
len = 1 + 2 + old_len + 1 + new_len + 1; |
843 |
841 |
if (len > sizeof(buf)) { |
if (len > sizeof(buf)) { |
844 |
842 |
xlog(" buffer too small\n"); |
xlog(" buffer too small\n"); |
845 |
843 |
return -EIO; |
return -EIO; |
846 |
844 |
} |
} |
847 |
845 |
|
|
848 |
846 |
i = 0; |
i = 0; |
849 |
|
buf[i++] = 0x05; |
|
|
847 |
|
buf[i++] = 0x0a; |
850 |
848 |
buf[i++] = (len - 1 - 2) >> 8; |
buf[i++] = (len - 1 - 2) >> 8; |
851 |
849 |
buf[i++] = len - 1 - 2; |
buf[i++] = len - 1 - 2; |
852 |
|
u16 = htobe16(path_len); memcpy(buf + i, &u16, 2); i += 2; |
|
853 |
|
u64 = htobe64(offset); memcpy(buf + i, &u64, 8); i += 8; |
|
854 |
|
memcpy(buf + i, path, path_len); i += path_len; |
|
855 |
|
memcpy(buf + i, in, size); i += size; |
|
|
850 |
|
memcpy(buf + i, old, old_len); buf[i] = '\0'; i += old_len + 1; |
|
851 |
|
memcpy(buf + i, new, new_len); buf[i] = '\0'; i += new_len + 1; |
856 |
852 |
r = rgfs_send_recv(buf, i, buf, sizeof(buf)); |
r = rgfs_send_recv(buf, i, buf, sizeof(buf)); |
857 |
853 |
|
|
858 |
854 |
i = 4; |
i = 4; |
859 |
|
while (i < r) { |
|
|
855 |
|
if (i < r) { |
860 |
856 |
cmd = buf[i++]; |
cmd = buf[i++]; |
861 |
857 |
//xlog(" cmd=0x%02hhx\n", cmd); |
//xlog(" cmd=0x%02hhx\n", cmd); |
862 |
858 |
switch (cmd) { |
switch (cmd) { |
863 |
|
case 0x00: err = - be32toh(*(uint32_t *) (buf + i)); i += 4; break; |
|
864 |
|
case 0x01: /* block */ |
|
865 |
|
u64 = be64toh(*(uint64_t *) (buf + i)); i += 8; |
|
866 |
|
if (u64 != size) |
|
867 |
|
xlog(" wrote only %llu bytes\n", u64); |
|
868 |
|
break; |
|
|
859 |
|
case 0x00: err = - be32toh(*(uint32_t *) (buf + i)); break; |
869 |
860 |
default: xlog("Unexpected subcode 0x%02hhx!\n", cmd); exit(EXIT_FAILURE); |
default: xlog("Unexpected subcode 0x%02hhx!\n", cmd); exit(EXIT_FAILURE); |
870 |
861 |
} |
} |
871 |
862 |
} |
} |
|
... |
... |
static int rgfs_fuse_write(const char *path, const char *in, size_t size, |
875 |
866 |
return err; |
return err; |
876 |
867 |
} |
} |
877 |
868 |
|
|
878 |
|
return u64; |
|
|
869 |
|
return 0; |
879 |
870 |
} |
} |
880 |
871 |
|
|
881 |
|
static int rgfs_fuse_rename(const char *old, const char *new) |
|
|
872 |
|
static int rgfs_fuse_truncate(const char *path, off_t off) |
882 |
873 |
{ |
{ |
883 |
|
int r, err = 0, i; |
|
884 |
|
unsigned char buf[4 * 4096], cmd; |
|
885 |
|
uint16_t u16, old_len, new_len, len; |
|
|
874 |
|
int err = 0, r, i; |
|
875 |
|
uint16_t path_len, len; |
|
876 |
|
uint64_t u64; |
|
877 |
|
unsigned char buf[4096], cmd; |
886 |
878 |
|
|
887 |
|
xlog("rename: old=%s new=%s\n", old, new); |
|
|
879 |
|
xlog("truncate: path=%s off=%ld\n", path, off); |
888 |
880 |
|
|
889 |
|
old_len = strlen(old); |
|
890 |
|
new_len = strlen(new); |
|
891 |
|
len = 1 + 2 + 2 + 2 + old_len + new_len; |
|
|
881 |
|
path_len = strlen(path); |
|
882 |
|
len = 1 + 2 + 8 + path_len; |
892 |
883 |
if (len > sizeof(buf)) { |
if (len > sizeof(buf)) { |
893 |
884 |
xlog(" buffer too small\n"); |
xlog(" buffer too small\n"); |
894 |
885 |
return -EIO; |
return -EIO; |
895 |
886 |
} |
} |
896 |
887 |
|
|
897 |
888 |
i = 0; |
i = 0; |
898 |
|
buf[i++] = 0x0a; |
|
|
889 |
|
buf[i++] = 0x0b; |
899 |
890 |
buf[i++] = (len - 1 - 2) >> 8; |
buf[i++] = (len - 1 - 2) >> 8; |
900 |
891 |
buf[i++] = len - 1 - 2; |
buf[i++] = len - 1 - 2; |
901 |
|
u16 = htobe16(old_len); memcpy(buf + i, &u16, 2); i += 2; |
|
902 |
|
u16 = htobe16(new_len); memcpy(buf + i, &u16, 2); i += 2; |
|
903 |
|
memcpy(buf + i, old, old_len); i += old_len; |
|
904 |
|
memcpy(buf + i, new, new_len); i += new_len; |
|
|
892 |
|
u64 = htobe64(off); memcpy(buf + i, &u64, 8); i += 8; |
|
893 |
|
memcpy(buf + i, path, path_len); i += path_len; |
905 |
894 |
r = rgfs_send_recv(buf, i, buf, sizeof(buf)); |
r = rgfs_send_recv(buf, i, buf, sizeof(buf)); |
906 |
895 |
|
|
907 |
896 |
i = 4; |
i = 4; |
908 |
|
while (i < r) { |
|
|
897 |
|
if (i < r) { |
909 |
898 |
cmd = buf[i++]; |
cmd = buf[i++]; |
910 |
|
//xlog(" cmd=0x%02hhx\n", cmd); |
|
|
899 |
|
xlog(" cmd=0x%02hhx\n", cmd); |
911 |
900 |
switch (cmd) { |
switch (cmd) { |
912 |
|
case 0x00: err = - be32toh(*(uint32_t *) (buf + i)); i += 4; break; |
|
|
901 |
|
case 0x00: err = - be32toh(*(uint32_t *) (buf + i)); break; |
913 |
902 |
default: xlog("Unexpected subcode 0x%02hhx!\n", cmd); exit(EXIT_FAILURE); |
default: xlog("Unexpected subcode 0x%02hhx!\n", cmd); exit(EXIT_FAILURE); |
914 |
903 |
} |
} |
915 |
904 |
} |
} |
|
... |
... |
static int rgfs_fuse_utimens(const char *path, const struct timespec tv[2]) |
926 |
915 |
{ |
{ |
927 |
916 |
int r, err = 0, i; |
int r, err = 0, i; |
928 |
917 |
unsigned char buf[4 * 4096], cmd; |
unsigned char buf[4 * 4096], cmd; |
929 |
|
uint16_t u16, len; |
|
|
918 |
|
uint16_t len, path_len; |
930 |
919 |
uint64_t u64; |
uint64_t u64; |
931 |
920 |
|
|
932 |
|
// sizeof(time_t) = 8; sizeof(long) = 8 |
|
|
921 |
|
// sizeof(time_t) = 8; sizeof(long) = 8 tv[0]=atime, tv[1]=mtime |
933 |
922 |
xlog("utimens: path=%s atime=%lu.%lu mtime=%lu.%lu\n", |
xlog("utimens: path=%s atime=%lu.%lu mtime=%lu.%lu\n", |
934 |
923 |
path, tv[0].tv_sec, tv[0].tv_nsec, tv[1].tv_sec, tv[1].tv_nsec); |
path, tv[0].tv_sec, tv[0].tv_nsec, tv[1].tv_sec, tv[1].tv_nsec); |
935 |
924 |
|
|
936 |
|
len = strlen(path); |
|
937 |
|
len = 1 + 2 + 2 + len + 4 * 8; |
|
|
925 |
|
path_len = strlen(path); |
|
926 |
|
len = 1 + 2 + 4 * 8 + path_len; |
938 |
927 |
if (len > sizeof(buf)) { |
if (len > sizeof(buf)) { |
939 |
928 |
xlog(" buffer too small\n"); |
xlog(" buffer too small\n"); |
940 |
929 |
return -EIO; |
return -EIO; |
941 |
930 |
} |
} |
942 |
931 |
|
|
943 |
932 |
i = 0; |
i = 0; |
944 |
|
buf[i++] = 0x0a; |
|
|
933 |
|
buf[i++] = 0x0c; |
945 |
934 |
buf[i++] = (len - 1 - 2) >> 8; |
buf[i++] = (len - 1 - 2) >> 8; |
946 |
935 |
buf[i++] = len - 1 - 2; |
buf[i++] = len - 1 - 2; |
947 |
|
u16 = htobe16(len); memcpy(buf + i, &u16, 2); i += 2; |
|
948 |
|
memcpy(buf + i, path, len); i += len; |
|
949 |
936 |
u64 = htobe64(tv[0].tv_sec); memcpy(buf + i, &u64, 8); i += 8; |
u64 = htobe64(tv[0].tv_sec); memcpy(buf + i, &u64, 8); i += 8; |
950 |
937 |
u64 = htobe64(tv[0].tv_nsec); memcpy(buf + i, &u64, 8); i += 8; |
u64 = htobe64(tv[0].tv_nsec); memcpy(buf + i, &u64, 8); i += 8; |
951 |
938 |
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; |
952 |
939 |
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; |
|
940 |
|
memcpy(buf + i, path, path_len); i += path_len; |
953 |
941 |
r = rgfs_send_recv(buf, i, buf, sizeof(buf)); |
r = rgfs_send_recv(buf, i, buf, sizeof(buf)); |
954 |
942 |
|
|
955 |
943 |
i = 4; |
i = 4; |
956 |
|
while (i < r) { |
|
|
944 |
|
if (i < r) { |
957 |
945 |
cmd = buf[i++]; |
cmd = buf[i++]; |
958 |
946 |
//xlog(" cmd=0x%02hhx\n", cmd); |
//xlog(" cmd=0x%02hhx\n", cmd); |
959 |
947 |
switch (cmd) { |
switch (cmd) { |
960 |
|
case 0x00: err = - be32toh(*(uint32_t *) (buf + i)); i += 4; break; |
|
|
948 |
|
case 0x00: err = - be32toh(*(uint32_t *) (buf + i)); break; |
961 |
949 |
default: xlog("Unexpected subcode 0x%02hhx!\n", cmd); exit(EXIT_FAILURE); |
default: xlog("Unexpected subcode 0x%02hhx!\n", cmd); exit(EXIT_FAILURE); |
962 |
950 |
} |
} |
963 |
951 |
} |
} |