I have the below code only a part of it is shown here and I am checking if a the type of file.
struct stat *buf /* just to show the type buf is*/
switch (buf.st_mode & S_IFMT) {
case S_IFBLK: printf(" block device\n"); break;
case S_IFCHR: printf(" character device\n"); break;
case S_IFDIR: printf(" directory\n"); break;
case S_IFIFO: printf(" FIFO/pipe\n"); break;
case S_IFLNK: printf(" symlink\n"); break;
case S_IFREG: printf(" regular file\n"); break;
case S_IFSOCK: printf(" socket\n"); break;
default: printf(" unknown?\n"); break;
}
The problem: value of st_mode
obtained when I do a printf("\nMode: %d\n",buf.st_mode);
the result is 33188.
I tested my program with a regular file type and a symbolic link. In both cases the output was "regular file" i.e the symbolic link case is failing and I fail to understand why?
From the stat (2)
man page:
stat()
stats the file pointed to by path and fills inbuf
.
lstat()
is identical tostat()
, except that if path is a symbolic link, then the link itself is stat-ed, not the file that it refers to.
In other words, the stat
call will follow the symbolic link to the target file and retrieve the information for that. Try using lstat
instead, it will give you the information for the link.
If you do the following:
touch junkfile
ln -s junkfile junklink
then compile and run the following program:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int main (void) {
struct stat buf;
int x;
x = stat ("junklink", &buf);
if (S_ISLNK(buf.st_mode)) printf (" stat says link\n");
if (S_ISREG(buf.st_mode)) printf (" stat says file\n");
x = lstat ("junklink", &buf);
if (S_ISLNK(buf.st_mode)) printf ("lstat says link\n");
if (S_ISREG(buf.st_mode)) printf ("lstat says file\n");
return 0;
}
you will get:
stat says file
lstat says link
as expected.