bdecaa05de09a1936ffea0c6611f338134cacacd
[platform/upstream/multipath-tools.git] / libmpathpersist / mpath_updatepr.c
1 #include <stdio.h>
2 #include <unistd.h>
3 #include <stdlib.h>
4 #include <stdarg.h>
5 #include <fcntl.h>
6 #include <sys/ioctl.h>
7 #include <sys/types.h>
8 #include <sys/socket.h>
9 #include <sys/un.h>
10 #include <poll.h>
11 #include <errno.h>
12 #include <libudev.h>
13 #include <mpath_persist.h>
14 #include "debug.h"
15 #include "mpath_cmd.h"
16 #include "uxsock.h"
17 #include "mpathpr.h"
18
19
20 static int do_update_pr(char *alias, char *arg)
21 {
22         int fd;
23         char str[256];
24         char *reply;
25         int ret = 0;
26
27         fd = mpath_connect();
28         if (fd == -1) {
29                 condlog (0, "ux socket connect error");
30                 return -1;
31         }
32
33         snprintf(str,sizeof(str),"map %s %s", alias, arg);
34         condlog (2, "%s: pr message=%s", alias, str);
35         if (send_packet(fd, str) != 0) {
36                 condlog(2, "%s: message=%s send error=%d", alias, str, errno);
37                 mpath_disconnect(fd);
38                 return -1;
39         }
40         ret = recv_packet(fd, &reply, DEFAULT_REPLY_TIMEOUT);
41         if (ret < 0) {
42                 condlog(2, "%s: message=%s recv error=%d", alias, str, errno);
43                 ret = -1;
44         } else {
45                 condlog (2, "%s: message=%s reply=%s", alias, str, reply);
46                 if (reply && strncmp(reply,"ok", 2) == 0)
47                         ret = 0;
48                 else
49                         ret = -1;
50         }
51
52         free(reply);
53         mpath_disconnect(fd);
54         return ret;
55 }
56
57 int update_prflag(char *mapname, int set) {
58         return do_update_pr(mapname, (set)? "setprstatus" : "unsetprstatus");
59 }
60
61 int update_prkey_flags(char *mapname, uint64_t prkey, uint8_t sa_flags) {
62         char str[256];
63         char *flagstr = "";
64
65         if (sa_flags & MPATH_F_APTPL_MASK)
66                 flagstr = ":aptpl";
67         if (prkey)
68                 sprintf(str, "setprkey key %" PRIx64 "%s", prkey, flagstr);
69         else
70                 sprintf(str, "unsetprkey");
71         return do_update_pr(mapname, str);
72 }