@@ -28,6 +28,7 @@
#include "../libmultipath/debug.h"
#include "../libmultipath/util.h"
#include "../libmultipath/time-util.h"
+#include "../libmultipath/util.h"
struct rbd_checker_context;
typedef int (thread_fn)(struct rbd_checker_context *ct, char *msg);
@@ -356,21 +357,6 @@ static int rbd_check(struct rbd_checker_context *ct, char *msg)
return PATH_UP;
}
-static int safe_write(int fd, const void *buf, size_t count)
-{
- while (count > 0) {
- ssize_t r = write(fd, buf, count);
- if (r < 0) {
- if (errno == EINTR)
- continue;
- return -errno;
- }
- count -= r;
- buf = (char *)buf + r;
- }
- return 0;
-}
-
static int sysfs_write_rbd_bus(const char *which, const char *buf,
size_t buf_len)
{
@@ -19,6 +19,7 @@
#include "blacklist.h"
#include "defaults.h"
#include "prio.h"
+#include "util.h"
#include <errno.h>
#include <inttypes.h>
#include "mpath_cmd.h"
@@ -963,32 +964,15 @@ set_reservation_key(vector strvec, void *ptr)
{
unsigned char **uchar_ptr = (unsigned char **)ptr;
char *buff;
- char *tbuff;
- int j, k;
- int len;
+ int j;
uint64_t prkey;
buff = set_value(strvec);
if (!buff)
return 1;
- tbuff = buff;
-
- if (!memcmp("0x",buff, 2))
- buff = buff + 2;
-
- len = strlen(buff);
-
- k = strspn(buff, "0123456789aAbBcCdDeEfF");
-
- if (len != k) {
- FREE(tbuff);
- return 1;
- }
-
- if (1 != sscanf (buff, "%" SCNx64 "", &prkey))
- {
- FREE(tbuff);
+ if (parse_prkey(buff, &prkey) != 0) {
+ FREE(buff);
return 1;
}
@@ -1002,7 +986,7 @@ set_reservation_key(vector strvec, void *ptr)
prkey >>= 8;
}
- FREE(tbuff);
+ FREE(buff);
return 0;
}
@@ -11,6 +11,7 @@
#include <unistd.h>
#include <errno.h>
+#include "util.h"
#include "debug.h"
#include "memory.h"
#include "checkers.h"
@@ -416,3 +417,35 @@ int get_linux_version_code(void)
pthread_once(&_lvc_initialized, _set_linux_version_code);
return _linux_version_code;
}
+
+int parse_prkey(char *ptr, uint64_t *prkey)
+{
+ if (!ptr)
+ return 1;
+ if (*ptr == '0')
+ ptr++;
+ if (*ptr == 'x' || *ptr == 'X')
+ ptr++;
+ if (*ptr == '\0' || strlen(ptr) > 16)
+ return 1;
+ if (strlen(ptr) != strspn(ptr, "0123456789aAbBcCdDeEfF"))
+ return 1;
+ if (sscanf(ptr, "%" SCNx64 "", prkey) != 1)
+ return 1;
+ return 0;
+}
+
+int safe_write(int fd, const void *buf, size_t count)
+{
+ while (count > 0) {
+ ssize_t r = write(fd, buf, count);
+ if (r < 0) {
+ if (errno == EINTR)
+ continue;
+ return -errno;
+ }
+ count -= r;
+ buf = (char *)buf + r;
+ }
+ return 0;
+}
@@ -2,6 +2,7 @@
#define _UTIL_H
#include <sys/types.h>
+#include <inttypes.h>
size_t strchop(char *);
int basenamecpy (const char * src, char * dst, int);
@@ -16,6 +17,9 @@ char *parse_uid_attribute_by_attrs(char *uid_attrs, char *path_dev);
void setup_thread_attr(pthread_attr_t *attr, size_t stacksize, int detached);
int systemd_service_enabled(const char *dev);
int get_linux_version_code(void);
+int parse_prkey(char *ptr, uint64_t *prkey);
+int safe_write(int fd, const void *buf, size_t count);
+
#define KERNEL_VERSION(maj, min, ptc) ((((maj) * 256) + (min)) * 256 + (ptc))
#define safe_sprintf(var, format, args...) \
This patch just pulls safe_write out of rbd. and the persistent reservation key parsing code out of dict.c and puts them in util.c, so that other functions can make use of them. Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com> --- libmultipath/checkers/rbd.c | 16 +--------------- libmultipath/dict.c | 26 +++++--------------------- libmultipath/util.c | 33 +++++++++++++++++++++++++++++++++ libmultipath/util.h | 4 ++++ 4 files changed, 43 insertions(+), 36 deletions(-)