51,9 → 51,7 |
#include <sys/mman.h> |
#include <byteorder.h> |
|
#define BLOCK_SIZE 1024 // FIXME |
#define RD_BASE 1024 // FIXME |
#define RD_READ_BLOCK (RD_BASE + 1) |
#define TMPFS_BLOCK_SIZE 1024 |
|
struct rdentry { |
uint8_t type; |
61,44 → 59,6 |
} __attribute__((packed)); |
|
static bool |
tmpfs_blockread(int phone, void *buffer, size_t *bufpos, size_t *buflen, |
size_t *pos, void *dst, size_t size) |
{ |
size_t offset = 0; |
size_t left = size; |
|
while (left > 0) { |
size_t rd; |
|
if (*bufpos + left < *buflen) |
rd = left; |
else |
rd = *buflen - *bufpos; |
|
if (rd > 0) { |
memcpy(dst + offset, buffer + *bufpos, rd); |
offset += rd; |
*bufpos += rd; |
*pos += rd; |
left -= rd; |
} |
|
if (*bufpos == *buflen) { |
ipcarg_t retval; |
int rc = async_req_2_1(phone, RD_READ_BLOCK, |
*pos / BLOCK_SIZE, BLOCK_SIZE, &retval); |
if ((rc != EOK) || (retval != EOK)) |
return false; |
|
*bufpos = 0; |
*buflen = BLOCK_SIZE; |
} |
} |
|
return true; |
} |
|
static bool |
tmpfs_restore_recursion(int phone, void *block, size_t *bufpos, size_t *buflen, |
size_t *pos, tmpfs_dentry_t *parent) |
{ |
110,8 → 70,8 |
tmpfs_dentry_t *node; |
uint32_t size; |
|
if (!tmpfs_blockread(phone, block, bufpos, buflen, pos, &entry, |
sizeof(entry))) |
if (!libfs_blockread(phone, block, bufpos, buflen, pos, &entry, |
sizeof(entry), TMPFS_BLOCK_SIZE)) |
return false; |
|
entry.len = uint32_t_le2host(entry.len); |
130,8 → 90,8 |
return false; |
} |
|
if (!tmpfs_blockread(phone, block, bufpos, buflen, pos, |
fname, entry.len)) { |
if (!libfs_blockread(phone, block, bufpos, buflen, pos, |
fname, entry.len, TMPFS_BLOCK_SIZE)) { |
ops->destroy((void *) node); |
free(fname); |
return false; |
145,8 → 105,8 |
} |
free(fname); |
|
if (!tmpfs_blockread(phone, block, bufpos, buflen, pos, |
&size, sizeof(size))) |
if (!libfs_blockread(phone, block, bufpos, buflen, pos, |
&size, sizeof(size), TMPFS_BLOCK_SIZE)) |
return false; |
|
size = uint32_t_le2host(size); |
156,8 → 116,8 |
return false; |
|
node->size = size; |
if (!tmpfs_blockread(phone, block, bufpos, buflen, pos, |
node->data, size)) |
if (!libfs_blockread(phone, block, bufpos, buflen, pos, |
node->data, size, TMPFS_BLOCK_SIZE)) |
return false; |
|
break; |
172,8 → 132,8 |
return false; |
} |
|
if (!tmpfs_blockread(phone, block, bufpos, buflen, pos, |
fname, entry.len)) { |
if (!libfs_blockread(phone, block, bufpos, buflen, pos, |
fname, entry.len, TMPFS_BLOCK_SIZE)) { |
ops->destroy((void *) node); |
free(fname); |
return false; |
204,7 → 164,7 |
{ |
libfs_ops_t *ops = &tmpfs_libfs_ops; |
|
void *block = mmap(NULL, BLOCK_SIZE, |
void *block = mmap(NULL, TMPFS_BLOCK_SIZE, |
PROTO_READ | PROTO_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, 0, 0); |
|
if (block == NULL) |
214,7 → 174,7 |
DEVMAP_CONNECT_TO_DEVICE, dev); |
|
if (phone < 0) { |
munmap(block, BLOCK_SIZE); |
munmap(block, TMPFS_BLOCK_SIZE); |
return false; |
} |
|
227,7 → 187,8 |
size_t pos = 0; |
|
char tag[6]; |
if (!tmpfs_blockread(phone, block, &bufpos, &buflen, &pos, tag, 5)) |
if (!libfs_blockread(phone, block, &bufpos, &buflen, &pos, tag, 5, |
TMPFS_BLOCK_SIZE)) |
goto error; |
|
tag[5] = 0; |
239,12 → 200,12 |
goto error; |
|
ipc_hangup(phone); |
munmap(block, BLOCK_SIZE); |
munmap(block, TMPFS_BLOCK_SIZE); |
return true; |
|
error: |
ipc_hangup(phone); |
munmap(block, BLOCK_SIZE); |
munmap(block, TMPFS_BLOCK_SIZE); |
return false; |
} |
|