- switch (session_get_msg_type(msg)) {
- case SESSION_MSG_NORMAL:
- msg_data = msg + strlen("MESSAGE ");
- session->state = SESSION_SEND;
- sock_puts(session->sock, msg_data);
- session->state = SESSION_RECV;
- str = sock_getline(session->sock);
- if (!str) {
- session_send_msg(session, SESSION_MSG_ERROR,
- "receiving message failed.");
- session->state = SESSION_ERROR;
- g_free(msg);
- return FALSE;
- }
- strretchomp(str);
- session_send_msg(session, SESSION_MSG_NORMAL, str);
- g_free(str);
- break;
- case SESSION_MSG_SEND_DATA:
- msg_data = msg + strlen("SENDDATA ");
- size = atoi(msg_data);
- session_send_msg(session, SESSION_MSG_CONTROL, "ACCEPTDATA");
- send_data = session_read_data(session, size);
- if (!send_data) {
- session_send_msg(session, SESSION_MSG_ERROR,
- "sending data failed.");
- session->state = SESSION_ERROR;
- g_free(msg);
- return FALSE;
- }
- session->state = SESSION_SEND;
- if (session_send_data_to_sock(session, send_data, size) < 0) {
- session_send_msg(session, SESSION_MSG_ERROR,
- "sending data failed.");
- session->state = SESSION_ERROR;
- g_free(send_data);
- g_free(msg);
- return FALSE;
- }
- g_free(send_data);
- g_snprintf(buf, sizeof(buf), "DATASENT %d", size);
- session_send_msg(session, SESSION_MSG_CONTROL, buf);
- break;
- case SESSION_MSG_RECV_DATA:
- msg_data = msg + strlen("RECVDATA ");
- size = atoi(msg_data);
- session->state = SESSION_RECV;
- if (strstr(msg_data, "UNESCAPE") != NULL) {
- recv_data = session_recv_data_from_sock_unescape
- (session, size, &actual_size);
- size = actual_size;
- } else
- recv_data = session_recv_data_from_sock(session, size);
- if (!recv_data) {
- session_send_msg(session, SESSION_MSG_ERROR,
- "receiving data failed.");
- session->state = SESSION_ERROR;
- g_free(msg);
- return FALSE;
- }
- if (session_send_data(session, recv_data, size) < 0) {
- session->state = SESSION_ERROR;
- g_free(recv_data);
- g_free(msg);
- return FALSE;
- }
- g_free(recv_data);
- break;
- case SESSION_MSG_CONTROL:
- msg_data = msg + strlen("CONTROL ");
- if (!strcmp(msg_data, "CONTINUE")) {
- session->state = SESSION_RECV;
- str = sock_getline(session->sock);
- if (!str) {
- session_send_msg(session, SESSION_MSG_ERROR,
- "receiving message failed.");
- session->state = SESSION_ERROR;
- g_free(msg);
- return FALSE;
- }
- strretchomp(str);
- session_send_msg(session, SESSION_MSG_NORMAL, str);
- g_free(str);
- break;
-#if USE_OPENSSL
- } else if (!strcmp(msg_data, "STARTTLS")) {
- if (!ssl_init_socket_with_method(session->sock,
- SSL_METHOD_TLSv1)) {
- session_send_msg(session, SESSION_MSG_ERROR,
- "can't start TLS session.");
- session->state = SESSION_ERROR;
- g_free(msg);
- return FALSE;
- }
- session_send_msg(session, SESSION_MSG_CONTROL,
- "STARTTLSOK");
- break;
-#endif
- } else if (!strcmp(msg_data, "DISCONNECT")) {
- sock_close(session->sock);
- session->sock = NULL;
- session->state = SESSION_DISCONNECTED;
- session_send_msg(session, SESSION_MSG_CONTROL,
- "DISCONNECTED");
- g_free(msg);
- return FALSE;
- } else {
- session_send_msg(session, SESSION_MSG_ERROR,
- "wrong control message.");
- session->state = SESSION_ERROR;
- g_free(msg);
- return FALSE;
- }
- break;
- case SESSION_MSG_ERROR:
- default:
- session_send_msg(session, SESSION_MSG_ERROR,
- "error received from parent.");
- session->state = SESSION_ERROR;
- g_free(msg);
- return FALSE;