#include #include #include #include #include #include struct context { patty_error *err; char *name; patty_ax25_addr addr; }; enum mode { MODE_NONE, MODE_IFNAME, MODE_IFOPTS, MODE_IFADDR, MODE_KISS, MODE_BAUD, MODE_FLOW }; static patty_ax25_if *create_kiss(struct context *ctx, int argc, char **argv) { enum mode mode = MODE_KISS; patty_kiss_tnc_info info; int i; memset(&info, '\0', sizeof(info)); if (argc == 0) { patty_error_fmt(ctx->err, "Too few parameters for 'kiss' interface"); goto error_invalid; } for (i=0; ierr, "Invalid parameter '%s'", argv[i]); } break; case MODE_BAUD: if (!(argv[i][0] >= '0' && argv[i][0] <= '9')) { patty_error_fmt(ctx->err, "Invalid baud rate '%s'", argv[i]); goto error_invalid; } info.flags |= PATTY_KISS_TNC_BAUD; info.baud = atoi(argv[i]); mode = MODE_IFOPTS; break; case MODE_FLOW: if (strcmp(argv[i], "crtscts") == 0) { info.flags |= PATTY_KISS_TNC_FLOW; info.flow = PATTY_KISS_TNC_FLOW_CRTSCTS; } else if (strcmp(argv[i], "xonxoff") == 0) { info.flags |= PATTY_KISS_TNC_FLOW; info.flow = PATTY_KISS_TNC_FLOW_XONXOFF; } else { patty_error_fmt(ctx->err, "Invalid flow control '%s'", argv[i]); goto error_invalid; } mode = MODE_IFOPTS; break; default: break; } } return patty_ax25_if_new( ctx->name, &ctx->addr, patty_kiss_tnc_driver(), &info); error_invalid: return NULL; } struct if_type { const char *name; patty_ax25_if *(*func)(struct context *ctx, int argc, char **argv); }; struct if_type if_types[] = { { "kiss", create_kiss }, { NULL, NULL } }; patty_ax25_if *patty_bin_if_create(int argc, char **argv, patty_error *e) { enum mode mode = MODE_NONE; struct context ctx = { .err = e, .name = NULL }; int i; patty_error_clear(e); memset(&ctx.addr, '\0', sizeof(ctx.addr)); for (i=0; i