/* Call callback */ void call_callback(PPTP_CONN *conn, PPTP_CALL *call, enum call_state state) { struct local_callinfo *lci; struct local_conninfo *conninfo; u_int16_t call_id[2]; switch(state) { case CALL_OPEN_DONE: /* okey dokey. This means that the call_id and peer_call_id are now * valid, so lets send them on to our friends who requested this call. */ pptp_debug("About to get the call closure stuff"); lci = pptp_call_closure_get(conn, call); assert(lci != NULL); pptp_call_get_ids(conn, call, &call_id[0], &call_id[1]); pptp_debug("writing out the call_ids"); if (lci) write(lci->unix_sock, (char *) &call_id, sizeof(call_id)); /* Our duty to the fatherland is now complete. */ break; case CALL_OPEN_FAIL: case CALL_CLOSE_RQST: case CALL_CLOSE_DONE: /* don't need to do anything here, except make sure tables are sync'ed */ conninfo = pptp_conn_closure_get(conn); lci = pptp_call_closure_get(conn, call); // assert(lci != NULL && conninfo != NULL); if (lci && conninfo && vector_contains(conninfo->call_list, lci->unix_sock)) { vector_remove(conninfo->call_list, lci->unix_sock); if (lci->unix_sock >= 0) FD_CLR(lci->unix_sock, conninfo->call_set); // syslog(LOG_NOTICE, "Closing connection"); kill(lci->pid[0], SIGTERM); } if (lci) { pptp_debug("close %d", lci->unix_sock); close(lci->unix_sock); lci->unix_sock = -1; #if 0 memset(lci, 0, sizeof(*lci)); free(lci); pptp_call_closure_put(conn, call, NULL); #endif } break; default: logmsg("Unhandled call callback state [%d].", (int) state); break; } }
/* Call callback */ void call_callback(PPTP_CONN *conn, PPTP_CALL *call, enum call_state state) { struct local_callinfo *lci; struct local_conninfo *conninfo; u_int16_t call_id[2]; switch(state) { case CALL_OPEN_DONE: /* okey dokey. This means that the call_id and peer_call_id are * now valid, so lets send them on to our friends who requested * this call. */ lci = pptp_call_closure_get(conn, call); assert(lci != NULL); pptp_call_get_ids(conn, call, &call_id[0], &call_id[1]); write(lci->unix_sock, &call_id, sizeof(call_id)); /* Our duty to the fatherland is now complete. */ break; case CALL_OPEN_FAIL: case CALL_CLOSE_RQST: case CALL_CLOSE_DONE: /* don't need to do anything here, except make sure tables * are sync'ed */ log("Closing connection (call state)"); conninfo = pptp_conn_closure_get(conn); lci = pptp_call_closure_get(conn, call); assert(lci != NULL && conninfo != NULL); if (vector_contains(conninfo->call_list, lci->unix_sock)) { vector_remove(conninfo->call_list, lci->unix_sock); close(lci->unix_sock); FD_CLR(lci->unix_sock, conninfo->call_set); if(lci->pid[0] > 1) kill(lci->pid[0], SIGTERM); if(lci->pid[1] > 1) kill(lci->pid[1], SIGTERM); } break; default: log("Unhandled call callback state [%d].", (int) state); break; } }