File rgfs.c changed (mode: 100644) (index a34764c..f832806) |
... |
... |
static void xlog(char *format, ...) |
54 |
54 |
|
|
55 |
55 |
gettimeofday(&tv, NULL); |
gettimeofday(&tv, NULL); |
56 |
56 |
len = snprintf(line, sizeof(line), |
len = snprintf(line, sizeof(line), |
57 |
|
"%ld.%03ld ", tv.tv_sec, tv.tv_usec); |
|
|
57 |
|
"%ld.%06ld ", tv.tv_sec, tv.tv_usec); |
58 |
58 |
|
|
59 |
59 |
va_start(ap, format); |
va_start(ap, format); |
60 |
60 |
len2 = vsnprintf(line + len, sizeof(line) - len, format, ap); |
len2 = vsnprintf(line + len, sizeof(line) - len, format, ap); |
|
... |
... |
static int rgfs_recv_hl(const char *op, void *buf, size_t buf_size) |
384 |
384 |
exit(EXIT_FAILURE); |
exit(EXIT_FAILURE); |
385 |
385 |
} |
} |
386 |
386 |
r = rgfs_recv(buf + off, buf_size - off); |
r = rgfs_recv(buf + off, buf_size - off); |
387 |
|
if (r <= 0) |
|
|
387 |
|
if (r < 0) |
388 |
388 |
return r; |
return r; |
|
389 |
|
if (r == 0) |
|
390 |
|
return off; |
389 |
391 |
|
|
390 |
392 |
off += r; |
off += r; |
391 |
393 |
if (off >= 4) |
if (off >= 4) |
|
... |
... |
static int rgfs_fuse_link(const char *target, const char *link) |
1082 |
1084 |
return err; |
return err; |
1083 |
1085 |
} |
} |
1084 |
1086 |
|
|
|
1087 |
|
static int rgfs_fuse_chown(const char *path, uid_t uid, gid_t gid) |
|
1088 |
|
{ |
|
1089 |
|
int err = 0, r, i; |
|
1090 |
|
uint16_t path_len, len; |
|
1091 |
|
unsigned char buf[4 * 4096], cmd; |
|
1092 |
|
uint32_t u32; |
|
1093 |
|
|
|
1094 |
|
xlog("chown: path=%s uid=%u gid=%u\n", path, uid, gid); |
|
1095 |
|
|
|
1096 |
|
path_len = strlen(path); |
|
1097 |
|
len = 1 + 2 + 4 + 4 + path_len; |
|
1098 |
|
if (len > sizeof(buf)) { |
|
1099 |
|
xlog(" buffer too small\n"); |
|
1100 |
|
return -EIO; |
|
1101 |
|
} |
|
1102 |
|
|
|
1103 |
|
i = 0; |
|
1104 |
|
buf[i++] = 0x10; |
|
1105 |
|
buf[i++] = (len - 1 - 2) >> 8; |
|
1106 |
|
buf[i++] = len - 1 - 2; |
|
1107 |
|
u32 = htobe32(uid); memcpy(buf + i, &u32, 4); i += 4; |
|
1108 |
|
u32 = htobe32(gid); memcpy(buf + i, &u32, 4); i += 4; |
|
1109 |
|
memcpy(buf + i, path, path_len); i += path_len; |
|
1110 |
|
r = rgfs_send_recv("create", buf, i, buf, sizeof(buf)); |
|
1111 |
|
|
|
1112 |
|
i = 4; |
|
1113 |
|
if (i < r) { |
|
1114 |
|
cmd = buf[i++]; |
|
1115 |
|
//xlog(" cmd=0x%02hhx\n", cmd); |
|
1116 |
|
switch (cmd) { |
|
1117 |
|
case 0x00: err = - be32toh(*(uint32_t *) (buf + i)); break; |
|
1118 |
|
default: xlog("Unexpected subcode 0x%02hhx!\n", cmd); exit(EXIT_FAILURE); |
|
1119 |
|
} |
|
1120 |
|
} |
|
1121 |
|
|
|
1122 |
|
if (err < 0) |
|
1123 |
|
xlog(" server returned error %d!\n", err); |
|
1124 |
|
|
|
1125 |
|
return 0; |
|
1126 |
|
} |
|
1127 |
|
|
1085 |
1128 |
static const struct fuse_operations fuse_rgfs = { |
static const struct fuse_operations fuse_rgfs = { |
1086 |
1129 |
.getattr = rgfs_fuse_getattr, |
.getattr = rgfs_fuse_getattr, |
1087 |
1130 |
.readdir = rgfs_fuse_readdir, |
.readdir = rgfs_fuse_readdir, |
|
... |
... |
static const struct fuse_operations fuse_rgfs = { |
1097 |
1140 |
.utimens = rgfs_fuse_utimens, |
.utimens = rgfs_fuse_utimens, |
1098 |
1141 |
.readlink = rgfs_fuse_readlink, |
.readlink = rgfs_fuse_readlink, |
1099 |
1142 |
.symlink = rgfs_fuse_symlink, |
.symlink = rgfs_fuse_symlink, |
1100 |
|
.link = rgfs_fuse_link |
|
|
1143 |
|
.link = rgfs_fuse_link, |
|
1144 |
|
.chown = rgfs_fuse_chown |
1101 |
1145 |
}; |
}; |
1102 |
1146 |
|
|
1103 |
1147 |
int main(int argc, char *argv[]) |
int main(int argc, char *argv[]) |