aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThorsten Töpper <atsutane@freethoughts.de>2025-07-07 23:09:19 +0200
committerThorsten Töpper <atsutane@freethoughts.de>2025-07-07 23:09:19 +0200
commitd91dca7a417c55224167e33d7d0cad550218ead9 (patch)
tree654e316764a3fc5eff65a79ca479d590d518571b
parent2b9b4dd8321dbe253b5edcb031fc2f2a71a6d4cc (diff)
downloaddir_monitor-d91dca7a417c55224167e33d7d0cad550218ead9.tar.gz
dir_monitor-d91dca7a417c55224167e33d7d0cad550218ead9.tar.bz2
output: --print-header to label columns
-rw-r--r--include/options.h1
-rw-r--r--src/options.c14
-rw-r--r--src/output.c93
3 files changed, 105 insertions, 3 deletions
diff --git a/include/options.h b/include/options.h
index e31fd6a..062d120 100644
--- a/include/options.h
+++ b/include/options.h
@@ -28,6 +28,7 @@ enum esort_type { SORT_BY_NAME, SORT_BY_SIZE, SORT_BY_TIME };
extern bool option_sort_reverse_order;
extern enum esort_type option_sort_type;
+extern bool option_print_header;
extern bool option_show_hidden_entries;
extern bool option_timestamp_long;
extern char option_time_field;
diff --git a/src/options.c b/src/options.c
index 16d6cf5..9220003 100644
--- a/src/options.c
+++ b/src/options.c
@@ -21,6 +21,7 @@ struct option long_options[] = {
{ "help", no_argument, 0, 0 },
{ "format-string", required_argument, 0, 0 },
{ "long-timestamp", no_argument, 0, 0 },
+ { "print-header", no_argument, 0, 0 },
{ "reverse-sort", no_argument, 0, 0 },
{ "show-hidden-entries", no_argument, 0, 0 },
{ "sort-by", required_argument, 0, 0 },
@@ -30,6 +31,7 @@ struct option long_options[] = {
bool option_sort_reverse_order = false;
enum esort_type option_sort_type = SORT_BY_SIZE;
+bool option_print_header = false;
bool option_show_hidden_entries = false;
bool option_timestamp_long = false;
char *option_format_string = NULL;
@@ -55,6 +57,8 @@ void usage(char *executable) {
"define columns to print, details below");
fprintf(stderr, " %-25s %2s %10s - %s\n", "--long-timestamp", "-t", "",
"Print timestamp in long form yyyymmdd HH:MM:SS ZONE");
+ fprintf(stderr, " %-25s %2s %10s - %s\n", "--print-header", "-H", "",
+ "Print a header above the columns");
fprintf(stderr, " %-25s %2s %10s - %s\n", "--reverse-sort", "", "",
"Sort reversed");
fprintf(stderr, " %-25s %2s %10s - %s\n", "--show-hidden-entries", "-v", "",
@@ -108,6 +112,11 @@ void set_option(const char *option_name, char *option_argument) {
return;
}
+ if (strcmp("print-header", option_name) == 0) {
+ option_print_header = true;
+ return;
+ }
+
if (strcmp("show-hidden-entries", option_name) == 0) {
option_show_hidden_entries = true;
return;
@@ -171,7 +180,7 @@ int parse_arguments(int argc, char **argv) {
while(1) {
index = 0;
- c = getopt_long(argc, argv, "htv", long_options, &index);
+ c = getopt_long(argc, argv, "Hhtv", long_options, &index);
if (c == -1) {
break;
@@ -184,6 +193,9 @@ int parse_arguments(int argc, char **argv) {
case 'h':
usage(exec_name);
exit(EXIT_SUCCESS);
+ case 'H':
+ option_print_header = true;
+ break;
case 't':
option_timestamp_long = true;
break;
diff --git a/src/output.c b/src/output.c
index 04cafe7..5c68f17 100644
--- a/src/output.c
+++ b/src/output.c
@@ -25,6 +25,8 @@
/* === DEFINITIONS === */
+#define DM_OUT_FORMAT_MAX_LEN 80
+
#define out_vsep fputc('|', stdout)
#define out_print_newline() fputc('\n', stdout)
@@ -40,6 +42,7 @@ void out_print_time_by_option(struct list_node *ptr);
void out_print_type(struct list_node *ptr);
void out_print_user_name(struct list_node *ptr);
+void out_print_format_string_header(const char *format);
/* === IMPLEMENTATION === */
@@ -174,7 +177,7 @@ inline void out_print_time(time_t tv) {
tm = localtime(&tv);
if (option_timestamp_long) {
strftime(timestamp, sizeof(timestamp), "%Y%m%d %H:%M:%S %Z", tm);
- printf(" %20s ", timestamp);
+ printf(" %22s ", timestamp);
} else {
strftime(timestamp, sizeof(timestamp), "%H:%M:%S", tm);
printf(" %8s ", timestamp);
@@ -286,6 +289,83 @@ inline void out_print_permissions(struct list_node *ptr) {
printf(" %4o ", mode);
}
+inline void out_print_format_string_header(const char *format) {
+ size_t i=0, format_len=0;
+ char header[4096] = "";
+ char *pos = header;
+
+ if (format == NULL) return;
+ DBGTRC("DEBUG: format string: \"%s\"\n", format);
+
+
+ format_len = strnlen(format, DM_OUT_FORMAT_MAX_LEN);
+ /* Prevent buffer overflow, with the header string 32 byte buffer */
+ for (i=0; (i < format_len) && (strlen(header) < 4064); i++) {
+ switch (format[i]) {
+ case 'n':
+ sprintf(pos, " FILE ");
+ break;
+ case 's':
+ sprintf(pos, " %11s ", "SIZE ");
+ break;
+ case 't':
+ if (option_timestamp_long) {
+ sprintf(pos, " %c%-21s ", toupper(option_time_field), "TIME");
+ } else {
+ sprintf(pos, " %c%-7s ", toupper(option_time_field), "TIME");
+ }
+ break;
+ case 'A':
+ if (option_timestamp_long) {
+ sprintf(pos, " %-22s ", "ACCESS TIME");
+ } else {
+ sprintf(pos, " %-8s ", "ATIME");
+ }
+ break;
+ case 'C':
+ if (option_timestamp_long) {
+ sprintf(pos, " %-22s ", "CREATION TIME");
+ } else {
+ sprintf(pos, " %-8s ", "CTIME");
+ }
+ break;
+ case 'M':
+ if (option_timestamp_long) {
+ sprintf(pos, " %-22s ", "MODIFICATION TIME");
+ } else {
+ sprintf(pos, " %-8s ", "MTIME");
+ }
+ break;
+ case 'T':
+ sprintf(pos, " %-12s ", "TYPE");
+ break;
+ case 'u':
+ sprintf(pos, " %-4s ", "UID");
+ break;
+ case 'g':
+ sprintf(pos, " %-4s ", "GID");
+ break;
+ case 'U':
+ sprintf(pos, " %-10s ", "USER");
+ break;
+ case 'G':
+ sprintf(pos, " %-10s ", "GROUP");
+ break;
+ case 'p':
+ sprintf(pos, " %-4s ", "PERM");
+ break;
+ case ' ':
+ break;
+ default:
+ LOGERR("WARNING: Invalid character 0x%02X ignoring it\n", format[i]);
+ break;
+ };
+ pos = &header[strlen(header)];
+ }
+ printf("%s\n", header);
+ fputc_width_x('-', strlen(header), stdout);
+ out_print_newline();
+}
/* === END OF FORMATTING FUNCTIONS === */
@@ -305,6 +385,10 @@ void print_list(struct list_head *list) {
}
}
+ if (option_print_header) {
+ out_print_format_string_header("stn");
+ }
+
ptr = lh->first;
while (ptr != NULL) {
out_print_size(ptr);
@@ -370,7 +454,12 @@ void print_list_formatted(const char *format, struct list_head *list) {
/* Note: the maximum length needs to be adjusted if the strings
* shall contain more complicated settings */
- format_len = strnlen(format, 80);
+ format_len = strnlen(format, DM_OUT_FORMAT_MAX_LEN);
+ DBGTRC("DEBUG: format_len = %lu\n", format_len);
+
+ if (option_print_header) {
+ out_print_format_string_header(format);
+ }
ptr = lh->first;
while (ptr != NULL) {