static int run_buffer(char *buffer)
{
__do_free char *output = NULL;
- int ret;
+ int fd, ret;
struct lxc_popen_FILE *f;
f = lxc_popen(buffer);
return -1;
}
- while (fgets(output, LXC_LOG_BUFFER_SIZE, f->f))
- DEBUG("Script %s with output: %s", buffer, output);
+ fd = fileno(f->f);
+ if (fd < 0) {
+ SYSERROR("Failed to retrieve underlying file descriptor");
+ lxc_pclose(f);
+ return -1;
+ }
+
+ for (int i = 0; i < 10; i++) {
+ ssize_t bytes_read;
+
+ bytes_read = lxc_read_nointr(fd, output, LXC_LOG_BUFFER_SIZE - 1);
+ if (bytes_read > 0) {
+ output[bytes_read] = '\0';
+ DEBUG("Script %s produced output: %s", buffer, output);
+ continue;
+ }
+
+ break;
+ }
ret = lxc_pclose(f);
if (ret == -1) {
return fcntl(fd, F_SETFD, FD_CLOEXEC);
}
-/* Struct to carry child pid from lxc_popen() to lxc_pclose().
- * Not an opaque struct to allow direct access to the underlying FILE *
- * (i.e., struct lxc_popen_FILE *file; fgets(buf, sizeof(buf), file->f))
- * without additional wrappers.
+/*
+ * Struct to carry child pid from lxc_popen() to lxc_pclose(). Not an opaque
+ * struct to allow direct access to the underlying FILE without additional
+ * wrappers.
*/
struct lxc_popen_FILE {
int pipe;