static int fpm_sockets_hash_op(int sock, struct sockaddr *sa, char *key, int type, int op) /* {{{ */ { if (key == NULL) { switch (type) { case FPM_AF_INET : { struct sockaddr_in *sa_in = (struct sockaddr_in *) sa; key = alloca(sizeof("xxx.xxx.xxx.xxx:ppppp")); sprintf(key, "%u.%u.%u.%u:%u", IPQUAD(&sa_in->sin_addr), (unsigned int) ntohs(sa_in->sin_port)); break; } case FPM_AF_UNIX : { struct sockaddr_un *sa_un = (struct sockaddr_un *) sa; key = alloca(strlen(sa_un->sun_path) + 1); strcpy(key, sa_un->sun_path); break; } default : return -1; } } switch (op) { case FPM_GET_USE_SOCKET : { unsigned i; struct listening_socket_s *ls = sockets_list.data; for (i = 0; i < sockets_list.used; i++, ls++) { if (!strcmp(ls->key, key)) { ++ls->refcount; return ls->sock; } } break; } case FPM_STORE_SOCKET : /* inherited socket */ case FPM_STORE_USE_SOCKET : /* just created */ { struct listening_socket_s *ls; ls = fpm_array_push(&sockets_list); if (!ls) { break; } if (op == FPM_STORE_SOCKET) { ls->refcount = 0; } else { ls->refcount = 1; } ls->type = type; ls->sock = sock; ls->key = strdup(key); return 0; } } return -1; }
static int fpm_sockets_hash_op(int sock, struct sockaddr *sa, char *key, int type, int op) /* {{{ */ { if (key == NULL) { switch (type) { case FPM_AF_INET : { key = alloca(INET6_ADDRSTRLEN+10); inet_ntop(sa->sa_family, fpm_get_in_addr(sa), key, INET6_ADDRSTRLEN); sprintf(key+strlen(key), ":%d", fpm_get_in_port(sa)); break; } case FPM_AF_UNIX : { struct sockaddr_un *sa_un = (struct sockaddr_un *) sa; key = alloca(strlen(sa_un->sun_path) + 1); strcpy(key, sa_un->sun_path); break; } default : return -1; } } switch (op) { case FPM_GET_USE_SOCKET : { unsigned i; struct listening_socket_s *ls = sockets_list.data; for (i = 0; i < sockets_list.used; i++, ls++) { if (!strcmp(ls->key, key)) { ++ls->refcount; return ls->sock; } } break; } case FPM_STORE_SOCKET : /* inherited socket */ case FPM_STORE_USE_SOCKET : /* just created */ { struct listening_socket_s *ls; ls = fpm_array_push(&sockets_list); if (!ls) { break; } if (op == FPM_STORE_SOCKET) { ls->refcount = 0; } else { ls->refcount = 1; } ls->type = type; ls->sock = sock; ls->key = strdup(key); return 0; } } return -1; }