/** Establish connection to the db * */ static int sql_init_socket(rlm_sql_handle_t *handle, rlm_sql_config_t *config) { rlm_sql_firebird_sock *firebird_sock; long res; if (!handle->conn) { handle->conn = rad_malloc(sizeof(rlm_sql_firebird_sock)); if (!handle->conn) { return -1; } } firebird_sock = handle->conn; res = fb_init_socket(firebird_sock); if (res) { return -1; } if (fb_connect(firebird_sock,config)) { radlog(L_ERR, "rlm_sql_firebird: Connection failed %s\n", firebird_sock->lasterror); return SQL_DOWN; } return 0; }
/** Establish connection to the db * */ static sql_rcode_t sql_socket_init(rlm_sql_handle_t *handle, rlm_sql_config_t *config) { rlm_sql_firebird_conn_t *conn; long res; MEM(conn = handle->conn = talloc_zero(handle, rlm_sql_firebird_conn_t)); talloc_set_destructor(conn, _sql_socket_destructor); res = fb_init_socket(conn); if (res) { return -1; } if (fb_connect(conn, config)) { ERROR("rlm_sql_firebird: Connection failed: %s", conn->error); return RLM_SQL_RECONNECT; } return 0; }
/************************************************************************* * * Function: sql_init_socket * * Purpose: Establish connection to the db * *************************************************************************/ static int sql_init_socket(SQLSOCK *sqlsocket, SQL_CONFIG *config) { rlm_sql_firebird_sock *firebird_sock; long res; if (!sqlsocket->conn) { sqlsocket->conn = (rlm_sql_firebird_sock *)rad_malloc(sizeof(rlm_sql_firebird_sock)); if (!sqlsocket->conn) return -1; } firebird_sock = sqlsocket->conn; res=fb_init_socket(firebird_sock); if (res) return -1; if (fb_connect(firebird_sock,config)) { radlog(L_ERR, "rlm_sql_firebird: Connection failed %s\n", firebird_sock->lasterror); return SQL_DOWN; } return 0; }
/** Establish connection to the db * */ static int sql_socket_init(rlm_sql_handle_t *handle, rlm_sql_config_t *config) { rlm_sql_firebird_conn_t *conn; long res; MEM(conn = handle->conn = talloc_zero(handle, rlm_sql_firebird_conn_t)); talloc_set_destructor((void *) conn, sql_socket_destructor); res = fb_init_socket(conn); if (res) { return -1; } if (fb_connect(conn,config)) { radlog(L_ERR, "rlm_sql_firebird: Connection failed %s\n", conn->lasterror); return SQL_DOWN; } return 0; }
int fb_open_socket(){ int listen_fd, i, conn_fd; socklen_t client_addr_len; pid_t child_pid; fb_sockaddr_in sockaddr; fb_sockaddr_in client_addr; if((listen_fd = fb_socket(AF_INET, SOCK_STREAM, 0)) == -1) return _FB_ERROR_; i = 1; if(setsockopt(listen_fd, SOL_SOCKET, SO_REUSEADDR, (void*) &i, sizeof(i) ) < 0) return _FB_ERROR_; /*init memory*/ memset(&sockaddr, 0, sizeof(sockaddr)); memset(&client_addr, 0, sizeof(client_addr)); client_addr_len = sizeof(client_addr); sockaddr.sin_family = AF_INET; sockaddr.sin_port = htons(_FB_LISTENED_FD_); sockaddr.sin_addr.s_addr = htonl(INADDR_ANY); if(bind(listen_fd, (struct sockaddr *) &sockaddr, sizeof(sockaddr)) == -1) return _FB_ERROR_; if(listen(listen_fd, 10) == -1) return _FB_ERROR_; /*regist signal SIGCHLD*/ if(signal(SIGCHLD, sig_child) == SIG_ERR){ printf("SIGCHLD error\n"); return -1; } /*daemonize process*/ //fb_daemonize(); while(1){ conn_fd = accept(listen_fd, (struct sockaddr *) &client_addr, &client_addr_len); if(conn_fd < 0){ printf("connect error\n"); break; } /*fork child process*/ if((child_pid = fork()) < 0){ printf("fork error\n"); break; }else if(child_pid == 0){ /*child process*/ /*close listen_fd copied from father*/ if(close(listen_fd) < 0){ printf("child close listen_fd error\n"); } /*if(signal(SIGCHLD, SIG_DFL) == SIG_ERR){ printf("RESET SIGCHLD ERROR\n"); exit(1); }*/ /*process connection*/ fb_connect(conn_fd, client_addr); if(close(conn_fd) < 0){ printf("child close conn_fd error\n"); } exit(0); } if(close(conn_fd) < 0){ printf("parent close conn_fd error\n"); } } close(listen_fd); return 0; }