static int do_cmd(int argc, char **argv) { if (matches(*argv, "qdisc") == 0) return do_qdisc(argc-1, argv+1); if (matches(*argv, "class") == 0) return do_class(argc-1, argv+1); if (matches(*argv, "filter") == 0) return do_filter(argc-1, argv+1); if (matches(*argv, "actions") == 0) return do_action(argc-1, argv+1); if (matches(*argv, "monitor") == 0) return do_tcmonitor(argc-1, argv+1); if (matches(*argv, "help") == 0) { usage(); return 0; } fprintf(stderr, "Object \"%s\" is unknown, try \"tc help\".\n", *argv); return -1; }
int main(int argc, char **argv) { char *basename; basename = strrchr(argv[0], '/'); if (basename == NULL) basename = argv[0]; else basename++; /* batch mode */ if (argc > 1 && matches(argv[1], "-batch") == 0) { FILE *batch; char line[400]; char *largv[100]; int largc, ret=0; #define BMAXARG (sizeof(largv)/sizeof(char *)-2) if (argc != 3) { fprintf(stderr, "Wrong number of arguments in batch mode\n"); exit(-1); } if (matches(argv[2], "-") != 0) { if ((batch = fopen(argv[2], "r")) == NULL) { fprintf(stderr, "Cannot open file \"%s\" for reading: %s=n", argv[2], strerror(errno)); exit(-1); } } else { if ((batch = fdopen(0, "r")) == NULL) { fprintf(stderr, "Cannot open stdin for reading: %s=n", strerror(errno)); exit(-1); } } tc_core_init(); while (fgets(line, sizeof(line)-1, batch)) { if (line[strlen(line)-1]=='\n') { line[strlen(line)-1] = '\0'; } else { fprintf(stderr, "No newline at the end of line, looks like to long (%d chars or more)\n", strlen(line)); exit(-1); } largc = 0; largv[largc]=strtok(line, " "); while ((largv[++largc]=strtok(NULL, " ")) != NULL) { if (largc > BMAXARG) { fprintf(stderr, "Over %d arguments in batch mode, enough!\n", BMAXARG); exit(-1); } } if (matches(largv[0], "qdisc") == 0) { ret += do_qdisc(largc-1, largv+1); } else if (matches(largv[0], "class") == 0) { ret += do_class(largc-1, largv+1); } else if (matches(largv[0], "filter") == 0) { ret += do_filter(largc-1, largv+1); } else if (matches(largv[0], "help") == 0) { usage(); /* note that usage() doesn't return */ } else { fprintf(stderr, "Object \"%s\" is unknown, try \"tc help\".\n", largv[1]); exit(-1); } } fclose(batch); exit(0); /* end of batch, that's all */ } while (argc > 1) { if (argv[1][0] != '-') break; if (matches(argv[1], "-stats") == 0 || matches(argv[1], "-statistics") == 0) { ++show_stats; } else if (matches(argv[1], "-details") == 0) { ++show_details; } else if (matches(argv[1], "-raw") == 0) { ++show_raw; } else if (matches(argv[1], "-Version") == 0) { printf("tc utility, iproute2-ss%s\n", SNAPSHOT); exit(0); } else if (matches(argv[1], "-iec") == 0) { ++use_iec; } else if (matches(argv[1], "-help") == 0) { usage(); } else { fprintf(stderr, "Option \"%s\" is unknown, try \"tc -help\".\n", argv[1]); exit(-1); } argc--; argv++; } tc_core_init(); if (argc > 1) { if (matches(argv[1], "qdisc") == 0) return do_qdisc(argc-2, argv+2); if (matches(argv[1], "class") == 0) return do_class(argc-2, argv+2); if (matches(argv[1], "filter") == 0) return do_filter(argc-2, argv+2); if (matches(argv[1], "help") == 0) usage(); fprintf(stderr, "Object \"%s\" is unknown, try \"tc help\".\n", argv[1]); exit(-1); } usage(); }