From: Gene Cumm <gene.cumm at gmail.com> COM32 API: restructure DIR to include a dirent to eliminate the need for alloc()/free() of dirents Signed-off-by: Gene Cumm <gene.cumm at gmail.com> --- Counted incorrectly. Depends on previous patches. diff --git a/com32/include/dirent.h b/com32/include/dirent.h index 5161828..a544050 100644 --- a/com32/include/dirent.h +++ b/com32/include/dirent.h @@ -29,6 +29,7 @@ typedef struct { uint16_t dd_fd; size_t dd_sect; char dd_name[NAME_MAX + 1]; /* directory */ + struct dirent dd_de; } DIR; __extern DIR *opendir(const char *); diff --git a/com32/lib/readdir.c b/com32/lib/readdir.c index 353b61b..c6d991c 100644 --- a/com32/lib/readdir.c +++ b/com32/lib/readdir.c @@ -33,21 +33,16 @@ struct dirent *readdir(DIR *dir) /* Don't do this as we won't be able to rewind. dir->dd_fd = regs.esi.w[0]; /* Shouldn't be needed? */ if ((!(regs.eflags.l & EFLAGS_CF)) && (regs.esi.w[0] != 0)) { - newde = calloc(1, sizeof(newde)); - if (newde != NULL) { - strcpy(newde->d_name, __com32.cs_bounce); - newde->d_mode = regs.edx.w[0]; - newde->d_type = (newde->d_mode & S_IFMT) >> 12; - newde->d_size = regs.eax.l; - newde->d_ino = regs.ebx.l; - dir->dd_stat = 1; - } else { - dir->dd_stat = -2; - errno = ENOMEM; - } + newde = dir->dd_de; + strcpy(newde->d_name, __com32.cs_bounce); + newde->d_mode = regs.edx.w[0]; + newde->d_type = (newde->d_mode & S_IFMT) >> 12; + newde->d_size = regs.eax.l; + newde->d_ino = regs.ebx.l; + dir->dd_stat = 1; } else { dir->dd_stat = -1; - errno = EIO; /* Is this the right number? */ + errno = EIO; /* FIXME: Is this the right number? */ } } else { errno = EBADF;