diff options
Diffstat (limited to 'nsprpub/tools/tail.c')
-rw-r--r-- | nsprpub/tools/tail.c | 164 |
1 files changed, 87 insertions, 77 deletions
diff --git a/nsprpub/tools/tail.c b/nsprpub/tools/tail.c index 32c93ddfdc..d9b87a0e62 100644 --- a/nsprpub/tools/tail.c +++ b/nsprpub/tools/tail.c @@ -29,16 +29,16 @@ static void Help(void) PRIntn main(PRIntn argc, char **argv) { - PRIntn rv = 0; + PRIntn rv = 0; PLOptStatus os; - PRStatus status; - PRFileDesc *file; - PRFileInfo fileInfo; - PRIntervalTime dally; - char buffer[BUFFER_SIZE]; - PRBool follow = PR_FALSE; - const char *filename = NULL; - PRUint32 position = 0, seek = 0, time = 0; + PRStatus status; + PRFileDesc *file; + PRFileInfo fileInfo; + PRIntervalTime dally; + char buffer[BUFFER_SIZE]; + PRBool follow = PR_FALSE; + const char *filename = NULL; + PRUint32 position = 0, seek = 0, time = 0; PLOptState *opt = PL_CreateOptState(argc, argv, "hfn:"); out = PR_GetSpecialFD(PR_StandardOutput); @@ -46,89 +46,99 @@ PRIntn main(PRIntn argc, char **argv) while (PL_OPT_EOL != (os = PL_GetNextOpt(opt))) { - if (PL_OPT_BAD == os) continue; + if (PL_OPT_BAD == os) { + continue; + } switch (opt->option) { - case 0: /* it's the filename */ - filename = opt->value; - break; - case 'n': /* bytes before end of file */ - seek = atoi(opt->value); - break; - case 't': /* dally time */ - time = atoi(opt->value); - break; - case 'f': /* follow the end of file */ - follow = PR_TRUE; - break; - case 'h': /* user wants some guidance */ - Help(); /* so give him an earful */ - return 2; /* but not a lot else */ - break; - default: - break; + case 0: /* it's the filename */ + filename = opt->value; + break; + case 'n': /* bytes before end of file */ + seek = atoi(opt->value); + break; + case 't': /* dally time */ + time = atoi(opt->value); + break; + case 'f': /* follow the end of file */ + follow = PR_TRUE; + break; + case 'h': /* user wants some guidance */ + Help(); /* so give him an earful */ + return 2; /* but not a lot else */ + break; + default: + break; } } PL_DestroyOptState(opt); - if (0 == time) time = 1000; - dally = PR_MillisecondsToInterval(time); + if (0 == time) { + time = 1000; + } + dally = PR_MillisecondsToInterval(time); if (NULL == filename) { (void)PR_fprintf(out, "Input file not specified\n"); rv = 1; goto done; } - file = PR_Open(filename, PR_RDONLY, 0); - if (NULL == file) - { - PL_FPrintError(err, "File cannot be opened for reading"); - return 1; - } - - status = PR_GetOpenFileInfo(file, &fileInfo); - if (PR_FAILURE == status) - { - PL_FPrintError(err, "Cannot acquire status of file"); - rv = 1; goto done; - } - if (seek > 0) - { - if (seek > fileInfo.size) seek = 0; - position = PR_Seek(file, (fileInfo.size - seek), PR_SEEK_SET); - if (-1 == (PRInt32)position) - PL_FPrintError(err, "Cannot seek to starting position"); - } - - do - { - while (position < fileInfo.size) - { - PRInt32 read, bytes = fileInfo.size - position; - if (bytes > sizeof(buffer)) bytes = sizeof(buffer); - read = PR_Read(file, buffer, bytes); - if (read != bytes) - PL_FPrintError(err, "Cannot read to eof"); - position += read; - PR_Write(out, buffer, read); - } - - if (follow) - { - PR_Sleep(dally); - status = PR_GetOpenFileInfo(file, &fileInfo); - if (PR_FAILURE == status) - { - PL_FPrintError(err, "Cannot acquire status of file"); - rv = 1; goto done; - } - } - } while (follow); + file = PR_Open(filename, PR_RDONLY, 0); + if (NULL == file) + { + PL_FPrintError(err, "File cannot be opened for reading"); + return 1; + } + + status = PR_GetOpenFileInfo(file, &fileInfo); + if (PR_FAILURE == status) + { + PL_FPrintError(err, "Cannot acquire status of file"); + rv = 1; goto done; + } + if (seek > 0) + { + if (seek > fileInfo.size) { + seek = 0; + } + position = PR_Seek(file, (fileInfo.size - seek), PR_SEEK_SET); + if (-1 == (PRInt32)position) { + PL_FPrintError(err, "Cannot seek to starting position"); + } + } + + do + { + while (position < fileInfo.size) + { + PRInt32 read, bytes = fileInfo.size - position; + if (bytes > sizeof(buffer)) { + bytes = sizeof(buffer); + } + read = PR_Read(file, buffer, bytes); + if (read != bytes) { + PL_FPrintError(err, "Cannot read to eof"); + } + position += read; + PR_Write(out, buffer, read); + } + + if (follow) + { + PR_Sleep(dally); + status = PR_GetOpenFileInfo(file, &fileInfo); + if (PR_FAILURE == status) + { + PL_FPrintError(err, "Cannot acquire status of file"); + rv = 1; goto done; + } + } + } while (follow); done: - PR_Close(file); + PR_Close(file); - return rv; + return rv; } /* main */ /* tail.c */ |