int main(int argc, char **argv) { const char *parname; enum lc15bts_par par; int rc, val; rc = parse_options(argc, argv); if (rc < 0) exit(2); if (optind >= argc) { fprintf(stderr, "You must specify the parameter name\n"); exit(2); } parname = argv[optind]; rc = get_string_value(lc15bts_par_names, parname); if (rc < 0) { fprintf(stderr, "`%s' is not a valid parameter\n", parname); exit(2); } else par = rc; switch (action) { case ACT_GET: rc = lc15bts_par_get_int(par, &val); if (rc < 0) { fprintf(stderr, "Error %d\n", rc); goto err; } printf("%d\n", val); break; case ACT_SET: rc = lc15bts_par_get_int(par, &val); if (rc < 0) { fprintf(stderr, "Error %d\n", rc); goto err; } if (val != 0xFFFF && val != 0xFF && val != 0xFFFFFFFF && !void_warranty) { fprintf(stderr, "Parameter is already set!\r\n"); goto err; } rc = lc15bts_par_set_int(par, atoi(write_arg)); if (rc < 0) { fprintf(stderr, "Error %d\n", rc); goto err; } printf("Success setting %s=%d\n", parname, atoi(write_arg)); break; default: fprintf(stderr, "Unsupported action\n"); goto err; } exit(0); err: exit(1); }
/* * We don't look at the content of the request yet and lie * about most of the responses. */ static void respond_to(struct sockaddr_in *src, struct osmo_fd *fd, uint8_t *data, size_t len) { static int fetched_info = 0; static char mac_str[20] = {0, }; static char model_name[64] = {0, }; static char ser_str[20] = {0, }; struct sockaddr_in loc_addr; int rc; char loc_ip[INET_ADDRSTRLEN]; struct msgb *msg = msgb_alloc_headroom(512, 128, "ipa get response"); if (!msg) { LOGP(DFIND, LOGL_ERROR, "Failed to allocate msgb\n"); return; } if (!fetched_info) { int fd_eth; int serno; /* fetch the MAC */ fd_eth = open(ETH0_ADDR_SYSFS, O_RDONLY); if (fd_eth >= 0) { read(fd_eth, mac_str, sizeof(mac_str)-1); mac_str[sizeof(mac_str)-1] = '\0'; close(fd_eth); } /* fetch the serial number */ lc15bts_par_get_int(tall_mgr_ctx, LC15BTS_PAR_SERNR, &serno); snprintf(ser_str, sizeof(ser_str), "%d", serno); strncpy(model_name, get_hwversion_desc(), sizeof(model_name)-1); fetched_info = 1; } if (source_for_dest(&src->sin_addr, &loc_addr.sin_addr) != 0) { LOGP(DFIND, LOGL_ERROR, "Failed to determine local source\n"); return; } msgb_put_u8(msg, IPAC_MSGT_ID_RESP); /* append MAC addr */ quirk_l16tv_put(msg, strlen(mac_str) + 1, IPAC_IDTAG_MACADDR, (uint8_t *) mac_str); /* append ip address */ inet_ntop(AF_INET, &loc_addr.sin_addr, loc_ip, sizeof(loc_ip)); quirk_l16tv_put(msg, strlen(loc_ip) + 1, IPAC_IDTAG_IPADDR, (uint8_t *) loc_ip); /* append the serial number */ quirk_l16tv_put(msg, strlen(ser_str) + 1, IPAC_IDTAG_SERNR, (uint8_t *) ser_str); /* abuse some flags */ quirk_l16tv_put(msg, strlen(model_name) + 1, IPAC_IDTAG_UNIT, (uint8_t *) model_name); /* ip.access nanoBTS would reply to port==3006 */ ipaccess_prepend_header_quirk(msg, IPAC_PROTO_IPACCESS); rc = sendto(fd->fd, msg->data, msg->len, 0, (struct sockaddr *)src, sizeof(*src)); if (rc != msg->len) LOGP(DFIND, LOGL_ERROR, "Failed to send with rc(%d) errno(%d)\n", rc, errno); }