struct Address * listener_lookup_server_address(const struct Listener *listener, const char *name, size_t name_len) { struct Address *new_addr = NULL; short set_to_fallback = 0; const struct Address *addr = table_lookup_server_address(listener->table, name, name_len); if (addr == NULL) addr = listener->fallback_address; if (addr == NULL) return NULL; int port = address_port(addr); if (address_is_wildcard(addr)) { new_addr = new_address(name); if (new_addr == NULL) { warn("Invalid hostname %.*s in client request", (int)name_len, name); set_to_fallback = 1; } else if (address_is_sockaddr(new_addr)) { warn("Refusing to proxy to socket address literal %.*s in request", (int)name_len, name); set_to_fallback = 1; } if (!set_to_fallback && port != 0) address_set_port(new_addr, port); } else { size_t len = address_len(addr); new_addr = malloc(len); if (new_addr == NULL) { err("%s: malloc", __func__); set_to_fallback = 1; } memcpy(new_addr, addr, len); } if (set_to_fallback) { size_t len = address_len(listener->fallback_address); new_addr = malloc(len); if (new_addr == NULL) { err("%s: malloc", __func__); return NULL; } memcpy(new_addr, listener->fallback_address, len); } if (!set_to_fallback && port == 0) address_set_port(new_addr, address_port(listener->address)); return new_addr; }
int32_t as_93lcxx_write_all(struct as_93lcxx_device * aDev, uint16_t aValue) { uint32_t msg = 0; int add_length; int ret; add_length = address_len(aDev->type, aDev->word_size); /* forge message */ msg = ((WRAL << (add_length + (aDev->word_size))) | (WRAL_ADDR << ((aDev->word_size) + (add_length - 2))) | aValue); ret = as_spi_msg(aDev->fd, msg, 3 + add_length + aDev->word_size, aDev->speed); if (ret < 0) { ERROR("Error on forging spi message\n"); return -1; } /* Wait for end of write all */ usleep(TWL); return 0; }
int32_t as_93lcxx_ewds(struct as_93lcxx_device * aDev) { uint32_t msg = 0; int add_length; int ret; add_length = address_len(aDev->type, aDev->word_size); /* forge message */ msg = ((EWDS << add_length) | (EWDS_ADDR << (add_length - 2))); ret = as_spi_msg(aDev->fd, msg, 3 + add_length, aDev->speed); if (ret < 0) { ERROR("Error on forging spi message\n"); return -1; } return 0; }
struct Address * listener_lookup_server_address(const struct Listener *listener, const char *name, size_t name_len) { struct Address *new_addr = NULL; const struct Address *addr = table_lookup_server_address(listener->table, name, name_len); if (addr == NULL) addr = listener->fallback_address; if (addr == NULL) return NULL; int port = address_port(addr); if (address_is_wildcard(addr)) { new_addr = new_address(name); if (new_addr == NULL) { warn("Invalid hostname %.*s", (int)name_len, name); return listener->fallback_address; } if (port != 0) address_set_port(new_addr, port); } else { size_t len = address_len(addr); new_addr = malloc(len); if (new_addr == NULL) { err("%s: malloc", __func__); return listener->fallback_address; } memcpy(new_addr, addr, len); } if (port == 0) address_set_port(new_addr, address_port(listener->address)); return new_addr; }
int32_t as_93lcxx_erase(struct as_93lcxx_device * aDev, uint16_t aAddress) { uint32_t msg = 0; int add_length; int ret; add_length = address_len(aDev->type, aDev->word_size); /* forge message */ msg = ((ERASE << (add_length + aDev->word_size)) | (aAddress << (aDev->word_size))); ret = as_spi_msg(aDev->fd, msg, 3 + add_length + aDev->word_size, aDev->speed); if (ret < 0) { ERROR("Error on forging spi message\n"); return -1; } usleep(TWC); return 0; }
int32_t as_93lcxx_read(struct as_93lcxx_device * aDev, uint16_t aAddress) { uint32_t data_out, msg = 0; int add_length; add_length = address_len(aDev->type, aDev->word_size); /* forge message */ msg = ((READ << (add_length + (aDev->word_size))) | (aAddress << (aDev->word_size))); data_out = as_spi_msg(aDev->fd, msg, 3 + add_length + aDev->word_size, aDev->speed); if (data_out < 0) { ERROR("Error on forging spi message\n"); return -1; } if (aDev->word_size == 8) return data_out & 0xff; else return data_out & 0xffff; }
int32_t as_93lcxx_erase_all(struct as_93lcxx_device * aDev) { uint32_t msg = 0; int add_length; int ret; add_length = address_len(aDev->type, aDev->word_size); /* forge message */ msg = ((ERAL << add_length) | (ERAL_ADDR << (add_length - 2)) ); ret = as_spi_msg(aDev->fd, msg, 3 + add_length, aDev->speed); if (ret < 0) { ERROR("Error on forging spi message\n"); return -1; } /* wait for end of erase all */ usleep(TEC); return 0; }
int main() { /* using volatile variables so we can example core dumps */ for (volatile unsigned int i = 0; i < sizeof(good) / sizeof(struct Test); i++) { int port; char buffer[255]; struct Address *addr = new_address(good[i].input); assert(addr != NULL); assert(address_compare(addr, addr) == 0); assert(address_compare(NULL, addr) < 0); assert(address_compare(addr, NULL) > 0); assert(address_len(addr) > 0); if (good[i].expected_type & TYPE_HOSTNAME) { assert(address_is_hostname(addr)); assert(!address_is_sockaddr(addr)); assert(!address_is_wildcard(addr)); assert(address_hostname(addr) != NULL); assert(address_sa(addr) == NULL); assert(address_sa_len(addr) == 0); } else if (good[i].expected_type & TYPE_SOCKADDR) { assert(!address_is_hostname(addr)); assert(address_is_sockaddr(addr)); assert(!address_is_wildcard(addr)); assert(address_hostname(addr) == NULL); assert(address_sa(addr) != NULL); assert(address_sa_len(addr) > 0); } else if (good[i].expected_type & TYPE_WILDCARD) { assert(!address_is_hostname(addr)); assert(!address_is_sockaddr(addr)); assert(address_is_wildcard(addr)); assert(address_hostname(addr) == NULL); assert(address_sa(addr) == NULL); assert(address_sa_len(addr) == 0); } display_address(addr, buffer, sizeof(buffer)); if (strcmp(buffer, good[i].output)) { fprintf(stderr, "display_address(%p) returned \"%s\", expected \"%s\"\n", addr, buffer, good[i].output); return 1; } assert(display_address(addr, NULL, 0) == NULL); port = address_port(addr); if (good[i].port != port) { fprintf(stderr, "address_port(%p) return %d, expected %d\n", addr, port, good[i].port); return 1; } address_set_port(addr, port); if (good[i].port != port) { fprintf(stderr, "address_port(%p) return %d, expected %d\n", addr, port, good[i].port); return 1; } free(addr); } for (volatile unsigned int i = 0; i < sizeof(bad) / sizeof(const char *); i++) { struct Address *addr = new_address(bad[i]); if (addr != NULL) { fprintf(stderr, "Accepted bad hostname \"%s\"\n", bad[i]); return 1; } } assert(compare_address_strings("unix:/dev/log", "127.0.0.1") < 0); assert(compare_address_strings("unix:/dev/log", "unix:/dev/logsocket") < 0); assert(compare_address_strings("0.0.0.0", "127.0.0.1") < 0); assert(compare_address_strings("127.0.0.1", "0.0.0.0") > 0); assert(compare_address_strings("127.0.0.1", "127.0.0.1") == 0); assert(compare_address_strings("127.0.0.1:80", "127.0.0.1:81") < 0); assert(compare_address_strings("*:80", "*:81") < 0); assert(compare_address_strings("*:81", "*:80") > 0); assert(compare_address_strings("example.com", "example.net") < 0); assert(compare_address_strings("example.net", "example.com") > 0); assert(compare_address_strings("example.com", "example.com.net") < 0); assert(compare_address_strings("example.com.net", "example.com") > 0); assert(compare_address_strings("example.com", "example.com:80") < 0); assert(compare_address_strings("example.com:80", "example.com") > 0); assert(compare_address_strings(NULL, "example.com") < 0); assert(compare_address_strings("example.com", NULL) > 0); assert(compare_address_strings("example.com", "::") < 0); assert(compare_address_strings("::", "example.com") > 0); assert(compare_address_strings("0.0.0.0", "*") < 0); assert(compare_address_strings("*", "0.0.0.0") > 0); do { struct Address *addr = new_address("*"); assert(addr != NULL); assert(address_len(addr) > 0); free(addr); } while (0); return 0; }