remote_bitbang: De-duplicate init code and clean up on error
[fw/openocd] / src / jtag / drivers / remote_bitbang.c
index 2151d049e5c6074e33fae79c749533e7261d8ffa..11a07883931d7d3d9f025317b65230f330455c20 100644 (file)
@@ -173,20 +173,7 @@ static int remote_bitbang_init_tcp(void)
                return ERROR_FAIL;
        }
 
-       remote_bitbang_in = fdopen(fd, "r");
-       if (remote_bitbang_in == NULL) {
-               LOG_ERROR("fdopen: failed to open read stream");
-               return ERROR_FAIL;
-       }
-
-       remote_bitbang_out = fdopen(fd, "w");
-       if (remote_bitbang_out == NULL) {
-               LOG_ERROR("fdopen: failed to open write stream");
-               return ERROR_FAIL;
-       }
-
-       LOG_INFO("remote_bitbang driver initialized");
-       return ERROR_OK;
+       return fd;
 }
 
 static int remote_bitbang_init_unix(void)
@@ -213,15 +200,34 @@ static int remote_bitbang_init_unix(void)
                return ERROR_FAIL;
        }
 
+       return fd;
+}
+
+static int remote_bitbang_init(void)
+{
+       int fd;
+       bitbang_interface = &remote_bitbang_bitbang;
+
+       LOG_INFO("Initializing remote_bitbang driver");
+       if (remote_bitbang_port == NULL)
+               fd = remote_bitbang_init_unix();
+       else
+               fd = remote_bitbang_init_tcp();
+
+       if (fd < 0)
+               return fd;
+
        remote_bitbang_in = fdopen(fd, "r");
        if (remote_bitbang_in == NULL) {
                LOG_ERROR("fdopen: failed to open read stream");
+               close(fd);
                return ERROR_FAIL;
        }
 
        remote_bitbang_out = fdopen(fd, "w");
        if (remote_bitbang_out == NULL) {
                LOG_ERROR("fdopen: failed to open write stream");
+               fclose(remote_bitbang_in);
                return ERROR_FAIL;
        }
 
@@ -229,16 +235,6 @@ static int remote_bitbang_init_unix(void)
        return ERROR_OK;
 }
 
-static int remote_bitbang_init(void)
-{
-       bitbang_interface = &remote_bitbang_bitbang;
-
-       LOG_INFO("Initializing remote_bitbang driver");
-       if (remote_bitbang_port == NULL)
-               return remote_bitbang_init_unix();
-       return remote_bitbang_init_tcp();
-}
-
 COMMAND_HANDLER(remote_bitbang_handle_remote_bitbang_port_command)
 {
        if (CMD_ARGC == 1) {