static int netns_exec(int argc, char **argv) { /* Setup the proper environment for apps that are not netns * aware, and execute a program in that environment. */ const char *cmd; if (argc < 1 && !do_all) { fprintf(stderr, "No netns name specified\n"); return -1; } if ((argc < 2 && !do_all) || (argc < 1 && do_all)) { fprintf(stderr, "No command specified\n"); return -1; } if (do_all) return do_each_netns(on_netns_exec, --argv, 1); if (netns_switch(argv[0])) return -1; /* ip must return the status of the child, * but do_cmd() will add a minus to this, * so let's add another one here to cancel it. */ cmd = argv[1]; return -cmd_exec(cmd, argv + 1, !!batch_mode); }
static int on_netns(char *nsname, void *arg) { struct netns_func *f = arg; if (netns_switch(nsname)) return -1; return f->func(nsname, f->arg); }
static int check_vport(struct netns_entry *ns, struct if_entry *entry) { struct nl_handle hnd; struct ovs_header oh; void *payload; struct nlmsg_entry *dest; int len; int err = ENOMEM; /* Be paranoid. If anything goes wrong, assume the interace is not * a vport. It's better to present an interface as unconnected to * the bridge when it's in fact connected, than vice versa. */ if (!vport_genl_id) return 0; if (netns_switch(ns)) return 0; if (genl_open(&hnd)) return 0; oh.dp_ifindex = 0; len = nla_add_str(&oh, sizeof(oh), OVS_VPORT_ATTR_NAME, entry->if_name, &payload); if (!len) goto out_hnd; err = genl_request(&hnd, vport_genl_id, OVS_VPORT_CMD_GET, payload, len, &dest); if (err) goto out_payload; /* Keep err = 0. We're only interested whether the call succeeds or * not, we don't care about the returned data. */ nlmsg_free(dest); out_payload: free(payload); out_hnd: nl_close(&hnd); return !err; }
int main(int argc, char **argv) { char *basename; char *batch_file = NULL; basename = strrchr(argv[0], '/'); if (basename == NULL) basename = argv[0]; else basename++; while (argc > 1) { char *opt = argv[1]; if (strcmp(opt,"--") == 0) { argc--; argv++; break; } if (opt[0] != '-') break; if (opt[1] == '-') opt++; if (matches(opt, "-loops") == 0) { argc--; argv++; if (argc <= 1) usage(); max_flush_loops = atoi(argv[1]); } else if (matches(opt, "-family") == 0) { argc--; argv++; if (argc <= 1) usage(); if (strcmp(argv[1], "help") == 0) usage(); else preferred_family = read_family(argv[1]); if (preferred_family == AF_UNSPEC) invarg("invalid protocol family", argv[1]); } else if (strcmp(opt, "-4") == 0) { preferred_family = AF_INET; } else if (strcmp(opt, "-6") == 0) { preferred_family = AF_INET6; } else if (strcmp(opt, "-0") == 0) { preferred_family = AF_PACKET; } else if (strcmp(opt, "-I") == 0) { preferred_family = AF_IPX; } else if (strcmp(opt, "-D") == 0) { preferred_family = AF_DECnet; } else if (strcmp(opt, "-M") == 0) { preferred_family = AF_MPLS; } else if (strcmp(opt, "-B") == 0) { preferred_family = AF_BRIDGE; } else if (matches(opt, "-human") == 0 || matches(opt, "-human-readable") == 0) { ++human_readable; } else if (matches(opt, "-iec") == 0) { ++use_iec; } else if (matches(opt, "-stats") == 0 || matches(opt, "-statistics") == 0) { ++show_stats; } else if (matches(opt, "-details") == 0) { ++show_details; } else if (matches(opt, "-resolve") == 0) { ++resolve_hosts; } else if (matches(opt, "-oneline") == 0) { ++oneline; } else if (matches(opt, "-timestamp") == 0) { ++timestamp; } else if (matches(opt, "-tshort") == 0) { ++timestamp; ++timestamp_short; #if 0 } else if (matches(opt, "-numeric") == 0) { rtnl_names_numeric++; #endif } else if (matches(opt, "-Version") == 0) { printf("ip utility, iproute2-ss%s\n", SNAPSHOT); exit(0); } else if (matches(opt, "-force") == 0) { ++force; } else if (matches(opt, "-batch") == 0) { argc--; argv++; if (argc <= 1) usage(); batch_file = argv[1]; } else if (matches(opt, "-rcvbuf") == 0) { unsigned int size; argc--; argv++; if (argc <= 1) usage(); if (get_unsigned(&size, argv[1], 0)) { fprintf(stderr, "Invalid rcvbuf size '%s'\n", argv[1]); exit(-1); } rcvbuf = size; } else if (matches(opt, "-color") == 0) { enable_color(); } else if (matches(opt, "-help") == 0) { usage(); } else if (matches(opt, "-netns") == 0) { NEXT_ARG(); if (netns_switch(argv[1])) exit(-1); } else if (matches(opt, "-all") == 0) { do_all = true; } else { fprintf(stderr, "Option \"%s\" is unknown, try \"ip -help\".\n", opt); exit(-1); } argc--; argv++; } _SL_ = oneline ? "\\" : "\n" ; if (batch_file) return batch(batch_file); if (rtnl_open(&rth, 0) < 0) exit(1); if (strlen(basename) > 2) return do_cmd(basename+2, argc, argv); if (argc > 1) return do_cmd(argv[1], argc-1, argv+1); rtnl_close(&rth); usage(); }
int main(int argc, char **argv) { int ret; char *batch_file = NULL; 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], "-pretty") == 0) { ++show_pretty; } else if (matches(argv[1], "-graph") == 0) { show_graph = 1; } else if (matches(argv[1], "-Version") == 0) { printf("tc utility, iproute2-ss%s\n", SNAPSHOT); return 0; } else if (matches(argv[1], "-iec") == 0) { ++use_iec; } else if (matches(argv[1], "-help") == 0) { usage(); return 0; } else if (matches(argv[1], "-force") == 0) { ++force; } else if (matches(argv[1], "-batch") == 0) { argc--; argv++; if (argc <= 1) usage(); batch_file = argv[1]; } else if (matches(argv[1], "-netns") == 0) { NEXT_ARG(); if (netns_switch(argv[1])) return -1; } else if (matches(argv[1], "-names") == 0 || matches(argv[1], "-nm") == 0) { use_names = true; } else if (matches(argv[1], "-cf") == 0 || matches(argv[1], "-conf") == 0) { NEXT_ARG(); conf_file = argv[1]; } else if (matches(argv[1], "-timestamp") == 0) { timestamp++; } else if (matches(argv[1], "-tshort") == 0) { ++timestamp; ++timestamp_short; } else if (matches(argv[1], "-json") == 0) { ++json; } else { fprintf(stderr, "Option \"%s\" is unknown, try \"tc -help\".\n", argv[1]); return -1; } argc--; argv++; } if (batch_file) return batch(batch_file); if (argc <= 1) { usage(); return 0; } tc_core_init(); if (rtnl_open(&rth, 0) < 0) { fprintf(stderr, "Cannot open rtnetlink\n"); exit(1); } if (use_names && cls_names_init(conf_file)) { ret = -1; goto Exit; } ret = do_cmd(argc-1, argv+1); Exit: rtnl_close(&rth); if (use_names) cls_names_uninit(); return ret; }
int main(int argc, char **argv) { while (argc > 1) { const char *opt = argv[1]; if (strcmp(opt, "--") == 0) { argc--; argv++; break; } if (opt[0] != '-') break; if (opt[1] == '-') opt++; if (matches(opt, "-help") == 0) { usage(); } else if (matches(opt, "-Version") == 0) { printf("bridge utility, 0.0\n"); exit(0); } else if (matches(opt, "-stats") == 0 || matches(opt, "-statistics") == 0) { ++show_stats; } else if (matches(opt, "-details") == 0) { ++show_details; } else if (matches(opt, "-oneline") == 0) { ++oneline; } else if (matches(opt, "-timestamp") == 0) { ++timestamp; } else if (matches(opt, "-family") == 0) { argc--; argv++; if (argc <= 1) usage(); if (strcmp(argv[1], "inet") == 0) preferred_family = AF_INET; else if (strcmp(argv[1], "inet6") == 0) preferred_family = AF_INET6; else if (strcmp(argv[1], "help") == 0) usage(); else invarg("invalid protocol family", argv[1]); } else if (strcmp(opt, "-4") == 0) { preferred_family = AF_INET; } else if (strcmp(opt, "-6") == 0) { preferred_family = AF_INET6; } else if (matches(opt, "-netns") == 0) { NEXT_ARG(); if (netns_switch(argv[1])) exit(-1); } else if (matches(opt, "-compressvlans") == 0) { ++compress_vlans; } else if (matches(opt, "-force") == 0) { ++force; } else if (matches(opt, "-batch") == 0) { argc--; argv++; if (argc <= 1) usage(); batch_file = argv[1]; } else { fprintf(stderr, "Option \"%s\" is unknown, try \"bridge help\".\n", opt); exit(-1); } argc--; argv++; } _SL_ = oneline ? "\\" : "\n"; if (batch_file) return batch(batch_file); if (rtnl_open(&rth, 0) < 0) exit(1); if (argc > 1) return do_cmd(argv[1], argc-1, argv+1); rtnl_close(&rth); usage(); }