From ce6033fe95f4aeafeebfec22b9dc266f96a4af80 Mon Sep 17 00:00:00 2001 From: Levi Neely <141506390+lneely@users.noreply.github.com> Date: Tue, 11 Mar 2025 19:03:58 +0100 Subject: [PATCH] 130 use trustworthy location for log and socket (#134) * trustworthy location for log and socket - socket in => $HOME/.pcloud/prpc.sock (mode 0600) - debug log => $HOME/.pcloud/debug.log * documentation updates --- README.md | 177 +++++--------------------------- doc/BUILD.md | 35 +++++++ doc/CONTRIBUTING.md | 31 ++++++ doc/DEVICE-VALIDATION.md | 15 +++ doc/MBEDTLS-3.x.md | 34 ++++++ doc/USAGE.md | 69 +++++++++++++ doc/img/request-response-00.png | Bin 31444 -> 0 bytes doc/request-response.org | 36 ------- pclsync/plibs.c | 22 +++- pclsync/plibs.h | 2 - pclsync/prpc.c | 36 ++++++- pclsync/prpc.h | 5 +- pclsync/pshm.c | 12 +-- rpcclient.cpp | 8 +- rpcclient.h | 2 - 15 files changed, 273 insertions(+), 211 deletions(-) create mode 100644 doc/BUILD.md create mode 100644 doc/CONTRIBUTING.md create mode 100644 doc/DEVICE-VALIDATION.md create mode 100644 doc/MBEDTLS-3.x.md create mode 100644 doc/USAGE.md delete mode 100644 doc/img/request-response-00.png delete mode 100644 doc/request-response.org diff --git a/README.md b/README.md index ae8f591..08c96fd 100644 --- a/README.md +++ b/README.md @@ -1,166 +1,41 @@ -# pCloud Console Client (undead) +# Introduction -`pcloudcc` is simple **linux** console client for pCloud cloud storage derived from the console-client developed by pCloud. This version is independently maintained by me, whose only affiliation with pCloud is as a user of their services. Due credit goes to Anton Titov, Ivan Stoev, and pCloud. +`pcloudcc` is simple linux console client for pCloud cloud storage derived from the console-client developed by pCloud. This version is independently maintained by me, whose only affiliation with pCloud is as a user of their services. Due credit goes to Anton Titov, Ivan Stoev, and pCloud. -## mbedtls 3.x Migration Notice +# Supported Platforms & Distributions -`pcloudcc` now uses `mbedtls` version 3.x. This may already be included in your distribution, and if it is, you can ignore this section. If you're unlucky enough that your distribution still ships with `mbedtls` 2.x *(looking at you, Debian...)*, then try the following instructions. This has been tested on debian bookworm, **but you may have to adjust for your own distribution -- the command sequence below uses `apt` to install known build dependencies.** - -Without further ado, the first step is to build and install the `mbedtls` 3.x library on your host machine, hopefully without breaking the distribution version. Review the following commands, then copy and paste them into a terminal to run them. - -``` -sudo apt install python3 python3-pip python3-venv -mkdir -p $HOME/src; cd $HOME/src -git clone https://github.com/Mbed-TLS/mbedtls/ -cd mbedtls -git checkout tags/v3.6.2 -git submodule update --init -python3 -m venv ./venv -source ./venv/bin/activate -python3 -m pip install -r scripts/basic.requirements.txt -make -sudo make install -sudo ln -s /usr/local/include/mbedtls/ /usr/local/include/mbedtls3 -``` - -The symbolic link at the end resolves the ambiguity between `/usr/include/mbedtls` and `/usr/local/include/mbedtls`. Now, we need to make some edits to the Makefile and the source files to ensure that the build uses the correct `mbedtls` headers and libraries. We'll do this with `sed`, then run `make` as usual. - -``` -# run from the source root directory (e.g., pcloudcc-lneely) - -sed -i 's/-lmbedtls/-l:libmbedtls.a/;s/-lmbedcrypto/-l:libmbedcrypto.a/;s/-lmbedx509/-l:libmbedx509.a/' Makefile -sed -i '5s/$/ -I\/usr\/local\/include/' Makefile -sed -i '10s/$/ -L\/usr\/local\/lib\//' Makefile -find . -type f -name "*.[ch]" -exec sed -i 's/#include ` to enable a SOCKS proxy on `localhost:`. Configure your local web browser to use `localhost:` as its proxy, then log in to pcloud.com and validate the device. *Do not forget to remove the proxy from your browser configuration when done.* - -## Supported Distributions & Packages +The target operating system and platform for this program is `linux/amd64`, and has been reported to work on `linux/aarch64`. Program behavior on 32-bit architectures is [considered undefined](https://github.com/lneely/pcloudcc-lneely/issues/85). I aim to support as many distributions as possible, and maintain an [AUR](https://aur.archlinux.org/packages/pcloudcc-lneely) package. I do not plan on providing or maintaining any other packages, but encourage anyone interested in doing so for their own distributions. -## Dependencies -- zlib (-lz) -- boost (-lboost_system, -lboost_program_options) -- pthread (lpthread) -- udev (-ludev) -- fuse (-lfuse) -- sqlite (-lsqlite3) -- mbedtls (-lmbedtls -lmbedcrypto -lmbedx509) -- readline (-lreadline) +# Notices -## Building +## Security Notice -``` -make -``` +My code audits are best-effort, and I make security enhancements as I identify problems. However, I *do not* promise that this program is free of even older and well-known security vulnerabilities. Therefore, I recommend using this program only on a *trusted single-user* system. **Security-related code audits and contributions are most welcome!** -### Build Options +## Pending Transfers -``` -make BUILD=debug # include debug symbols, ASan instrumentation. (default: release) -make STATIC=0 # dynamically link libpcloudcc_lib.so. (default: 1) -make SCAN=1 # run code analysis; recommend CC=clang and CXX=clang++. (default: 0) -make CC=clang CXX=clang++ # use clang instead of gcc (default: gcc,g++) -make DESTDIR=/prefix # installation prefix (default: /usr/local/bin) -``` - -## Usage - -### Getting Help - -Terminal command is pcloudcc and -h option prints short options description. - -> pcloudcc -h - -### First Use - -Start the service in the foreground using the -p switch to enter your -password, and the -s switch to save the password to the -database. Verify that file system starts and mounts normally after the - -> pcloudcc -u example@myemail.com -p -s - -Optionally specify your own mount point. - -> pcloudcc -u example@myemail.com -p -s -m /path/to/mountpoint - -### Registration (UNTESTED) - -If you don't have existing user use -n switch to register new user: - -> pcloudcc -u example@myemail.com -p -s -n - -Notice that a new user may take a while to mount. Please, be patient. - -### Run as Daemon - -If you have saved your password, then you can run pcloudcc as a -background daemon. Verify the filesystem is mounted when the daemon -starts. - -> pcloudcc -u example@myemail.com -d - -### Command Prompt - -Use the command prompt to interact with a running daemon. - -> pcloudcc -k - -Command Reference: - -``` - help(?): Show this help message - crypto(c): - start : Unlock crypto folder - stop: Lock crypto folder - sync(s): - list(ls): List sync folders - add : Add sync folder - remove(rm) : Remove sync folder - finalize(f): Kill daemon and quit - quit(q): Exit this program -``` - -**Note**. Command line arguments that include special characters (e.g., the - `crypto start` password or paths with spaces) must be quoted or - escaped. In other words, instead of: - - `startcrypto Str0ng p4$$word 4 great jUSTicE!` - - One must now type, for example: - - `c start 'Str0ng p4$$word 4 great jUSTicE!'` - - If the password includes quotes for some reason, then those characters must - be escaped properly. - -## Warning - -**Stopping daemon will break pending background transfers!** +Stopping the daemon will break pending background transfers! `pcloudcc` does not currently provide a command to check for pending transfers. You can currently check this by ensuring there is only one file named `cached` in `~/.pcloud/Cache`. Usually this is a large file. +# See Also + +- [Contributing](./doc/CONTRIBUTING.md): Read this if you're interested in + helping out. **Short version**: do your best to write good code, be + courteous to maintainers, and most importantly: have fun! + +- [Building](./doc/BUILD.md): Read this if you're not sure how to build + `pcloudcc`. For most users, `make` and `make install` are enough. + +- [mbedtls 3.x migration notes](./doc/MBEDTLS-3.x.md): Read this if you use an + older distribution such as `debian:bookworm` and encounter build problems. + +- [Device Validation Guide](./doc/DEVICE-VALIDATION.md): Read this if you're + running `pcloudcc` and encounter device validation-related errors. + +- [Usage Guide](./doc/USAGE.md): Read this if you're unsure how to start using + `pcloudcc`. \ No newline at end of file diff --git a/doc/BUILD.md b/doc/BUILD.md new file mode 100644 index 0000000..b235a97 --- /dev/null +++ b/doc/BUILD.md @@ -0,0 +1,35 @@ +# Dependencies +- zlib (-lz) +- boost (-lboost_system, -lboost_program_options) +- pthread (lpthread) +- udev (-ludev) +- fuse (-lfuse) +- sqlite (-lsqlite3) +- mbedtls (-lmbedtls -lmbedcrypto -lmbedx509) +- readline (-lreadline) + +# Building +``` +make +``` + +(norly! 🦉) + +# Installing +``` +sudo make install +``` + +Specify `DESTDIR` to install to a prefix other than `/usr/local` (see [[#Build Options]]). + +# Build Options + +Use the following options to influence the build process. + +``` +make BUILD=debug # include debug symbols, ASan instrumentation. (default: release) +make STATIC=0 # dynamically link libpcloudcc_lib.so. (default: 1) +make SCAN=1 # run code analysis; recommend CC=clang and CXX=clang++. (default: 0) +make CC=clang CXX=clang++ # use clang instead of gcc (default: gcc,g++) +make DESTDIR=/prefix # installation prefix (default: /usr/local/bin) +``` diff --git a/doc/CONTRIBUTING.md b/doc/CONTRIBUTING.md new file mode 100644 index 0000000..ca1b90d --- /dev/null +++ b/doc/CONTRIBUTING.md @@ -0,0 +1,31 @@ +# Contributing to pcloudcc + +Contributions are welcome and appreciated, and this guide is intentionally short and open-ended. This document assumes you are familiar with GitHub contribution mechanisms. If you need help or clarification, feel free to ask. + +# Coding Guide + +Contributors should aim to produce robust, maintainable software that is +enjoyable to work with. In service of this goal, consider the following +guidelines: + +1. Choose simple solutions over clever ones. + +2. Choose readability over a smaller line count. + +3. Choose short names that convey meaning in context. + +4. Imitate the coding style in the file you're working on, and use your +judgment. + +5. Specification comments are helpful in headers, but should be a last resort +in implementation (see points 1 and 2). + +6. Please be courteous to maintainers by making changes as small as necessary, +and by maintaining a clean and linear commit history. + +Look to the `pshm` library to illustrate (however imperfectly) how I am +applying these principles. + +# Code of Conduct + +Building software should be enjoyable and fun for *all* involved. Make it so 🖖. diff --git a/doc/DEVICE-VALIDATION.md b/doc/DEVICE-VALIDATION.md new file mode 100644 index 0000000..d8cf351 --- /dev/null +++ b/doc/DEVICE-VALIDATION.md @@ -0,0 +1,15 @@ +# Validating Your Device + +pCloud requires "first time" validation for all devices. In the standard use case, where the user is running `pcloudcc` on the same host s/he normally works on, this can be completed by simply logging into pcloud.com using the web browser (and often, it already has been). Non-standard use cases (e.g., running `pcloudcc` on a remote server) require a different approach. + +# Workarounds + +Props to [@tieum](https://github.com/tieum), [@ebouda333](https://github.com/ebouda33), [@CorvusCorax](https://github.com/CorvusCorax), and [@tomash](https://github.com/tomash) for suggesting the following workarounds: + +**Dockerized Carbonyl**. *Requires Docker or Podman on the host.*. Run [carbonyl](https://github.com/fathyb/carbonyl) in a container on the target host to complete the validation. + +``` +docker run --network host --rm -ti fathyb/carbonyl https://my.pcloud.com +``` + +**SOCKS proxy over SSH** *Requires TCP port forwarding over SSH*. Log in to the remote host using the command `ssh -D ` to enable a SOCKS proxy on `localhost:`. Configure your local web browser to use `localhost:` as its proxy, then log in to pcloud.com and validate the device. *Do not forget to remove the proxy from your browser configuration when done.* diff --git a/doc/MBEDTLS-3.x.md b/doc/MBEDTLS-3.x.md new file mode 100644 index 0000000..66eaff5 --- /dev/null +++ b/doc/MBEDTLS-3.x.md @@ -0,0 +1,34 @@ +## mbedtls 3.x Migration Notice + +`pcloudcc` now uses `mbedtls` version 3.x. This may already be included in your distribution, and if it is, you can ignore this section. If you're unlucky enough that your distribution still ships with `mbedtls` 2.x *(looking at you, Debian...)*, then try the following instructions. This has been tested on debian bookworm, **but you may have to adjust for your own distribution -- the command sequence below uses `apt` to install known build dependencies.** + +Without further ado, the first step is to build and install the `mbedtls` 3.x library on your host machine, hopefully without breaking the distribution version. Review the following commands, then copy and paste them into a terminal to run them. + +``` +sudo apt install python3 python3-pip python3-venv +mkdir -p $HOME/src; cd $HOME/src +git clone https://github.com/Mbed-TLS/mbedtls/ +cd mbedtls +git checkout tags/v3.6.2 +git submodule update --init +python3 -m venv ./venv +source ./venv/bin/activate +python3 -m pip install -r scripts/basic.requirements.txt +make +sudo make install +sudo ln -s /usr/local/include/mbedtls/ /usr/local/include/mbedtls3 +``` + +The symbolic link at the end resolves the ambiguity between `/usr/include/mbedtls` and `/usr/local/include/mbedtls`. Now, we need to make some edits to the Makefile and the source files to ensure that the build uses the correct `mbedtls` headers and libraries. We'll do this with `sed`, then run `make` as usual. + +``` +# run from the source root directory (e.g., pcloudcc-lneely) + +sed -i 's/-lmbedtls/-l:libmbedtls.a/;s/-lmbedcrypto/-l:libmbedcrypto.a/;s/-lmbedx509/-l:libmbedx509.a/' Makefile +sed -i '5s/$/ -I\/usr\/local\/include/' Makefile +sed -i '10s/$/ -L\/usr\/local\/lib\//' Makefile +find . -type f -name "*.[ch]" -exec sed -i 's/#include pcloudcc -h + +## First Use + +Start the service in the foreground using the -p switch to enter your +password, and the -s switch to save the password to the +database. Verify that file system starts and mounts normally after the + +> pcloudcc -u example@myemail.com -p -s + +Optionally specify your own mount point. + +> pcloudcc -u example@myemail.com -p -s -m /path/to/mountpoint + +## Registration (UNTESTED) + +If you don't have existing user use -n switch to register new user: + +> pcloudcc -u example@myemail.com -p -s -n + +Notice that a new user may take a while to mount. Please, be patient. + +## Run as Daemon + +If you have saved your password, then you can run pcloudcc as a +background daemon. Verify the filesystem is mounted when the daemon +starts. + +> pcloudcc -u example@myemail.com -d + +## Command Prompt + +Use the command prompt to interact with a running daemon. + +> pcloudcc -k + +Command Reference: + +``` + help(?): Show this help message + crypto(c): + start : Unlock crypto folder + stop: Lock crypto folder + sync(s): + list(ls): List sync folders + add : Add sync folder + remove(rm) : Remove sync folder + finalize(f): Kill daemon and quit + quit(q): Exit this program +``` + +**Note**. Command line arguments that include special characters (e.g., the + `crypto start` password or paths with spaces) must be quoted or + escaped. In other words, instead of: + + `startcrypto Str0ng p4$$word 4 great jUSTicE!` + + One must now type, for example: + + `c start 'Str0ng p4$$word 4 great jUSTicE!'` + + If the password includes quotes for some reason, then those characters must + be escaped properly. diff --git a/doc/img/request-response-00.png b/doc/img/request-response-00.png deleted file mode 100644 index 560d0a9528572e6020f5c18806b1fe892528d61f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31444 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, this starts -the server. The server listens for request messages and sends back -response messages. - -When the user runs ~pcloudcc -k~, this starts the client's command -line interface. The client sends request messages to and expects a -corresponding response message from the server. - -The client and server send and receive messages over a Unix socket -that gets created when the server is started. - -#+begin_src plantuml :file img/request-response-00.png :export results - participant user - participant control_tools <> - participant overlay_client <> - participant socket <> - participant poverlay <> - - user -> control_tools: input command - control_tools -> control_tools : parse command - control_tools -> overlay_client : SendCall(msgType, reqData, ...) - overlay_client -> socket : write_request - socket -> poverlay : request - poverlay -> poverlay : poverlay_handle_request - poverlay -> poverlay : poverlay_get_response - poverlay -> socket : response - socket -> overlay_client : read_response - overlay_client -> control_tools : (msg, msgsz, payload, payloadsz) - control_tools -> user : print results -#+end_src - -[[file:img/request-response-00.png]] - diff --git a/pclsync/plibs.c b/pclsync/plibs.c index c2865d1..e5d8988 100644 --- a/pclsync/plibs.c +++ b/pclsync/plibs.c @@ -34,6 +34,7 @@ #include "pdatabase.h" #include "plocks.h" #include "pnetlibs.h" +#include "ppath.h" #include "prun.h" #include "psettings.h" #include "ptimer.h" @@ -2575,6 +2576,23 @@ static void time_format(time_t tm, unsigned long ns, char *result) { memcpy(result, " +0000", 7); // copies the null byte } +char *psync_debug_path() { + char *home = ppath_home(); + if (!home) { + return NULL; + } + + const char *subdir = "/.pcloud/debug.log"; + size_t len = strlen(home) + strlen(subdir) + 1; + char *sockpath = (char *)malloc(len); + if (!sockpath) { + return NULL; + } + + snprintf(sockpath, len, "%s%s", home, subdir); + return sockpath; +} + int psync_debug(const char *file, const char *function, int unsigned line, int unsigned level, const char *fmt, ...) { if (!IS_DEBUG) @@ -2599,7 +2617,9 @@ int psync_debug(const char *file, const char *function, int unsigned line, break; } if (unlikely(!log)) { - log = fopen(DEBUG_FILE, "a+"); + char *path = psync_debug_path(); + log = fopen(path, "a+"); + free(path); if (!log) return 1; } diff --git a/pclsync/plibs.h b/pclsync/plibs.h index 835ec9a..e40f3b5 100644 --- a/pclsync/plibs.h +++ b/pclsync/plibs.h @@ -71,8 +71,6 @@ extern "C" { #define IS_DEBUG (DEBUG_LEVEL >= D_WARNING) -#define DEBUG_FILE "/tmp/psync_err.log" - #if defined(assert) #undef assert #endif diff --git a/pclsync/prpc.c b/pclsync/prpc.c index 963a8cd..12a0f88 100644 --- a/pclsync/prpc.c +++ b/pclsync/prpc.c @@ -40,11 +40,13 @@ #include #include #include +#include #include #include #include #include "prpc.h" +#include "ppath.h" #include "ppathstatus.h" #include "plibs.h" @@ -228,22 +230,29 @@ void prpc_main_loop() { struct sockaddr_un addr; int fd, cl; + char *sockpath = prpc_sockpath(); if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) { - debug(D_ERROR, "Unix socket error failed to open %s", PRPC_SOCK_PATH); + debug(D_ERROR, "Unix socket error failed to open %s", sockpath); + return; + } + + if (fchmod(fd, 0600) == -1) { + debug(D_ERROR, "Failed to set socket permissions"); return; } memset(&addr, 0, sizeof(addr)); addr.sun_family = AF_UNIX; - strncpy(addr.sun_path, PRPC_SOCK_PATH, sizeof(addr.sun_path) - 1); + strncpy(addr.sun_path, sockpath, sizeof(addr.sun_path) - 1); - unlink(PRPC_SOCK_PATH); + unlink(sockpath); - if (bind(fd, (struct sockaddr *)&addr, - strlen(PRPC_SOCK_PATH) + sizeof(addr.sun_family)) == -1) { + if (bind(fd, (struct sockaddr *)&addr, strlen(sockpath) + sizeof(addr.sun_family)) == -1) { debug(D_ERROR, "Unix socket bind error"); return; } + + free(sockpath); if (listen(fd, 5) == -1) { debug(D_ERROR, "Unix socket listen error"); @@ -286,3 +295,20 @@ void prpc_init() { handlers = (prpc_handler *)psync_malloc(sizeof(prpc_handler) * handlers_size); memset(handlers, 0, sizeof(prpc_handler) * handlers_size); } + +char *prpc_sockpath() { + char *home = ppath_home(); + if (!home) { + return NULL; + } + + const char *subdir = "/.pcloud/prpc.sock"; + size_t len = strlen(home) + strlen(subdir) + 1; + char *sockpath = (char *)malloc(len); + if (!sockpath) { + return NULL; + } + + snprintf(sockpath, len, "%s%s", home, subdir); + return sockpath; +} diff --git a/pclsync/prpc.h b/pclsync/prpc.h index ceb917c..e7bb076 100644 --- a/pclsync/prpc.h +++ b/pclsync/prpc.h @@ -39,10 +39,6 @@ extern "C" { #include -#ifndef PRPC_SOCK_PATH -#define PRPC_SOCK_PATH "/tmp/pcloud_unix_soc.sock" -#endif - typedef struct _rpc_message_t { uint32_t type; uint64_t length; @@ -69,6 +65,7 @@ typedef int (*prpc_handler)(const char *); void prpc_main_loop(void); void prpc_init(); int prpc_register(int cmdid, prpc_handler h); +char *prpc_sockpath(); #ifdef __cplusplus } diff --git a/pclsync/pshm.c b/pclsync/pshm.c index 6eeb71f..9b8e64e 100644 --- a/pclsync/pshm.c +++ b/pclsync/pshm.c @@ -11,7 +11,7 @@ #include "ppath.h" #include "plibs.h" -key_t pshm_get_key() { +static key_t get_key() { char path[PATH_MAX]; char *home; @@ -25,10 +25,10 @@ key_t pshm_get_key() { return ftok(path, 'A'); } -int pshm_getid() { +static int get_id() { key_t key; - key = pshm_get_key(); + key = get_key(); if(key == -1) { debug(D_ERROR, "failed to get ipc key"); return -1; @@ -43,7 +43,7 @@ bool pshm_read(void **data, size_t *datasz) { int flag; char *dataArea; - shmid = pshm_getid(); + shmid = get_id(); if (shmid == -1) { debug(D_ERROR, "Failed to get shared memory ID"); return false; @@ -91,7 +91,7 @@ void pshm_write(const void *data, size_t datasz) { return; } - shmid = pshm_getid(); + shmid = get_id(); if (shmid == -1) { debug(D_ERROR, "Failed to get shared memory ID"); return; @@ -125,5 +125,5 @@ void pshm_write(const void *data, size_t datasz) { } int pshm_cleanup() { - return shmctl(pshm_getid(), IPC_RMID, NULL); + return shmctl(get_id(), IPC_RMID, NULL); } \ No newline at end of file diff --git a/rpcclient.cpp b/rpcclient.cpp index 5641db4..c6991bf 100644 --- a/rpcclient.cpp +++ b/rpcclient.cpp @@ -24,9 +24,7 @@ #define POVERLAY_READ_INCOMPLETE -105 #define POVERLAY_READ_INVALID_RESPONSE -106 -RpcClient::RpcClient() { - this->sockpath = "/tmp/pcloud_unix_soc.sock"; -} +RpcClient::RpcClient() {} RpcClient::~RpcClient() {} @@ -163,7 +161,9 @@ int RpcClient::Call(int id, const char *path, char **errm, size_t *errmsz) { int result = 0; int sockfd = -1; - sockfd = this->connectSocket(PRPC_SOCK_PATH, errm, errmsz); + char *sockpath = prpc_sockpath(); + sockfd = this->connectSocket(sockpath, errm, errmsz); + free(sockpath); if (sockfd >= 0) { if ((result = this->writeRequest(sockfd, id, path, errm, errmsz)) == 0) { result = this->readResponse(sockfd, errm, errmsz); diff --git a/rpcclient.h b/rpcclient.h index be42ccc..4c11f23 100644 --- a/rpcclient.h +++ b/rpcclient.h @@ -13,8 +13,6 @@ typedef enum _pCloud_FileState { class RpcClient { private: - const char *sockpath; - int connectSocket(const char *sockpath, char **out, size_t *out_size); int writeRequest(int fd, int msgtype, const char *value, char **out, size_t *out_size); int readResponse(int fd, char **out, size_t *out_size);