Revision fac4f111 hw/virtio-9p.c
b/hw/virtio-9p.c | ||
---|---|---|
21 | 21 |
int dotu = 1; |
22 | 22 |
int debug_9p_pdu; |
23 | 23 |
|
24 |
enum { |
|
25 |
Oread = 0x00, |
|
26 |
Owrite = 0x01, |
|
27 |
Ordwr = 0x02, |
|
28 |
Oexec = 0x03, |
|
29 |
Oexcl = 0x04, |
|
30 |
Otrunc = 0x10, |
|
31 |
Orexec = 0x20, |
|
32 |
Orclose = 0x40, |
|
33 |
Oappend = 0x80, |
|
34 |
}; |
|
35 |
|
|
36 |
static int omode_to_uflags(int8_t mode) |
|
37 |
{ |
|
38 |
int ret = 0; |
|
39 |
|
|
40 |
switch (mode & 3) { |
|
41 |
case Oread: |
|
42 |
ret = O_RDONLY; |
|
43 |
break; |
|
44 |
case Ordwr: |
|
45 |
ret = O_RDWR; |
|
46 |
break; |
|
47 |
case Owrite: |
|
48 |
ret = O_WRONLY; |
|
49 |
break; |
|
50 |
case Oexec: |
|
51 |
ret = O_RDONLY; |
|
52 |
break; |
|
53 |
} |
|
54 |
|
|
55 |
if (mode & Otrunc) { |
|
56 |
ret |= O_TRUNC; |
|
57 |
} |
|
58 |
|
|
59 |
if (mode & Oappend) { |
|
60 |
ret |= O_APPEND; |
|
61 |
} |
|
62 |
|
|
63 |
if (mode & Oexcl) { |
|
64 |
ret |= O_EXCL; |
|
65 |
} |
|
66 |
|
|
67 |
return ret; |
|
68 |
} |
|
69 |
|
|
24 | 70 |
static int v9fs_do_lstat(V9fsState *s, V9fsString *path, struct stat *stbuf) |
25 | 71 |
{ |
26 | 72 |
return s->ops->lstat(&s->ctx, path->data, stbuf); |
... | ... | |
995 | 1041 |
v9fs_string_free(&aname); |
996 | 1042 |
} |
997 | 1043 |
|
998 |
typedef struct V9fsStatState { |
|
999 |
V9fsPDU *pdu; |
|
1000 |
size_t offset; |
|
1001 |
V9fsStat v9stat; |
|
1002 |
V9fsFidState *fidp; |
|
1003 |
struct stat stbuf; |
|
1004 |
} V9fsStatState; |
|
1005 |
|
|
1006 | 1044 |
static void v9fs_stat_post_lstat(V9fsState *s, V9fsStatState *vs, int err) |
1007 | 1045 |
{ |
1008 | 1046 |
if (err == -1) { |
... | ... | |
1053 | 1091 |
qemu_free(vs); |
1054 | 1092 |
} |
1055 | 1093 |
|
1056 |
typedef struct V9fsWalkState { |
|
1057 |
V9fsPDU *pdu; |
|
1058 |
size_t offset; |
|
1059 |
int16_t nwnames; |
|
1060 |
int name_idx; |
|
1061 |
V9fsQID *qids; |
|
1062 |
V9fsFidState *fidp; |
|
1063 |
V9fsFidState *newfidp; |
|
1064 |
V9fsString path; |
|
1065 |
V9fsString *wnames; |
|
1066 |
struct stat stbuf; |
|
1067 |
} V9fsWalkState; |
|
1068 |
|
|
1069 | 1094 |
static void v9fs_walk_complete(V9fsState *s, V9fsWalkState *vs, int err) |
1070 | 1095 |
{ |
1071 | 1096 |
complete_pdu(s, vs->pdu, err); |
... | ... | |
1229 | 1254 |
v9fs_walk_complete(s, vs, err); |
1230 | 1255 |
} |
1231 | 1256 |
|
1232 |
typedef struct V9fsOpenState { |
|
1233 |
V9fsPDU *pdu; |
|
1234 |
size_t offset; |
|
1235 |
int8_t mode; |
|
1236 |
V9fsFidState *fidp; |
|
1237 |
V9fsQID qid; |
|
1238 |
struct stat stbuf; |
|
1239 |
|
|
1240 |
} V9fsOpenState; |
|
1241 |
|
|
1242 |
enum { |
|
1243 |
Oread = 0x00, |
|
1244 |
Owrite = 0x01, |
|
1245 |
Ordwr = 0x02, |
|
1246 |
Oexec = 0x03, |
|
1247 |
Oexcl = 0x04, |
|
1248 |
Otrunc = 0x10, |
|
1249 |
Orexec = 0x20, |
|
1250 |
Orclose = 0x40, |
|
1251 |
Oappend = 0x80, |
|
1252 |
}; |
|
1253 |
|
|
1254 |
static int omode_to_uflags(int8_t mode) |
|
1255 |
{ |
|
1256 |
int ret = 0; |
|
1257 |
|
|
1258 |
switch (mode & 3) { |
|
1259 |
case Oread: |
|
1260 |
ret = O_RDONLY; |
|
1261 |
break; |
|
1262 |
case Ordwr: |
|
1263 |
ret = O_RDWR; |
|
1264 |
break; |
|
1265 |
case Owrite: |
|
1266 |
ret = O_WRONLY; |
|
1267 |
break; |
|
1268 |
case Oexec: |
|
1269 |
ret = O_RDONLY; |
|
1270 |
break; |
|
1271 |
} |
|
1272 |
|
|
1273 |
if (mode & Otrunc) { |
|
1274 |
ret |= O_TRUNC; |
|
1275 |
} |
|
1276 |
|
|
1277 |
if (mode & Oappend) { |
|
1278 |
ret |= O_APPEND; |
|
1279 |
} |
|
1280 |
|
|
1281 |
if (mode & Oexcl) { |
|
1282 |
ret |= O_EXCL; |
|
1283 |
} |
|
1284 |
|
|
1285 |
return ret; |
|
1286 |
} |
|
1287 |
|
|
1288 | 1257 |
static void v9fs_open_post_opendir(V9fsState *s, V9fsOpenState *vs, int err) |
1289 | 1258 |
{ |
1290 | 1259 |
if (vs->fidp->dir == NULL) { |
... | ... | |
1387 | 1356 |
complete_pdu(s, pdu, err); |
1388 | 1357 |
} |
1389 | 1358 |
|
1390 |
typedef struct V9fsReadState { |
|
1391 |
V9fsPDU *pdu; |
|
1392 |
size_t offset; |
|
1393 |
int32_t count; |
|
1394 |
int32_t total; |
|
1395 |
int64_t off; |
|
1396 |
V9fsFidState *fidp; |
|
1397 |
struct iovec iov[128]; /* FIXME: bad, bad, bad */ |
|
1398 |
struct iovec *sg; |
|
1399 |
off_t dir_pos; |
|
1400 |
struct dirent *dent; |
|
1401 |
struct stat stbuf; |
|
1402 |
V9fsString name; |
|
1403 |
V9fsStat v9stat; |
|
1404 |
int32_t len; |
|
1405 |
int32_t cnt; |
|
1406 |
int32_t max_count; |
|
1407 |
} V9fsReadState; |
|
1408 |
|
|
1409 | 1359 |
static void v9fs_read_post_readdir(V9fsState *, V9fsReadState *, ssize_t); |
1410 | 1360 |
|
1411 | 1361 |
static void v9fs_read_post_seekdir(V9fsState *s, V9fsReadState *vs, ssize_t err) |
... | ... | |
1593 | 1543 |
qemu_free(vs); |
1594 | 1544 |
} |
1595 | 1545 |
|
1596 |
typedef struct V9fsWriteState { |
|
1597 |
V9fsPDU *pdu; |
|
1598 |
size_t offset; |
|
1599 |
int32_t len; |
|
1600 |
int32_t count; |
|
1601 |
int32_t total; |
|
1602 |
int64_t off; |
|
1603 |
V9fsFidState *fidp; |
|
1604 |
struct iovec iov[128]; /* FIXME: bad, bad, bad */ |
|
1605 |
struct iovec *sg; |
|
1606 |
int cnt; |
|
1607 |
} V9fsWriteState; |
|
1608 |
|
|
1609 | 1546 |
static void v9fs_write_post_writev(V9fsState *s, V9fsWriteState *vs, |
1610 | 1547 |
ssize_t err) |
1611 | 1548 |
{ |
... | ... | |
1702 | 1639 |
qemu_free(vs); |
1703 | 1640 |
} |
1704 | 1641 |
|
1705 |
typedef struct V9fsCreateState { |
|
1706 |
V9fsPDU *pdu; |
|
1707 |
size_t offset; |
|
1708 |
V9fsFidState *fidp; |
|
1709 |
V9fsQID qid; |
|
1710 |
int32_t perm; |
|
1711 |
int8_t mode; |
|
1712 |
struct stat stbuf; |
|
1713 |
V9fsString name; |
|
1714 |
V9fsString extension; |
|
1715 |
V9fsString fullname; |
|
1716 |
} V9fsCreateState; |
|
1717 |
|
|
1718 | 1642 |
static void v9fs_post_create(V9fsState *s, V9fsCreateState *vs, int err) |
1719 | 1643 |
{ |
1720 | 1644 |
if (err == 0) { |
... | ... | |
1934 | 1858 |
complete_pdu(s, pdu, 7); |
1935 | 1859 |
} |
1936 | 1860 |
|
1937 |
typedef struct V9fsRemoveState { |
|
1938 |
V9fsPDU *pdu; |
|
1939 |
size_t offset; |
|
1940 |
V9fsFidState *fidp; |
|
1941 |
} V9fsRemoveState; |
|
1942 |
|
|
1943 | 1861 |
static void v9fs_remove_post_remove(V9fsState *s, V9fsRemoveState *vs, |
1944 | 1862 |
int err) |
1945 | 1863 |
{ |
... | ... | |
1982 | 1900 |
qemu_free(vs); |
1983 | 1901 |
} |
1984 | 1902 |
|
1985 |
typedef struct V9fsWstatState |
|
1986 |
{ |
|
1987 |
V9fsPDU *pdu; |
|
1988 |
size_t offset; |
|
1989 |
int16_t unused; |
|
1990 |
V9fsStat v9stat; |
|
1991 |
V9fsFidState *fidp; |
|
1992 |
struct stat stbuf; |
|
1993 |
V9fsString nname; |
|
1994 |
} V9fsWstatState; |
|
1995 |
|
|
1996 | 1903 |
static void v9fs_wstat_post_truncate(V9fsState *s, V9fsWstatState *vs, int err) |
1997 | 1904 |
{ |
1998 | 1905 |
if (err < 0) { |
Also available in: Unified diff