blob: a2b03df21aa149628a413fdb3e0b6174fe73b5ce (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
#include <init/stdlib.h>
#include <shared/syscalls.h>
#include <stdint.h>
extern int tty_fd;
static int oct_parse(char *str, size_t len);
void tar_driver(void *base) {
// iterate over all sectors, printing filenames
while (0 == memcmp(base + 257, "ustar", 5)) {
int size = oct_parse(base + 124, 12);
_syscall_write(tty_fd, base, 100);
_syscall_write(tty_fd, " ", 1);
base += 512; // skip metadata sector
base += (size + 511) & ~511; // skip file (size rounded up to 512)
// TODO might pagefault if the last sector was at a page boundary
}
_syscall_write(tty_fd, "done.", 5);
}
static int oct_parse(char *str, size_t len) {
int res = 0;
for (size_t i = 0; i < len; i++) {
res *= 8;
res += str[i] - '0'; // no format checking
}
return res;
}
|