Takes one or more files as arguments on the command line and returns the type of the file(s) (normal file, directory, etc.)

/* reports the type of a file or of multiple files
* that are given as arguments on the command line
* it works too */
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
int main (int argc, char *argv[])
/* In ISO C you can define `main’ either to take no arguments, or to
* take two arguments that represent the command line arguments to the
* program as shown above */
{
int i;
struct stat buf;
/* struct stat {
  * dev_t         st_dev;     ( device )
  * ino_t         st_ino;     ( inode )
  * mode_t        st_mode;    ( protection )
  * nlink_t       st_nlink;   ( number of hard links )
  * uid_t         st_uid;     ( user ID of owner )
  * gid_t         st_gid;     ( group ID of owner )
  * dev_t         st_rdev;    ( device type (if inode device) )
  * off_t         st_size;    ( total size, in bytes )
  * blksize_t     st_blksize; ( blocksize for filesystem I/O )
  * blkcnt_t      st_blocks;  ( number of blocks allocated )
  * time_t        st_atime;   ( time of last access )
  * time_t        st_mtime;   ( time of last modification )
  * time_t        st_ctime;   ( time of last change )
  * }; */
  char *ptr;
  for (i=1; i<argc; i++)
   {
    printf (“%s is a “, argv[i]);
    if (lstat(argv[i], &buf)<0)
/* lstat() stats the file pointed to and fills in buf. In the case of a symbolic link,
* the link itself is stat-ed, not the file that it refers to as oppsed to stat() */
printf(“… i don’t know what it is, lstat returned an error\n”);
/* The following predicate macros test the type of a file, given the
* `st_mode’ field returned by `lstat’ on that file:
*/
else if (S_ISREG(buf.st_mode))  ptr =“regular file\n”;
else if (S_ISDIR(buf.st_mode))  ptr =“directory\n”;
else if (S_ISCHR(buf.st_mode))  ptr =“character special file (a device like a terminal)\n”;
else if (S_ISBLK(buf.st_mode))  ptr =“block special file (a device like a disk)\n”;
else if (S_ISFIFO(buf.st_mode)) ptr =“FIFO special file, or a pipe\n”;
//#ifdef S_ISLNK
else if (S_ISLNK(buf.st_mode))  ptr =“symbolic link\n”;
//#endif
//#ifdef S_ISSOCK
    else if (S_ISSOCK(buf.st_mode)) ptr =“socket\n”;
//#endif
    else ptr=“… wait… it’s a… a… WHAT THE HELL IS THAT ?\n”;
    printf(“%s”,ptr);
}
return 0;
}