kboot: Convert from getdents to getdents64
Linux 2.4 introduced getdents64. Switch to using it because aarch64 doesn't have getdents as that syscall was obsoleted before that port was created. Sponsored by: Netflix
This commit is contained in:
parent
065cbc7707
commit
3a1b966ae0
@ -1,6 +1,6 @@
|
||||
#define SYS_close 3
|
||||
#define SYS_dup 32
|
||||
#define SYS_getdents 78
|
||||
#define SYS_getdents64 217
|
||||
#define SYS_getpid 39
|
||||
#define SYS_gettimeofday 96
|
||||
#define SYS_kexec_load 246
|
||||
|
@ -1,7 +1,7 @@
|
||||
#define SYS_close 6
|
||||
#define SYS_dup 41
|
||||
#define SYS_fstat 108
|
||||
#define SYS_getdents 141
|
||||
#define SYS_getdents64 202
|
||||
#define SYS_getpid 20
|
||||
#define SYS_gettimeofday 78
|
||||
#define SYS_kexec_load 268
|
||||
|
@ -131,13 +131,32 @@ struct host_kexec_segment {
|
||||
int memsz;
|
||||
};
|
||||
|
||||
struct host_dirent64 {
|
||||
uint64_t d_ino; /* 64-bit inode number */
|
||||
int64_t d_off; /* 64-bit offset to next structure */
|
||||
unsigned short d_reclen; /* Size of this dirent */
|
||||
unsigned char d_type; /* File type */
|
||||
char d_name[]; /* Filename (null-terminated) */
|
||||
};
|
||||
|
||||
/* d_type values */
|
||||
#define HOST_DT_UNKNOWN 0
|
||||
#define HOST_DT_FIFO 1
|
||||
#define HOST_DT_CHR 2
|
||||
#define HOST_DT_DIR 4
|
||||
#define HOST_DT_BLK 6
|
||||
#define HOST_DT_REG 8
|
||||
#define HOST_DT_LNK 10
|
||||
#define HOST_DT_SOCK 12
|
||||
#define HOST_DT_WHT 14
|
||||
|
||||
/*
|
||||
* System Calls
|
||||
*/
|
||||
int host_close(int fd);
|
||||
int host_dup(int fd);
|
||||
int host_fstat(int fd, struct host_kstat *sb);
|
||||
int host_getdents(int fd, void *dirp, int count);
|
||||
int host_getdents64(int fd, void *dirp, int count);
|
||||
int host_getpid(void);
|
||||
int host_gettimeofday(struct host_timeval *a, void *b);
|
||||
int host_kexec_load(unsigned long entry, unsigned long nsegs, struct host_kexec_segment *segs, unsigned long flags);
|
||||
|
@ -26,9 +26,9 @@ host_fstat(int fd, struct host_kstat *sb)
|
||||
}
|
||||
|
||||
int
|
||||
host_getdents(int fd, void *dirp, int count)
|
||||
host_getdents64(int fd, void *dirp, int count)
|
||||
{
|
||||
return host_syscall(SYS_getdents, fd, (uintptr_t)dirp, count);
|
||||
return host_syscall(SYS_getdents64, fd, (uintptr_t)dirp, count);
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -40,30 +40,23 @@ add_node_to_fdt(void *buffer, const char *path, int fdt_offset)
|
||||
void *propbuf;
|
||||
ssize_t proplen;
|
||||
|
||||
struct host_dent {
|
||||
unsigned long d_fileno;
|
||||
unsigned long d_off;
|
||||
unsigned short d_reclen;
|
||||
char d_name[];
|
||||
/* uint8_t d_type; */
|
||||
};
|
||||
char dents[2048];
|
||||
struct host_dent *dent;
|
||||
struct host_dirent64 *dent;
|
||||
int d_type;
|
||||
|
||||
fd = host_open(path, O_RDONLY, 0);
|
||||
while (1) {
|
||||
dentsize = host_getdents(fd, dents, sizeof(dents));
|
||||
dentsize = host_getdents64(fd, dents, sizeof(dents));
|
||||
if (dentsize <= 0)
|
||||
break;
|
||||
for (dent = (struct host_dent *)dents;
|
||||
for (dent = (struct host_dirent64 *)dents;
|
||||
(char *)dent < dents + dentsize;
|
||||
dent = (struct host_dent *)((void *)dent + dent->d_reclen)) {
|
||||
dent = (struct host_dirent64 *)((void *)dent + dent->d_reclen)) {
|
||||
sprintf(subpath, "%s/%s", path, dent->d_name);
|
||||
if (strcmp(dent->d_name, ".") == 0 ||
|
||||
strcmp(dent->d_name, "..") == 0)
|
||||
continue;
|
||||
d_type = *((char *)(dent) + dent->d_reclen - 1);
|
||||
d_type = dent->d_type;
|
||||
if (d_type == 4 /* DT_DIR */) {
|
||||
child_offset = fdt_add_subnode(buffer, fdt_offset,
|
||||
dent->d_name);
|
||||
@ -72,7 +65,6 @@ add_node_to_fdt(void *buffer, const char *path, int fdt_offset)
|
||||
child_offset, path, dent->d_name);
|
||||
continue;
|
||||
}
|
||||
|
||||
add_node_to_fdt(buffer, subpath, child_offset);
|
||||
} else {
|
||||
propbuf = malloc(1024);
|
||||
|
Loading…
x
Reference in New Issue
Block a user