- 论坛徽章:
- 2
|
- #include <stdio.h>
- #include <ctype.h>
- #define DEFAULT_PROTO_NAME_LENGTH 256
- struct log_line {
- char name[DEFAULT_PROTO_NAME_LENGTH];
- unsigned char source_ip4[4];
- unsigned char target_ip4[4];
- };
- int get_eof(FILE *fp) {
- int cc;
- if (fp != NULL) {
- cc = fgetc(fp);
- if (cc == EOF) {
- return 0;
- }
- ungetc(cc, fp);
- }
- return -1;
- }
- int get_space(FILE *fp) {
- int cc;
- if (fp != NULL) {
- cc = fgetc(fp);
- if (cc != EOF) {
- if (isspace(cc)) {
- while ((cc = fgetc(fp)) != EOF) {
- if (!isspace(cc)) {
- ungetc(cc, fp);
- break;
- }
- }
- return 0;
- }
- ungetc(cc, fp);
- }
- }
- return -1;
- }
- int get_word(FILE *fp, char *buf, int n) {
- int cc;
- if (fp != NULL && buf != NULL && n > 1) {
- cc = fgetc(fp);
- if (cc != EOF) {
- if (!isspace(cc) && cc != '\n') {
- *buf++ = cc;
- --n;
- while ((cc = fgetc(fp)) != EOF) {
- if (isspace(cc) || cc == '\n') {
- ungetc(cc, fp);
- break;
- }
- if (n > 0) {
- *buf++ = cc;
- n--;
- }
- }
- *buf = '\0';
- return 0;
- }
- ungetc(cc, fp);
- }
- }
- return -1;
- }
- int get_line(FILE *fp, char *buf, int n) {
- int cc;
- if (fp != NULL) {
- cc = fgetc(fp);
- if (cc != EOF) {
- if (cc != '\n') {
- while ((cc = fgetc(fp)) != EOF) {
- if (cc == '\n') {
- break;
- }
- if (buf != NULL) {
- if (n-- > 0) {
- *buf++ = cc;
- }
- }
- }
- if (buf != NULL) {
- *buf = '\0';
- }
- return 0;
- }
- ungetc(cc, fp);
- }
- }
- return -1;
- }
- int get_number(FILE *fp, unsigned limit, unsigned *number) {
- int cc;
- unsigned retval;
- if (fp != NULL) {
- cc = fgetc(fp);
- if (cc != EOF) {
- if (isdigit(cc)) {
- retval = cc - '0';
- if (retval <= limit) {
- while ((cc = fgetc(fp)) != EOF) {
- if (!isdigit(cc)) {
- ungetc(cc, fp);
- if (number != NULL) {
- *number = retval;
- }
- return 0;
- }
- retval = retval * 10 + cc - '0';
- if (retval > limit) {
- break;
- }
- }
- }
- }
- ungetc(cc, fp);
- }
- }
- return -1;
- }
- int get_token(FILE *fp, const char *tok) {
- int cc;
- if (fp != NULL && tok != NULL) {
- while (*tok != '\0') {
- cc = fgetc(fp);
- if (cc == EOF) {
- return -1;
- }
- if (*tok != cc) {
- ungetc(cc, fp);
- return -1;
- }
- tok++;
- }
- return 0;
- }
- return -1;
- }
- int get_ip4(FILE *fp, unsigned char ip4[4]) {
- unsigned number;
- if (get_number(fp, 255, &number) == 0) {
- ip4[0] = (unsigned char)number;
- if (get_token(fp, ".") == 0) {
- if (get_number(fp, 255, &number) == 0) {
- ip4[1] = (unsigned char)number;
- if (get_token(fp, ".") == 0) {
- if (get_number(fp, 255, &number) == 0) {
- ip4[2] = (unsigned char)number;
- if (get_token(fp, ".") == 0) {
- if (get_number(fp, 255, &number) == 0) {
- ip4[3] = (unsigned char)number;
- return 0;
- }
- }
- }
- }
- }
- }
- }
- return -1;
- }
- int read_line(FILE *fp, struct log_line *line) {
- if (fp != NULL && line != NULL) {
- if (get_number(fp, ~0, NULL) == 0) {
- if (get_token(fp, ".") == 0) {
- if (get_number(fp, ~0, NULL) == 0) {
- if (get_space(fp) == 0) {
- if (get_ip4(fp, line->source_ip4) == 0) {
- if (get_space(fp) == 0) {
- if (get_token(fp, "->") == 0) {
- if (get_space(fp) == 0) {
- if (get_ip4(fp, line->target_ip4) == 0) {
- if (get_space(fp) == 0) {
- if (get_word(fp, line->name, DEFAULT_PROTO_NAME_LENGTH) == 0) {
- if (get_line(fp, NULL, 0) == 0) {
- return 0;
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- return -1;
- }
- int read_logfile(const char *filename) {
- FILE *fp;
- struct log_line line;
- int lineno;
- if (filename != NULL) {
- fp = fopen(filename, "r");
- if (fp != NULL) {
- lineno = 0;
- while (get_eof(fp) != 0) {
- if (read_line(fp, &line) != 0) {
- printf("Line No: %d\n", lineno);
- printf("BAD LINE!!!\n");
- get_line(fp, NULL, 0);
- }else {
- if (lineno > 0) {
- printf("\n");
- }
- printf("Line No: %d\n", lineno);
- printf("Source IP: %d.%d.%d.%d\n", line.source_ip4[0], line.source_ip4[1], line.source_ip4[2], line.source_ip4[3]);
- printf("Target IP: %d.%d.%d.%d\n", line.target_ip4[0], line.target_ip4[1], line.target_ip4[2], line.target_ip4[3]);
- printf("Proto Name: %s\n", line.name);
- }
- lineno++;
- }
- return 0;
- }
- }
- return -1;
- }
- int main(void) {
- read_logfile("test.log");
- return 0;
- }
复制代码 |
|