Re: [PATCH] Support regular file type in _swistat for ARM
Jeff Johnston via Newlib <[email protected]>
| Newsgroups | gmane.comp.lib.newlib |
|---|---|
| Message-ID | <CAOox84tDn9+v-+V9hDbOKbxoDVusqKmXceXDv=Y8tJC=WJD+7g@mail.gmail.com> |
cc'ing Richard. On Thu, Jun 4, 2020 at 5:53 AM Joe Ramsay <[email protected]> wrote: > Hi! > > Previously, the implementation of _swistat() for ARM assumed all files > to be of type character device. This change adds support for stat-ing > regular files. Tested with arm-none-eabi > --- > libgloss/arm/syscalls.c | 43 +++++++++++++++++++++++++++++-------------- > 1 file changed, 29 insertions(+), 14 deletions(-) > > diff --git a/libgloss/arm/syscalls.c b/libgloss/arm/syscalls.c > index fc394f9..b4bd329 100644 > --- a/libgloss/arm/syscalls.c > +++ b/libgloss/arm/syscalls.c > @@ -728,33 +728,48 @@ _sbrk (ptrdiff_t incr) > int > _swistat (int fd, struct stat * st) > { > - struct fdent *pfd; > - int res; > - > - pfd = findslot (fd); > + struct fdent *pfd = findslot (fd); > if (pfd == NULL) > { > errno = EBADF; > return -1; > } > > - /* Always assume a character device, > - with 1024 byte blocks. */ > - st->st_mode |= S_IFCHR; > - st->st_blksize = 1024; > + int isCharDevice, flen; > #ifdef ARM_RDI_MONITOR > - res = checkerror (do_AngelSWI (AngelSWI_Reason_FLen, &pfd->handle)); > + isCharDevice = checkerror (do_AngelSWI (AngelSWI_Reason_IsTTY, > &pfd->handle)); > + flen = checkerror (do_AngelSWI (AngelSWI_Reason_FLen, &pfd->handle)); > #else > asm ("mov r0, %2; swi %a1; mov %0, r0" > - : "=r" (res) > + : "=r" (isCharDevice) > + : "i" (SWI_IsTTY), "r" (pfd->handle) > + : "r0"); > + checkerror(isCharDevice); > + asm ("mov r0, %2; swi %a1; mov %0, r0" > + : "=r" (flen) > : "i" (SWI_Flen), "r" (pfd->handle) > : "r0"); > - checkerror (res); > + checkerror(flen); > #endif > - if (res == -1) > + > + if (isCharDevice != 0 && isCharDevice != 1) > + return error(-1); > + > + if (flen == -1) > return -1; > - /* Return the file size. */ > - st->st_size = res; > + > + st->st_size = flen; > + /* Always assume 1024 byte blocks */ > + st->st_blksize = 1024; > + > + if (isCharDevice) > + st->st_mode |= S_IFCHR; > + else > + { > + st->st_mode |= S_IFREG; > + st->st_blocks = (flen + 1023) / 1024; > + } > + > return 0; > } > > -- > 2.7.4 > >