shared: move nm_utils_fd_*() from src/ to shared/nm-utils/
The functions are general purpose and independent from NetworkManager core. Move them to "shared/nm-utils/" so they can be used independently.
This commit is contained in:
@@ -25,6 +25,7 @@
|
|||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
|
#include <poll.h>
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
@@ -992,3 +993,99 @@ nm_utils_str_utf8safe_escape_take (char *str, NMUtilsStrUtf8SafeFlags flags)
|
|||||||
}
|
}
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
/* taken from systemd's fd_wait_for_event(). Note that the timeout
|
||||||
|
* is here in nano-seconds, not micro-seconds. */
|
||||||
|
int
|
||||||
|
nm_utils_fd_wait_for_event (int fd, int event, gint64 timeout_ns)
|
||||||
|
{
|
||||||
|
struct pollfd pollfd = {
|
||||||
|
.fd = fd,
|
||||||
|
.events = event,
|
||||||
|
};
|
||||||
|
struct timespec ts, *pts;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
if (timeout_ns < 0)
|
||||||
|
pts = NULL;
|
||||||
|
else {
|
||||||
|
ts.tv_sec = (time_t) (timeout_ns / NM_UTILS_NS_PER_SECOND);
|
||||||
|
ts.tv_nsec = (long int) (timeout_ns % NM_UTILS_NS_PER_SECOND);
|
||||||
|
pts = &ts;
|
||||||
|
}
|
||||||
|
|
||||||
|
r = ppoll (&pollfd, 1, pts, NULL);
|
||||||
|
if (r < 0)
|
||||||
|
return -errno;
|
||||||
|
if (r == 0)
|
||||||
|
return 0;
|
||||||
|
return pollfd.revents;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* taken from systemd's loop_read() */
|
||||||
|
ssize_t
|
||||||
|
nm_utils_fd_read_loop (int fd, void *buf, size_t nbytes, bool do_poll)
|
||||||
|
{
|
||||||
|
uint8_t *p = buf;
|
||||||
|
ssize_t n = 0;
|
||||||
|
|
||||||
|
g_return_val_if_fail (fd >= 0, -EINVAL);
|
||||||
|
g_return_val_if_fail (buf, -EINVAL);
|
||||||
|
|
||||||
|
/* If called with nbytes == 0, let's call read() at least
|
||||||
|
* once, to validate the operation */
|
||||||
|
|
||||||
|
if (nbytes > (size_t) SSIZE_MAX)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
do {
|
||||||
|
ssize_t k;
|
||||||
|
|
||||||
|
k = read (fd, p, nbytes);
|
||||||
|
if (k < 0) {
|
||||||
|
if (errno == EINTR)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (errno == EAGAIN && do_poll) {
|
||||||
|
|
||||||
|
/* We knowingly ignore any return value here,
|
||||||
|
* and expect that any error/EOF is reported
|
||||||
|
* via read() */
|
||||||
|
|
||||||
|
(void) nm_utils_fd_wait_for_event (fd, POLLIN, -1);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
return n > 0 ? n : -errno;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (k == 0)
|
||||||
|
return n;
|
||||||
|
|
||||||
|
g_assert ((size_t) k <= nbytes);
|
||||||
|
|
||||||
|
p += k;
|
||||||
|
nbytes -= k;
|
||||||
|
n += k;
|
||||||
|
} while (nbytes > 0);
|
||||||
|
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* taken from systemd's loop_read_exact() */
|
||||||
|
int
|
||||||
|
nm_utils_fd_read_loop_exact (int fd, void *buf, size_t nbytes, bool do_poll)
|
||||||
|
{
|
||||||
|
ssize_t n;
|
||||||
|
|
||||||
|
n = nm_utils_fd_read_loop (fd, buf, nbytes, do_poll);
|
||||||
|
if (n < 0)
|
||||||
|
return (int) n;
|
||||||
|
if ((size_t) n != nbytes)
|
||||||
|
return -EIO;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -394,4 +394,16 @@ char *nm_utils_str_utf8safe_escape_take (char *str, NMUtilsStrUtf8SafeFlags flag
|
|||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
#define NM_UTILS_NS_PER_SECOND ((gint64) 1000000000)
|
||||||
|
#define NM_UTILS_NS_PER_MSEC ((gint64) 1000000)
|
||||||
|
#define NM_UTILS_NS_TO_MSEC_CEIL(nsec) (((nsec) + (NM_UTILS_NS_PER_MSEC - 1)) / NM_UTILS_NS_PER_MSEC)
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
int nm_utils_fd_wait_for_event (int fd, int event, gint64 timeout_ns);
|
||||||
|
ssize_t nm_utils_fd_read_loop (int fd, void *buf, size_t nbytes, bool do_poll);
|
||||||
|
int nm_utils_fd_read_loop_exact (int fd, void *buf, size_t nbytes, bool do_poll);
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
#endif /* __NM_SHARED_UTILS_H__ */
|
#endif /* __NM_SHARED_UTILS_H__ */
|
||||||
|
@@ -26,7 +26,6 @@
|
|||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <poll.h>
|
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <resolv.h>
|
#include <resolv.h>
|
||||||
@@ -2699,99 +2698,6 @@ nm_utils_machine_id_read (void)
|
|||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
/* taken from systemd's fd_wait_for_event(). Note that the timeout
|
|
||||||
* is here in nano-seconds, not micro-seconds. */
|
|
||||||
int
|
|
||||||
nm_utils_fd_wait_for_event (int fd, int event, gint64 timeout_ns)
|
|
||||||
{
|
|
||||||
struct pollfd pollfd = {
|
|
||||||
.fd = fd,
|
|
||||||
.events = event,
|
|
||||||
};
|
|
||||||
struct timespec ts, *pts;
|
|
||||||
int r;
|
|
||||||
|
|
||||||
if (timeout_ns < 0)
|
|
||||||
pts = NULL;
|
|
||||||
else {
|
|
||||||
ts.tv_sec = (time_t) (timeout_ns / NM_UTILS_NS_PER_SECOND);
|
|
||||||
ts.tv_nsec = (long int) (timeout_ns % NM_UTILS_NS_PER_SECOND);
|
|
||||||
pts = &ts;
|
|
||||||
}
|
|
||||||
|
|
||||||
r = ppoll (&pollfd, 1, pts, NULL);
|
|
||||||
if (r < 0)
|
|
||||||
return -errno;
|
|
||||||
if (r == 0)
|
|
||||||
return 0;
|
|
||||||
return pollfd.revents;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* taken from systemd's loop_read() */
|
|
||||||
ssize_t
|
|
||||||
nm_utils_fd_read_loop (int fd, void *buf, size_t nbytes, bool do_poll)
|
|
||||||
{
|
|
||||||
uint8_t *p = buf;
|
|
||||||
ssize_t n = 0;
|
|
||||||
|
|
||||||
g_return_val_if_fail (fd >= 0, -EINVAL);
|
|
||||||
g_return_val_if_fail (buf, -EINVAL);
|
|
||||||
|
|
||||||
/* If called with nbytes == 0, let's call read() at least
|
|
||||||
* once, to validate the operation */
|
|
||||||
|
|
||||||
if (nbytes > (size_t) SSIZE_MAX)
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
do {
|
|
||||||
ssize_t k;
|
|
||||||
|
|
||||||
k = read (fd, p, nbytes);
|
|
||||||
if (k < 0) {
|
|
||||||
if (errno == EINTR)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (errno == EAGAIN && do_poll) {
|
|
||||||
|
|
||||||
/* We knowingly ignore any return value here,
|
|
||||||
* and expect that any error/EOF is reported
|
|
||||||
* via read() */
|
|
||||||
|
|
||||||
(void) nm_utils_fd_wait_for_event (fd, POLLIN, -1);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
return n > 0 ? n : -errno;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (k == 0)
|
|
||||||
return n;
|
|
||||||
|
|
||||||
g_assert ((size_t) k <= nbytes);
|
|
||||||
|
|
||||||
p += k;
|
|
||||||
nbytes -= k;
|
|
||||||
n += k;
|
|
||||||
} while (nbytes > 0);
|
|
||||||
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* taken from systemd's loop_read_exact() */
|
|
||||||
int
|
|
||||||
nm_utils_fd_read_loop_exact (int fd, void *buf, size_t nbytes, bool do_poll)
|
|
||||||
{
|
|
||||||
ssize_t n;
|
|
||||||
|
|
||||||
n = nm_utils_fd_read_loop (fd, buf, nbytes, do_poll);
|
|
||||||
if (n < 0)
|
|
||||||
return (int) n;
|
|
||||||
if ((size_t) n != nbytes)
|
|
||||||
return -EIO;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
_nm_printf (3, 4)
|
_nm_printf (3, 4)
|
||||||
static int
|
static int
|
||||||
_get_contents_error (GError **error, int errsv, const char *format, ...)
|
_get_contents_error (GError **error, int errsv, const char *format, ...)
|
||||||
|
@@ -240,10 +240,6 @@ int nm_utils_cmp_connection_by_autoconnect_priority (NMConnection *a, NMConnecti
|
|||||||
|
|
||||||
void nm_utils_log_connection_diff (NMConnection *connection, NMConnection *diff_base, guint32 level, guint64 domain, const char *name, const char *prefix);
|
void nm_utils_log_connection_diff (NMConnection *connection, NMConnection *diff_base, guint32 level, guint64 domain, const char *name, const char *prefix);
|
||||||
|
|
||||||
#define NM_UTILS_NS_PER_SECOND ((gint64) 1000000000)
|
|
||||||
#define NM_UTILS_NS_PER_MSEC ((gint64) 1000000)
|
|
||||||
#define NM_UTILS_NS_TO_MSEC_CEIL(nsec) (((nsec) + (NM_UTILS_NS_PER_MSEC - 1)) / NM_UTILS_NS_PER_MSEC)
|
|
||||||
|
|
||||||
gint64 nm_utils_get_monotonic_timestamp_ns (void);
|
gint64 nm_utils_get_monotonic_timestamp_ns (void);
|
||||||
gint64 nm_utils_get_monotonic_timestamp_us (void);
|
gint64 nm_utils_get_monotonic_timestamp_us (void);
|
||||||
gint64 nm_utils_get_monotonic_timestamp_ms (void);
|
gint64 nm_utils_get_monotonic_timestamp_ms (void);
|
||||||
@@ -257,10 +253,6 @@ const char *nm_utils_ip4_property_path (const char *ifname, const char *property
|
|||||||
|
|
||||||
gboolean nm_utils_is_specific_hostname (const char *name);
|
gboolean nm_utils_is_specific_hostname (const char *name);
|
||||||
|
|
||||||
int nm_utils_fd_wait_for_event (int fd, int event, gint64 timeout_ns);
|
|
||||||
ssize_t nm_utils_fd_read_loop (int fd, void *buf, size_t nbytes, bool do_poll);
|
|
||||||
int nm_utils_fd_read_loop_exact (int fd, void *buf, size_t nbytes, bool do_poll);
|
|
||||||
|
|
||||||
int nm_utils_fd_get_contents (int fd,
|
int nm_utils_fd_get_contents (int fd,
|
||||||
gsize max_length,
|
gsize max_length,
|
||||||
char **contents,
|
char **contents,
|
||||||
|
Reference in New Issue
Block a user