struct zergpool_socket *add_zergpool_socket(char *name, char *sockets) { struct zergpool_socket *z_sock,*zps = zergpool_sockets; if (!zps) { z_sock = uwsgi_calloc(sizeof(struct zergpool_socket)); zergpool_sockets = z_sock; } else { while(zps) { if (!zps->next) { z_sock= uwsgi_calloc(sizeof(struct zergpool_socket)); zps->next = z_sock; break; } zps = zps->next; } } // do not defer accept for zergpools if (uwsgi.no_defer_accept) { uwsgi.no_defer_accept = 0; z_sock->fd = bind_to_unix(name, uwsgi.listen_queue, uwsgi.chmod_socket, 0); uwsgi.no_defer_accept = 1; } else { z_sock->fd = bind_to_unix(name, uwsgi.listen_queue, uwsgi.chmod_socket, 0); } char *sock_list = uwsgi_str(sockets); char *p = strtok(sock_list, ","); while(p) { z_sock->num_sockets++; p = strtok(NULL, ","); } free(sock_list); z_sock->sockets = uwsgi_calloc(sizeof(int) * (z_sock->num_sockets + 1)); sock_list = uwsgi_str(sockets); int pos = 0; p = strtok(sock_list, ","); while(p) { char *port = strchr(p, ':'); if (!port) { z_sock->sockets[pos] = bind_to_unix(p, uwsgi.listen_queue, uwsgi.chmod_socket, uwsgi.abstract_socket); uwsgi_log("zergpool %s bound to UNIX socket %s (fd: %d)\n", name, uwsgi_getsockname(z_sock->sockets[pos]), z_sock->sockets[pos]); } else { char *gsn = generate_socket_name(p); z_sock->sockets[pos] = bind_to_tcp(gsn, uwsgi.listen_queue, strchr(gsn, ':')); uwsgi_log("zergpool %s bound to TCP socket %s (fd: %d)\n", name, uwsgi_getsockname(z_sock->sockets[pos]), z_sock->sockets[pos]); } pos++; p = strtok(NULL, ","); } return z_sock; }
int fastrouter_opt(int i, char *optarg) { char *cs; char *cs_code; char *cs_func; switch(i) { case LONG_ARGS_FASTROUTER: uwsgi_fastrouter_new_socket(generate_socket_name(optarg)); return 1; case LONG_ARGS_FASTROUTER_SUBSCRIPTION_SERVER: ufr.subscription_server = optarg; return 1; case LONG_ARGS_FASTROUTER_EVENTS: ufr.nevents = atoi(optarg); return 1; case LONG_ARGS_FASTROUTER_USE_PATTERN: ufr.pattern = optarg; // optimization ufr.pattern_len = strlen(ufr.pattern); return 1; case LONG_ARGS_FASTROUTER_USE_BASE: ufr.base = optarg; // optimization ufr.base_len = strlen(ufr.base); return 1; case LONG_ARGS_FASTROUTER_USE_CODE_STRING: cs = uwsgi_str(optarg); cs_code = strchr(cs, ':'); if (!cs_code) { uwsgi_log("invalid code_string option\n"); exit(1); } cs_code[0] = 0; cs_func = strchr(cs_code+1, ':'); if (!cs_func) { uwsgi_log("invalid code_string option\n"); exit(1); } cs_func[0] = 0; ufr.code_string_modifier1 = atoi(cs); ufr.code_string_code = cs_code+1; ufr.code_string_function = cs_func+1; return 1; case LONG_ARGS_FASTROUTER_TIMEOUT: ufr.socket_timeout = atoi(optarg); return -1; case LONG_ARGS_FASTROUTER_SUBSCRIPTION_SLOT: ufr.subscription_slot = atoi(optarg); return 1; } return 0; }