// SPDX-License-Identifier: GPL-2.0 /* * Copyright (c) 2000-2002 Silicon Graphics, Inc. * All Rights Reserved. */ #include #include #include #include #include #include #include long timebuf; void timesince(long timesec) { long d_since; /* days */ long h_since; /* hours */ long m_since; /* minutes */ long s_since; /* seconds */ s_since = timebuf - timesec; d_since = s_since / 86400l ; s_since -= d_since * 86400l ; h_since = s_since / 3600l ; s_since -= h_since * 3600l ; m_since = s_since / 60l ; s_since -= m_since * 60l ; printf("(%05ld.%02ld:%02ld:%02ld)\n", d_since, h_since, m_since, s_since); } void usage(void) { fprintf(stderr, "Usage: lstat64 [-t] filename ...\n"); exit(1); } int main(int argc, char **argv) { struct stat64 sbuf; int i, c; int terse_flag = 0; while ((c = getopt(argc, argv, "t")) != EOF) { switch (c) { case 't': terse_flag = 1; break; case '?': usage(); } } if (optind == argc) { usage(); } time(&timebuf); for (i = optind; i < argc; i++) { char mode[] = "----------"; if( lstat64(argv[i], &sbuf) < 0) { perror(argv[i]); continue; } if (terse_flag) { printf("%s %llu ", argv[i], (unsigned long long)sbuf.st_size); } else { printf(" File: \"%s\"\n", argv[i]); printf(" Size: %-10llu", (unsigned long long)sbuf.st_size); } if (sbuf.st_mode & S_IXOTH) mode[9] = 'x'; if (sbuf.st_mode & S_IWOTH) mode[8] = 'w'; if (sbuf.st_mode & S_IROTH) mode[7] = 'r'; if (sbuf.st_mode & S_IXGRP) mode[6] = 'x'; if (sbuf.st_mode & S_IWGRP) mode[5] = 'w'; if (sbuf.st_mode & S_IRGRP) mode[4] = 'r'; if (sbuf.st_mode & S_IXUSR) mode[3] = 'x'; if (sbuf.st_mode & S_IWUSR) mode[2] = 'w'; if (sbuf.st_mode & S_IRUSR) mode[1] = 'r'; if (sbuf.st_mode & S_ISVTX) mode[9] = 't'; if (sbuf.st_mode & S_ISGID) mode[6] = 's'; if (sbuf.st_mode & S_ISUID) mode[3] = 's'; if (!terse_flag) printf(" Filetype: "); switch (sbuf.st_mode & S_IFMT) { case S_IFSOCK: if (!terse_flag) puts("Socket"); mode[0] = 's'; break; case S_IFDIR: if (!terse_flag) puts("Directory"); mode[0] = 'd'; break; case S_IFCHR: if (!terse_flag) puts("Character Device"); mode[0] = 'c'; break; case S_IFBLK: if (!terse_flag) puts("Block Device"); mode[0] = 'b'; break; case S_IFREG: if (!terse_flag) puts("Regular File"); mode[0] = '-'; break; case S_IFLNK: if (!terse_flag) puts("Symbolic Link"); mode[0] = 'l'; break; case S_IFIFO: if (!terse_flag) puts("Fifo File"); mode[0] = 'f'; break; default: if (!terse_flag) puts("Unknown"); mode[0] = '?'; } if (terse_flag) { printf("%s %d,%d\n", mode, (int)sbuf.st_uid, (int)sbuf.st_gid); continue; } printf(" Mode: (%04o/%s)", (unsigned int)(sbuf.st_mode & 07777), mode); printf(" Uid: (%d)", (int)sbuf.st_uid); printf(" Gid: (%d)\n", (int)sbuf.st_gid); printf("Device: %2d,%-2d", major(sbuf.st_dev), minor(sbuf.st_dev)); printf(" Inode: %-9llu", (unsigned long long)sbuf.st_ino); printf(" Links: %-5ld", (long)sbuf.st_nlink); if ( ((sbuf.st_mode & S_IFMT) == S_IFCHR) || ((sbuf.st_mode & S_IFMT) == S_IFBLK) ) printf(" Device type: %2d,%-2d\n", major(sbuf.st_rdev), minor(sbuf.st_rdev)); else printf("\n"); printf("Access: %.24s",ctime(&sbuf.st_atime)); timesince(sbuf.st_atime); printf("Modify: %.24s",ctime(&sbuf.st_mtime)); timesince(sbuf.st_mtime); printf("Change: %.24s",ctime(&sbuf.st_ctime)); timesince(sbuf.st_ctime); if (i+1 < argc) printf("\n"); } exit(0); }