On Mon, Oct 10, 2022 at 08:43:58AM +0200, Ahmad Fatoum wrote: > +#include <common.h> > +#include <command.h> > +#include <fs.h> > +#include <linux/stat.h> > +#include <errno.h> > +#include <malloc.h> > +#include <getopt.h> > +#include <stringlist.h> > + > +static int do_stat(int argc, char *argv[]) > +{ > + int (*statfn)(const char *, struct stat *) = stat; > + int ret, opt, exitcode = 0; > + char **filename; > + struct stat st; > + > + while((opt = getopt(argc, argv, "L")) > 0) { > + switch(opt) { > + case 'L': > + statfn = lstat; > + break; That's the wrong way round. You have to use lstat() by default and stat() when -L is given. > +void stat_print(const char *filename, const struct stat *st) > +{ > + struct block_device *bdev = NULL; > + struct fs_device_d *fdev; > + struct cdev *cdev = NULL; > + const char *type = NULL; > + char modestr[11]; > + > + mkmodestr(st->st_mode, modestr); > + > + switch (st->st_mode & S_IFMT) { > + case S_IFDIR: type = "directory"; break; > + case S_IFBLK: type = "block special file"; break; > + case S_IFCHR: type = "character special file"; break; > + case S_IFIFO: type = "fifo"; break; > + case S_IFLNK: type = "symbolic link"; break; > + case S_IFSOCK: type = "socket"; break; > + case S_IFREG: type = "regular file"; break; > + } > + > + printf(" File: %s\n", filename); > + > + if (st->st_mode & S_IFCHR) { > + const char *devicefile; > + > + devicefile = devpath_to_name(filename); This doesn't work really well. I think it's ok this time because there's enough prior art, but we really need something better. For example "stat /dev/mmc0" works, but "stat dev/mmc0" does not. You could improve this a bit by calling canonicalize_path() on filename. To solve this issue we could add a struct cdev * to struct filep. Sascha -- Pengutronix e.K. | | Steuerwalder Str. 21 | http://www.pengutronix.de/ | 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |