This is mtail.c in view mode; [Download] [Up]
#include <libc.h> #include <stdio.h> /* * mtail - simple multi tail * * wgb: 1994.8.5 * this program reads a list of growing logfiles * and displays the incoming data to stdout */ #define MAX_FILES 10 static char *file_name[MAX_FILES]; void fput_tail(FILE *, int); // display the growing tail of a file void main(int argc, char *argv[]) { int i, n; FILE *fps[MAX_FILES]; if (argc == 1) { // no arguments is an error! fprintf(stderr, "usage: `%s growing_files_to_list`\n", argv[0]); exit(1); } for (i=0; (i <= MAX_FILES)&&(argc > 1); ) { // open the files file_name[i] = argv[--argc]; // save filename for later use if ((fps[i] = fopen(argv[argc], "r")) == NULL) { fprintf(stderr, "%s: can't open file: %s\n", argv[0], argv[argc]); continue; } fseek(fps[i], 0, SEEK_END); // position them to the end ++i; } n = i-1; if (!n) { // if no open files then no work fprintf(stderr, "%s: no file to list!\n", argv[0]); exit(2); } while (1) { // do not exit for (i=0; i < n; ++i) // for all open files fput_tail(fps[i], i); // display growing tail sleep(3); // suspend 3 sec to save processor time } } void fput_tail(FILE *fp, int fi) { static int old_fi=-1; int c, nl_cnt=0; while ((c = getc(fp)) != EOF) { // check for additional bytes if (fi != old_fi) { // give out name if file has changed old_fi = fi; printf("\n========== %s ==========\n", file_name[fi]); } nl_cnt = (c == '\n') ? nl_cnt+1 : 0; if (nl_cnt <= 2) // omit multiple newlines putchar(c); // and display them } clearerr(fp); // reset eof condition }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.