status_t register_domain(int family, const char* name, struct net_protocol_module_info* module, struct net_address_module_info* addressModule, net_domain** _domain) { TRACE(("register_domain(%d, %s)\n", family, name)); MutexLocker locker(sDomainLock); struct net_domain_private* domain = lookup_domain(family); if (domain != NULL) return B_NAME_IN_USE; domain = new(std::nothrow) net_domain_private; if (domain == NULL) return B_NO_MEMORY; recursive_lock_init(&domain->lock, name); domain->family = family; domain->name = name; domain->module = module; domain->address_module = addressModule; sDomains.Add(domain); *_domain = domain; return B_OK; }
void parse_exclude_domains(const char *arg) { char *_arg = strdup(arg); const struct domain *p; char *tok; if (!_arg) { outputerr("No free memory\n"); exit(EXIT_FAILURE); } for (tok = strtok(_arg, ","); tok; tok = strtok(NULL, ",")) { p = lookup_domain(tok); if (p) { BUG_ON(p->domain >= ARRAY_SIZE(no_domains)); no_domains[p->domain] = TRUE; } else goto err; } free(_arg); return; err: free(_arg); outputerr("Domain unknown in argument %s\n", arg); exit(EXIT_FAILURE); }
/* This routine is so old I can't even remember writing it. But I do * remember that it was an .h file because I didn't know putting code in a * header was bad magic yet. anyway, this routine opens a connection to a * system and returns the fd. * - steve * * Cleaned up some of the code to use memory routines which are now the * default. Also, the routine first checks to see if the address is in * dotted-decimal form before it does a name lookup. * - rjkaes */ int opensock(char *ip_addr, uint16_t port) { int sock_fd; struct sockaddr_in port_info; struct sockaddr_in bind_addr; int ret; WSockInit(); //Initialize WSock -- load winsock32.dll version 2.2 assert(ip_addr != NULL); assert(port > 0); memset((struct sockaddr *) &port_info, 0, sizeof(port_info)); port_info.sin_family = AF_INET; /* Lookup and return the address if possible */ ret = lookup_domain(&port_info.sin_addr, ip_addr); if (ret < 0) { log_message(LOG_ERR, "opensock: Could not lookup address \"%s\".", ip_addr); return -1; } port_info.sin_port = htons(port); if ((sock_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { log_message(LOG_ERR, "opensock: socket() error \"%s\".", strerror(errno)); return -1; } /* Bind to the specified address */ if (config.bind_address) { memset(&bind_addr, 0, sizeof(bind_addr)); bind_addr.sin_family = AF_INET; bind_addr.sin_addr.s_addr = inet_addr(config.bind_address); ret = bind(sock_fd, (struct sockaddr *)&bind_addr, sizeof(bind_addr)); if (ret < 0) { log_message(LOG_ERR, "Could not bind local address \"%\" because of %s", config.bind_address, strerror(errno)); return -1; } } if (connect(sock_fd, (struct sockaddr *) &port_info, sizeof(port_info)) < 0) { log_message(LOG_ERR, "opensock: connect() error \"%s\".", strerror(errno)); return -1; } return sock_fd; }
void find_specific_domain(const char *domainarg) { const struct domain *p; unsigned int i; p = lookup_domain(domainarg); if (p) { specific_domain = p->domain; output(2, "Using domain %s for all sockets\n", p->name); return; } outputerr("Domain unknown. Pass one of "); for (i = 0; i < ARRAY_SIZE(domains); i++) outputerr("%s ", domains[i].name); outputerr("\n"); exit(EXIT_FAILURE); }
/*! Gets the domain of the specified family. */ net_domain* get_domain(int family) { MutexLocker locker(sDomainLock); return lookup_domain(family); }