mirror of
https://gitlab.com/cryptsetup/cryptsetup.git
synced 2025-12-13 11:50:10 +01:00
Add interruptible variants of buffered io.
This commit is contained in:
committed by
Milan Broz
parent
bbf92828f6
commit
97ab7e9c65
@@ -30,7 +30,7 @@
|
|||||||
|
|
||||||
#include "utils_io.h"
|
#include "utils_io.h"
|
||||||
|
|
||||||
static ssize_t _read_buffer(int fd, void *buf, size_t length)
|
static ssize_t _read_buffer(int fd, void *buf, size_t length, volatile int *quit)
|
||||||
{
|
{
|
||||||
size_t read_size = 0;
|
size_t read_size = 0;
|
||||||
ssize_t r;
|
ssize_t r;
|
||||||
@@ -42,12 +42,12 @@ static ssize_t _read_buffer(int fd, void *buf, size_t length)
|
|||||||
r = read(fd, buf, length - read_size);
|
r = read(fd, buf, length - read_size);
|
||||||
if (r == -1 && errno != EINTR)
|
if (r == -1 && errno != EINTR)
|
||||||
return r;
|
return r;
|
||||||
if (r == 0)
|
|
||||||
return (ssize_t)read_size;
|
|
||||||
if (r > 0) {
|
if (r > 0) {
|
||||||
read_size += (size_t)r;
|
read_size += (size_t)r;
|
||||||
buf = (uint8_t*)buf + r;
|
buf = (uint8_t*)buf + r;
|
||||||
}
|
}
|
||||||
|
if (r == 0 || (quit && *quit))
|
||||||
|
return (ssize_t)read_size;
|
||||||
} while (read_size != length);
|
} while (read_size != length);
|
||||||
|
|
||||||
return (ssize_t)length;
|
return (ssize_t)length;
|
||||||
@@ -55,10 +55,15 @@ static ssize_t _read_buffer(int fd, void *buf, size_t length)
|
|||||||
|
|
||||||
ssize_t read_buffer(int fd, void *buf, size_t length)
|
ssize_t read_buffer(int fd, void *buf, size_t length)
|
||||||
{
|
{
|
||||||
return _read_buffer(fd, buf, length);
|
return _read_buffer(fd, buf, length, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t write_buffer(int fd, const void *buf, size_t length)
|
ssize_t read_buffer_intr(int fd, void *buf, size_t length, volatile int *quit)
|
||||||
|
{
|
||||||
|
return _read_buffer(fd, buf, length, quit);
|
||||||
|
}
|
||||||
|
|
||||||
|
static ssize_t _write_buffer(int fd, const void *buf, size_t length, volatile int *quit)
|
||||||
{
|
{
|
||||||
size_t write_size = 0;
|
size_t write_size = 0;
|
||||||
ssize_t w;
|
ssize_t w;
|
||||||
@@ -70,12 +75,12 @@ static ssize_t write_buffer(int fd, const void *buf, size_t length)
|
|||||||
w = write(fd, buf, length - write_size);
|
w = write(fd, buf, length - write_size);
|
||||||
if (w < 0 && errno != EINTR)
|
if (w < 0 && errno != EINTR)
|
||||||
return w;
|
return w;
|
||||||
if (w == 0)
|
|
||||||
return (ssize_t)write_size;
|
|
||||||
if (w > 0) {
|
if (w > 0) {
|
||||||
write_size += (size_t) w;
|
write_size += (size_t) w;
|
||||||
buf = (const uint8_t*)buf + w;
|
buf = (const uint8_t*)buf + w;
|
||||||
}
|
}
|
||||||
|
if (w == 0 || (quit && *quit))
|
||||||
|
return (ssize_t)write_size;
|
||||||
} while (write_size != length);
|
} while (write_size != length);
|
||||||
|
|
||||||
return (ssize_t)write_size;
|
return (ssize_t)write_size;
|
||||||
@@ -83,7 +88,12 @@ static ssize_t write_buffer(int fd, const void *buf, size_t length)
|
|||||||
|
|
||||||
ssize_t write_buffer(int fd, const void *buf, size_t length)
|
ssize_t write_buffer(int fd, const void *buf, size_t length)
|
||||||
{
|
{
|
||||||
return _write_buffer(fd, buf, length);
|
return _write_buffer(fd, buf, length, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
ssize_t write_buffer_intr(int fd, const void *buf, size_t length, volatile int *quit)
|
||||||
|
{
|
||||||
|
return _write_buffer(fd, buf, length, quit);
|
||||||
}
|
}
|
||||||
|
|
||||||
ssize_t write_blockwise(int fd, size_t bsize, size_t alignment,
|
ssize_t write_blockwise(int fd, size_t bsize, size_t alignment,
|
||||||
|
|||||||
@@ -27,7 +27,9 @@
|
|||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
ssize_t read_buffer(int fd, void *buf, size_t length);
|
ssize_t read_buffer(int fd, void *buf, size_t length);
|
||||||
|
ssize_t read_buffer_intr(int fd, void *buf, size_t length, volatile int *quit);
|
||||||
ssize_t write_buffer(int fd, const void *buf, size_t length);
|
ssize_t write_buffer(int fd, const void *buf, size_t length);
|
||||||
|
ssize_t write_buffer_intr(int fd, const void *buf, size_t length, volatile int *quit);
|
||||||
ssize_t write_blockwise(int fd, size_t bsize, size_t alignment,
|
ssize_t write_blockwise(int fd, size_t bsize, size_t alignment,
|
||||||
void *orig_buf, size_t length);
|
void *orig_buf, size_t length);
|
||||||
ssize_t read_blockwise(int fd, size_t bsize, size_t alignment,
|
ssize_t read_blockwise(int fd, size_t bsize, size_t alignment,
|
||||||
|
|||||||
Reference in New Issue
Block a user