#include #include #include #include void error(char *msg) { write(2, msg, strlen(msg)); } int main(void) { int fd_in = STDIN_FILENO; int fd_out = STDOUT_FILENO; struct stat statbuf_in; struct stat statbuf_out; char c; if (fstat(fd_in, &statbuf_in) == -1) { perror("fstat"); return (1); } error("STDIN File type: "); switch (statbuf_in.st_mode & S_IFMT) { case S_IFBLK: error("block device\n"); break; case S_IFCHR: error("character device\n"); break; case S_IFDIR: error("directory\n"); break; case S_IFIFO: error("FIFO/pipe\n"); break; case S_IFLNK: error("symlink\n"); break; case S_IFREG: error("regular file\n"); break; case S_IFSOCK: error("socket\n"); break; default: error("unknown?\n"); break; } error("\n"); if (fstat(fd_out, &statbuf_out) == -1) { perror("fstat"); return (1); } error("STDOUT File type: "); switch (statbuf_out.st_mode & S_IFMT) { case S_IFBLK: error("block device\n"); break; case S_IFCHR: error("character device\n"); break; case S_IFDIR: error("directory\n"); break; case S_IFIFO: error("FIFO/pipe\n"); break; case S_IFLNK: error("symlink\n"); break; case S_IFREG: error("regular file\n"); break; case S_IFSOCK: error("socket\n"); break; default: error("unknown?\n"); break; } while (read(fd_in, &c, 1) > 0) { write(fd_out, &c, 1); } return (0); }