]> pd.if.org Git - zpackage/blobdiff - zpm-stat.c
fix compile process for elf programs
[zpackage] / zpm-stat.c
index b85857a0b59eb0f54419cf1af1445c9f16d9ee96..b8cb9d767cb906746aae7f4bc78626360f2dee18 100644 (file)
@@ -1,3 +1,5 @@
+#define _POSIX_C_SOURCE 200112L
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
@@ -58,16 +60,13 @@ char *format_string_parse(char *s, struct format_string *f) {
        return s;
 }
 
-void stat_one(char *fmt, char *timefmt, char *filename) {
-       struct stat buf;
+void stat_one(char *fmt, char *timefmt, char *filename, struct stat *buf) {
        struct tm *tm;
        char timestr[1024];
        struct format_string f;
        struct passwd *pw;
        struct group *gr;
 
-       stat(filename, &buf);
-
        while (*fmt) {
                fmt = format_string_parse(fmt, &f);
                if (!f.found) break; /* done */
@@ -78,30 +77,58 @@ void stat_one(char *fmt, char *timefmt, char *filename) {
                }
                switch (f.found) {
                        case 'y': /* handle mtime */
-                               tm = gmtime(&buf.st_mtime);
+                               tm = gmtime(&buf->st_mtime);
                                strftime(timestr, 1023, timefmt, tm);
                                timestr[1023] = 0;
                                printf("%s", timestr);
                                break;
+                       case 's':
+                               printf("%jd", (intmax_t)buf->st_size);
+                               break;
                        case 'a': /* octal mode */
-                               printf("%o", (int)buf.st_mode & 07777);
+                               printf("%o", (int)buf->st_mode & 07777);
+                               break;
+                       case 't':
+                               if (S_ISBLK(buf->st_mode)) {
+                                       printf("block");
+                               } else if (S_ISCHR(buf->st_mode)) {
+                                       printf("character");
+                               } else if (S_ISDIR(buf->st_mode)) {
+                                       printf("directory");
+                               } else if (S_ISFIFO(buf->st_mode)) {
+                                       printf("fifo");
+                               } else if (S_ISREG(buf->st_mode)) {
+                                       printf("regular");
+                               } else if (S_ISLNK(buf->st_mode)) {
+                                       printf("symlink");
+                               } else if (S_ISSOCK(buf->st_mode)) {
+                                       printf("socket");
+                               } else {
+                                       printf("unknown");
+                               }
                                break;
                        case 'u': /* handle uid */
-                               printf("%0d", buf.st_uid);
+                               printf("%0d", buf->st_uid);
                                break;
                        case 'U': /* handle username */
-                               pw = getpwuid(buf.st_uid);
+                               pw = getpwuid(buf->st_uid);
                                if (!pw) exit(1);
                                printf("%s", pw->pw_name);
                                break;
                        case 'g': /* handle gid */
-                               printf("%0d", buf.st_gid);
+                               printf("%0d", buf->st_gid);
                                break;
                        case 'G': /* handle groupname */
-                               gr = getgrgid(buf.st_gid);
+                               gr = getgrgid(buf->st_gid);
                                if (!gr) exit(1);
                                printf("%s", gr->gr_name);
                                break;
+                       case 'n':
+                               printf("%s", filename);
+                               break;
+                       case '%':
+                               putchar('%');
+                               break;
                        default: /* handle unknown formatting character */
                                printf("%c", f.found);
                                break;
@@ -115,8 +142,9 @@ int main(int ac, char *av[]) {
        char *timefmt = "%s"; /* default time fmt is unix ts */
        int errflg = 0;
        int c;
+       int uselstat = 0;
 
-       while ((c = getopt(ac, av, "f:t:")) != -1) {
+       while ((c = getopt(ac, av, "lf:t:")) != -1) {
                switch(c) {
                        case 'f':
                                fmt = optarg;
@@ -129,6 +157,9 @@ int main(int ac, char *av[]) {
                                "Option -%c requires an operand\n", optopt);
                                errflg++;
                                break;
+                       case 'l':
+                               uselstat = 1;
+                               break;
                        case '?':
                                fprintf(stderr,
                                "Unrecognized option: '-%c'\n", optopt);
@@ -136,11 +167,17 @@ int main(int ac, char *av[]) {
                }
        }
        if (errflg) {
-               fprintf(stderr, "zpm-stat [-f <format>] [-t <timefmt>]");
+               fprintf(stderr, "zpm-stat [-f <format>] [-t <timefmt>]\n");
                exit(2);
        }
        for ( ; optind < ac; optind++) {
-               stat_one(fmt, timefmt, av[optind]);
+               struct stat buf;
+               if (uselstat) {
+                       lstat(av[optind], &buf);
+               } else {
+                       stat(av[optind], &buf);
+               }
+               stat_one(fmt, timefmt, av[optind], &buf);
        }
        return 0;
 }