Skip to content

Commit cd6ddf2

Browse files
committed
add systemd's socket support
Signed-off-by: Pavel Boldin <pboldin@cloudlinux.com>
1 parent b8ee323 commit cd6ddf2

5 files changed

Lines changed: 66 additions & 27 deletions

File tree

dist/libcare.preset

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
enable libcare.service
1+
enable libcare.socket

dist/libcare.service

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,7 @@ Description=LibCare patch server
33

44
[Service]
55

6-
ExecStartPre=-/usr/bin/rm -f /run/libcare.sock
7-
ExecStart=/usr/bin/libcare-ctl server /run/libcare.sock
8-
ExecStartPost=/usr/bin/chown root.libcare /run/libcare.sock
9-
ExecStartPost=/usr/bin/chmod 0770 /run/libcare.sock
6+
ExecStart=/usr/bin/libcare-ctl server &3
107
ExecStartPost=/usr/bin/libcare-client /run/libcare.sock update
118

129
ExecStop=/usr/bin/libcare-client /run/libcare.sock stop
13-
14-
[Install]
15-
WantedBy=libvirtd.service

dist/libcare.socket

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
[Unit]
2+
Description=LibCare patch server
3+
4+
[Socket]
5+
ListenStream=/run/libcare/libcare.sock
6+
SocketGroup=libcare
7+
SocketMode=0660
8+
Symlinks=/run/libcare.sock
9+
10+
[Install]
11+
WantedBy=libvirtd.service

dist/libcare.spec

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ make -C dist/selinux install \
6565

6666

6767
install -m 0644 -D dist/libcare.service %{buildroot}%{_unitdir}/libcare.service
68+
install -m 0644 -D dist/libcare.socket %{buildroot}%{_unitdir}/libcare.socket
6869
install -m 0644 -D dist/libcare.preset %{buildroot}%{_presetdir}/90-libcare.preset
6970

7071
%pre
@@ -73,12 +74,25 @@ install -m 0644 -D dist/libcare.preset %{buildroot}%{_presetdir}/90-libcare.pres
7374

7475
%post
7576
%systemd_post libcare.service
77+
%systemd_post libcare.socket
78+
79+
if [ $1 -eq 1 ]; then
80+
# First install
81+
systemctl start libcare.socket
82+
fi
83+
if [ $1 -eq 2 ]; then
84+
# Upgrade. Just stop it, we will be reactivated
85+
# by a connect to /run/libcare.sock
86+
systemctl stop libcare.service
87+
fi
7688

7789
%preun
7890
%systemd_preun libcare.service
91+
%systemd_preun libcare.socket
7992

8093
%postun
8194
%systemd_postun libcare.service
95+
%systemd_postun libcare.socket
8296

8397
%clean
8498
rm -rf $RPM_BUILD_ROOT
@@ -93,6 +107,7 @@ rm -rf $RPM_BUILD_ROOT
93107
%{_libexecdir}/libcare/kpatch_strip
94108
%{_libexecdir}/libcare/kpatch_make
95109
%{_unitdir}/libcare.service
110+
%{_unitdir}/libcare.socket
96111
%{_presetdir}/90-libcare.preset
97112

98113
%if 0%{with selinux}

src/kpatch_user.c

Lines changed: 38 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1897,30 +1897,28 @@ static int usage_server(const char *err)
18971897

18981898
#define LISTEN_BACKLOG 1
18991899
static int
1900-
cmd_server(int argc, char *argv[])
1900+
server_bind_socket(const char *path)
19011901
{
1902-
int sfd = -1, cfd, sockaddr_len, rv;
1903-
const char *unixsocket;
1902+
int sfd = -1, rv, sockaddr_len;
19041903
struct sockaddr_un sockaddr;
19051904

1906-
if (argc < 2)
1907-
return usage_server("UNIX socket argument is missing");
1908-
1909-
unixsocket = argv[1];
1910-
1911-
if (argc >= 3)
1912-
strcpy(storage_dir, argv[2]);
1905+
/* Handle invocation by libcare.service */
1906+
if (path[0] == '&') {
1907+
if (sscanf(path, "&%d", &sfd) == 0)
1908+
return -1;
1909+
return sfd;
1910+
}
19131911

19141912
memset(&sockaddr, 0, sizeof(sockaddr));
19151913
sockaddr.sun_family = AF_UNIX;
1916-
sockaddr_len = strlen(unixsocket) + 1;
1914+
sockaddr_len = strlen(path) + 1;
19171915
if (sockaddr_len >= sizeof(sockaddr.sun_path)) {
19181916
kperr("sockaddr is too long\n");
19191917
return -1;
19201918
}
19211919

1922-
strncpy(sockaddr.sun_path, unixsocket, sizeof(sockaddr.sun_path));
1923-
if (unixsocket[0] == '\n')
1920+
strncpy(sockaddr.sun_path, path, sizeof(sockaddr.sun_path));
1921+
if (path[0] == '@')
19241922
sockaddr.sun_path[0] = '\0';
19251923

19261924
sockaddr_len += sizeof(sockaddr.sun_family);
@@ -1938,6 +1936,31 @@ cmd_server(int argc, char *argv[])
19381936
if (rv == -1)
19391937
goto err_close;
19401938

1939+
return sfd;
1940+
1941+
err_close:
1942+
if (rv < 0)
1943+
kplogerror("can't listen on unix socket %s\n", path);
1944+
if (sfd != -1)
1945+
close(sfd);
1946+
return rv;
1947+
}
1948+
1949+
static int
1950+
cmd_server(int argc, char *argv[])
1951+
{
1952+
int sfd = -1, cfd, rv;
1953+
1954+
if (argc < 2)
1955+
return usage_server("UNIX socket argument is missing");
1956+
1957+
sfd = server_bind_socket(argv[1]);
1958+
if (sfd < 0)
1959+
return sfd;
1960+
1961+
if (argc >= 3)
1962+
strcpy(storage_dir, argv[2]);
1963+
19411964
setlinebuf(stdout);
19421965

19431966
while ((cfd = accept4(sfd, NULL, 0, SOCK_CLOEXEC)) >= 0) {
@@ -1950,12 +1973,8 @@ cmd_server(int argc, char *argv[])
19501973
break;
19511974
}
19521975

1953-
err_close:
1954-
if (rv < 0)
1955-
kplogerror("can't listen on unix socket %s\n", unixsocket);
1956-
if (sfd != -1)
1957-
close(sfd);
1958-
return rv;
1976+
close(sfd);
1977+
return 0;
19591978
}
19601979

19611980

0 commit comments

Comments
 (0)