int create_fd(const char *arg, int is_output, enum proto *proto, char *name, size_t max_name_size) { if (strncmp(arg, "udp:", 4) == 0 || strncmp(arg, "UDP:", 4) == 0) { *proto = UDP; arg += 4; } else if (strncmp(arg, "tcp:", 4) == 0 || strncmp(arg, "TCP:", 4) == 0) { *proto = TCP; arg += 4; } else if (strncmp(arg, "file:", 5) == 0) { *proto = File; arg += 5; } else if (strncmp(arg, "eth:", 4) == 0) { *proto = Eth; arg += 4; } else if (strcmp(arg, "null:") == 0) { *proto = File; arg = "/dev/null"; } else if (strcmp(arg, "zero:") == 0) { *proto = File; arg = "/dev/zero"; } else if (strcmp(arg, "stdin:") == 0) { *proto = StdIn; arg = "stdin"; } else if (strcmp(arg, "stdout:") == 0) { *proto = StdOut; arg = "stdout"; } else if (strcmp(arg, "stderr:") == 0) { *proto = StdErr; arg = "stderr"; } else if (strchr(arg, ':') != 0) { *proto = UDP; } else if (strcmp(arg, "-") == 0) { *proto = is_output ? StdOut : StdIn; arg = is_output ? "stdout" : "stdin"; } else { *proto = File; } if (name != 0) strncpy(name, arg, max_name_size); switch (*proto) { case UDP : case TCP : return create_IP_socket(arg, is_output, *proto); case File : return create_file(arg, is_output); case Eth : return create_raw_eth_socket(arg, is_output); case StdIn : case StdOut: case StdErr : return create_stdio(is_output, *proto); default : fprintf(stderr, "Cannot create fd for unknown proto %d\n", *proto), exit(1); } }
int create_fd(char *arg, int is_output, enum proto *proto) { if (strncmp(arg, "udp:", 4) == 0 || strncmp(arg, "UDP:", 4) == 0) { *proto = UDP; arg += 4; } else if (strncmp(arg, "tcp:", 4) == 0 || strncmp(arg, "TCP:", 4) == 0) { *proto = TCP; arg += 4; } else if (strncmp(arg, "file:", 5) == 0) { *proto = File; arg += 5; } else if (strncmp(arg, "eth:", 4) == 0) { *proto = Eth; arg += 4; } else if (strncmp(arg, "stdin:", 6) == 0) { *proto = StdIn; arg = "stdin"; } else if (strncmp(arg, "stdout:", 7) == 0) { *proto = StdOut; arg = "stdout"; } else if (strncmp(arg, "stderr:", 7) == 0) { *proto = StdErr; arg = "stderr"; } else if (strchr(arg, ':') != 0) { *proto = UDP; } else if (strcmp(arg, "-") == 0) { *proto = is_output ? StdOut : StdIn; arg = is_output ? "stdout" : "stdin"; } else { *proto = File; } if (is_output) destination = arg; else source = arg; switch (*proto) { case UDP : case TCP : return create_IP_socket(arg, is_output, *proto); case File : return create_file(arg, is_output); case Eth : return create_raw_eth_socket(arg, is_output); case StdIn : case StdOut: case StdErr : return create_stdio(is_output, *proto); } }