From 96cdc19261a23465575395bf3612a31992cf34b7 Mon Sep 17 00:00:00 2001
From: Dmitry Ivanov <ivadmi5@gmail.com>
Date: Tue, 15 Aug 2023 21:40:29 +0300
Subject: [PATCH] Handle more errors

---
 pgproto/src/lib.rs | 28 +++++++++++-----------------
 1 file changed, 11 insertions(+), 17 deletions(-)

diff --git a/pgproto/src/lib.rs b/pgproto/src/lib.rs
index b56ce0bc8f..79b7ece75b 100644
--- a/pgproto/src/lib.rs
+++ b/pgproto/src/lib.rs
@@ -1,4 +1,5 @@
 use bytes::{BufMut, BytesMut};
+use pgwire::messages::Message;
 use std::io::{self, Read};
 use tarantool::{
     coio::{CoIOListener, CoIOStream},
@@ -29,7 +30,7 @@ fn setup_logger() {
 #[tarantool::proc]
 fn server_start() {
     log::info!("starting server...");
-    let server = server_bind();
+    let server = server_bind(("127.0.0.1", 5432)).unwrap();
 
     // TODO: handle each client in a new fiber.
     while let Ok(s) = server.accept() {
@@ -37,27 +38,21 @@ fn server_start() {
     }
 }
 
-fn server_bind() -> CoIOListener {
+fn server_bind(addr: (&str, u16)) -> io::Result<CoIOListener> {
     let mut socket = None;
     let mut f = |_| {
-        let raw = match std::net::TcpListener::bind(("127.0.0.1", 5432)) {
-            Ok(listener) => listener,
-            Err(e) => {
-                log::error!("failed to bind postgres socket: {e}");
-                return -1;
-            }
-        };
-
-        log::info!("new postgres server: {raw:?}");
-        socket.replace(raw);
+        let wrapped = std::net::TcpListener::bind(addr);
+        log::info!("PG socket bind result: {wrapped:?}");
+        socket.replace(wrapped);
         0
     };
 
-    let res = tarantool::coio::coio_call(&mut f, ());
-    assert!(res == 0);
+    if tarantool::coio::coio_call(&mut f, ()) != 0 {
+        return Err(io::Error::last_os_error());
+    }
 
-    let socket = socket.expect("uninitialized socket");
-    tarantool::coio::CoIOListener::try_from(socket).unwrap()
+    let socket = socket.expect("uninitialized socket")?;
+    tarantool::coio::CoIOListener::try_from(socket)
 }
 
 fn handle_client(mut client: CoIOStream) {
@@ -66,7 +61,6 @@ fn handle_client(mut client: CoIOStream) {
     log::info!("read {cnt} bytes");
 
     log::info!("raw message: {buf:x?}");
-    use pgwire::messages::Message;
     let message = pgwire::messages::startup::Startup::decode(&mut buf)
         .unwrap()
         .unwrap();
-- 
GitLab