apps/examples/stat: Improve decoding of file mode.

This commit is contained in:
Gregory Nutt 2017-02-13 16:19:55 -06:00
parent 1b297d057e
commit 78f92746c4

View File

@ -109,48 +109,71 @@ static void endusage(void)
static void dump_stat(FAR struct stat *buf) static void dump_stat(FAR struct stat *buf)
{ {
FAR const char *typename; char details[] = "----------";
if (S_ISLNK(buf->st_mode)) if (S_ISLNK(buf->st_mode))
{ {
typename = "Link"; details[0] = 'l'; /* Takes precedence over type of the target */
} }
else if (S_ISCHR(buf->st_mode)) else if (S_ISCHR(buf->st_mode))
{ {
typename = "Character driver"; details[0] = 'c';
} }
else if (S_ISDIR(buf->st_mode)) else if (S_ISDIR(buf->st_mode))
{ {
typename = "Directory"; details[0] = 'd';
} }
else if (S_ISBLK(buf->st_mode)) else if (S_ISBLK(buf->st_mode))
{ {
typename = "Block driver"; details[0] = 'b';
} }
else if (S_ISREG(buf->st_mode)) else if (!S_ISREG(buf->st_mode))
{ {
typename = "Regular file"; details[0] = '?';
} }
else if (S_ISMQ(buf->st_mode))
if ((buf->st_mode & S_IRUSR) != 0)
{ {
typename = "Message queue"; details[1]='r';
} }
else if (S_ISSEM(buf->st_mode))
if ((buf->st_mode & S_IWUSR) != 0)
{ {
typename = "Named semaphore"; details[2]='w';
} }
else if (S_ISSHM(buf->st_mode))
if ((buf->st_mode & S_IXUSR) != 0)
{ {
typename = "Shared memory"; details[3]='x';
} }
else
if ((buf->st_mode & S_IRGRP) != 0)
{ {
typename = "Unknown file type"; details[4]='r';
}
if ((buf->st_mode & S_IWGRP) != 0)
{
details[5]='w';
}
if ((buf->st_mode & S_IXGRP) != 0)
{
details[6]='x';
}
if ((buf->st_mode & S_IROTH) != 0)
{
details[7]='r';
}
if ((buf->st_mode & S_IWOTH) != 0)
{
details[8]='w';
} }
printf("\nstat:\n"); printf("\nstat:\n");
printf(" st_mode: %04x\n", buf->st_mode); printf(" st_mode: %04x %s\n", buf->st_mode, details);
printf(" %s\n", typename);
printf(" st_size: %llu\n", (unsigned long long)buf->st_size); printf(" st_size: %llu\n", (unsigned long long)buf->st_size);
printf(" st_blksize: %lu\n", (unsigned long)buf->st_blksize); printf(" st_blksize: %lu\n", (unsigned long)buf->st_blksize);
printf(" st_blocks: %lu\n", (unsigned long)buf->st_blocks); printf(" st_blocks: %lu\n", (unsigned long)buf->st_blocks);