diff options
Diffstat (limited to 'libslang/slsh/scripts/lsrpm')
-rwxr-xr-x | libslang/slsh/scripts/lsrpm | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/libslang/slsh/scripts/lsrpm b/libslang/slsh/scripts/lsrpm new file mode 100755 index 0000000..dcd607a --- /dev/null +++ b/libslang/slsh/scripts/lsrpm @@ -0,0 +1,85 @@ +#! /usr/bin/env slsh +% Generate a listing of an RPM file + +static define pgm_usage () +{ + vmessage ("Usage: lsrpm FILENAME"); + exit (1); +} + +static variable RPM_Command = "rpm -q -l --dump -p "; + +static define exit_error (msg) +{ + () = fprintf (stderr, "%s\n", msg); + exit (1); +} + + +static define run_rpm (file) +{ + variable fp; + variable lines; + variable months = + ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", + "Oct", "Nov", "Dec"]; + variable s; + + fp = popen (RPM_Command + file, "r"); + if (fp == NULL) + exit_error ("Failed to open RPM process"); + + % each line contains: + % path size mtime md5sum mode owner group isconfig isdoc rdev symlink + + variable six_months_ago = _time () - 3600*24*30*6; + + foreach (fp) + { + variable path, size, mode, owner, group, symlink, mtime; + variable mstring; + variable tm; + + s = (); + s = strchop (strtrim_end (s, "\n"), ' ', 0); + + path = s[0]; + size = s[1]; + mtime = integer (s[2]); + mode = integer (s[4]); + owner = s[5]; + group = s[6]; + + tm = localtime (mtime); + if (mtime < six_months_ago) + mtime = sprintf ("%s %2d %4d", + months[tm.tm_mon], + tm.tm_mday, + 1900 + tm.tm_year); + else + mtime = sprintf ("%s %2d % 2d:%02d", + months[tm.tm_mon], + tm.tm_mday, + tm.tm_hour, + tm.tm_min); + + + symlink = ""; + if (stat_is ("lnk", mode)) + symlink = " -> " + s[10]; + + mstring = stat_mode_to_string (mode); + + if (-1 == fprintf (stdout, + "%8s %8s %8s %10s %s %s%s\n", + mstring, owner, group, size, mtime, path, symlink)) + exit_error (sprintf ("Write failed: %s", errno_string (errno))); + } + () = pclose (fp); +} + +if (__argc != 2) + pgm_usage (); + +run_rpm (__argv[1]); +exit (0); |