[CRIU] [PATCH 1/2] criu: almost fix building on Alpine Linux

Andrey Vagin avagin at openvz.org
Tue Jul 5 11:45:34 PDT 2016


From: Adrian Reber <areber at redhat.com>

It seems that the different libc (musl) which Alpine Linux uses produces
different errors than the usual glibc. This patch fixes most include
errors. Two errors are not yet resolved on Alpine Linux's libc (musl):

 * proc_parse.c: In function 'parse_posix_timers':
   proc_parse.c:2125:34: error: 'SIGEV_THREAD_ID' undeclared (first use in this function)
        timer->spt.it_sigev_notify = SIGEV_THREAD_ID;

   proc_parse.c:2125:34: note: each undeclared identifier is reported only once for each function it appears in

   Seems difficult to fix as including <linux/signal.h>, which provides
   this #define, generates more different error messages related to
   time.h and linux/time.h collisions. It is not yet clear if additional
   guards would help in the header files.

 * fsnotify.c: In function 'open_by_handle':
   fsnotify.c:107:9: error: implicit declaration of function 'open_by_handle_at' [-Werror=implicit-function-declaration]
     return open_by_handle_at(fd, arg, O_PATH);

   The function open_by_handle_at() is not provided by Alpine Linux's
   libc (musl).

This patch resolves the following errors/warnings and has been tested on
RHEL7(x86_64/powerpc64le) and Fedora 24:

cr-service.c: In function 'cr_service':
cr-service.c:1082:26: error: passing argument 2 of 'accept' from incompatible pointer type [-Werror=incompatible-pointer-types]
   sk = accept(server_fd, &client_addr, &client_addr_len);
                        ^
In file included from /usr/include/fortify/sys/socket.h:20:0,
                 from cr-service.c:11:
/usr/include/sys/socket.h:301:5: note: expected 'struct sockaddr * restrict' but argument is of type 'struct sockaddr_un *'
 int accept (int, struct sockaddr *__restrict, socklen_t *__restrict);
     ^
cc1: all warnings being treated as errors

files.c: In function 'open_transport_fd':
files.c:845:19: error: passing argument 2 of 'bind' from incompatible pointer type [-Werror=incompatible-pointer-types]
  ret = bind(sock, &saddr, sun_len);
                   ^
In file included from /usr/include/fortify/sys/socket.h:20:0,
                 from files.c:12:
/usr/include/sys/socket.h:298:5: note: expected 'const struct sockaddr *' but argument is of type 'struct sockaddr_un *'
 int bind (int, const struct sockaddr *, socklen_t);
     ^
cc1: all warnings being treated as errors

In file included from fsnotify.c:18:0:
/usr/include/sys/poll.h:1:2: error: #warning redirecting incorrect #include <sys/poll.h> to <poll.h> [-Werror=cpp]
 #warning redirecting incorrect #include <sys/poll.h> to <poll.h>
  ^
cc1: all warnings being treated as errors

In file included from /root/criu/criu/include/timerfd.h:7:0,
                 from /root/criu/criu/include/restorer.h:18,
                 from arch/x86/crtools.c:16:
/root/criu/criu/include/files.h:43:14: error: field 'stat' has incomplete type
  struct stat stat;

In file included from arch/x86/vdso-pie.c:6:0:
/root/criu/criu/include/syscall.h:22:66: error: unknown type name 'loff_t'
 extern long sys_pread (unsigned int fd, char *buf, size_t count, loff_t pos) ;
                                                                  ^
/root/criu/criu/include/syscall.h:83:31: error: unknown type name 'clockid_t'
 extern long sys_timer_create (clockid_t which_clock, struct sigevent *timer_event_spec, kernel_timer_t *created_timer_id
                               ^
/root/criu/criu/include/syscall.h:88:38: error: unknown type name 'clockid_t'
 extern long sys_clock_gettime (const clockid_t which_clock, const struct timespec *tp) ;
                                      ^

In file included from netfilter.c:5:0:
/usr/include/wait.h:1:2: error: #warning redirecting incorrect #include <wait.h> to <sys/wait.h> [-Werror=cpp]
 #warning redirecting incorrect #include <wait.h> to <sys/wait.h>
  ^
cc1: all warnings being treated as errors

pie/restorer.c: In function '__export_restore_task':
pie/restorer.c:1276:23: error: 'LOCK_EX' undeclared (first use in this function)
   ret = sys_flock(fd, LOCK_EX);
                       ^
pie/restorer.c:1276:23: note: each undeclared identifier is reported only once for each function it appears in
pie/restorer.c:1310:23: error: 'LOCK_UN' undeclared (first use in this function)
   ret = sys_flock(fd, LOCK_UN);
                       ^

sk-unix.c: In function 'open_unixsk_standalone':
sk-unix.c:1169:19: error: passing argument 2 of 'connect' from incompatible pointer type [-Werror=incompatible-pointer-types]
   if (connect(sk, &addr, sizeof(addr.sun_family))) {
                   ^
In file included from /usr/include/fortify/sys/socket.h:20:0,
                 from sk-unix.c:1:
/usr/include/sys/socket.h:299:5: note: expected 'const struct sockaddr *' but argument is of type 'struct sockaddr_un *'
 int connect (int, const struct sockaddr *, socklen_t);
     ^
cc1: all warnings being treated as errors

c/criu.c: In function 'criu_local_set_parent_images':
c/criu.c:169:26: error: implicit declaration of function 'strdup' [-Werror=implicit-function-declaration]
  opts->rpc->parent_img = strdup(path);

Signed-off-by: Adrian Reber <areber at redhat.com>
Signed-off-by: Andrew Vagin <avagin at virtuozzo.com>
---
 criu/cr-service.c            | 2 +-
 criu/files.c                 | 2 +-
 criu/fsnotify.c              | 2 +-
 criu/include/files.h         | 2 ++
 criu/include/syscall-types.h | 2 ++
 criu/netfilter.c             | 2 +-
 criu/pie/restorer.c          | 1 +
 criu/sk-unix.c               | 2 +-
 lib/c/criu.c                 | 1 +
 9 files changed, 11 insertions(+), 5 deletions(-)

diff --git a/criu/cr-service.c b/criu/cr-service.c
index 64ab8b7..797d704 100644
--- a/criu/cr-service.c
+++ b/criu/cr-service.c
@@ -1103,7 +1103,7 @@ int cr_service(bool daemon_mode)
 
 		pr_info("Waiting for connection...\n");
 
-		sk = accept(server_fd, &client_addr, &client_addr_len);
+		sk = accept(server_fd, (struct sockaddr *)&client_addr, &client_addr_len);
 		if (sk == -1) {
 			pr_perror("Can't accept connection");
 			goto err;
diff --git a/criu/files.c b/criu/files.c
index 8c51eaf..b92101b 100644
--- a/criu/files.c
+++ b/criu/files.c
@@ -910,7 +910,7 @@ static int open_transport_fd(int pid, struct fdinfo_list_entry *fle)
 		pr_perror("Can't create socket");
 		return -1;
 	}
-	ret = bind(sock, &saddr, sun_len);
+	ret = bind(sock, (struct sockaddr *)&saddr, sun_len);
 	if (ret < 0) {
 		pr_perror("Can't bind unix socket %s", saddr.sun_path + 1);
 		goto err;
diff --git a/criu/fsnotify.c b/criu/fsnotify.c
index 4cf2da8..2834976 100644
--- a/criu/fsnotify.c
+++ b/criu/fsnotify.c
@@ -15,7 +15,7 @@
 #include <sys/vfs.h>
 #include <linux/magic.h>
 #include <sys/wait.h>
-#include <sys/poll.h>
+#include <poll.h>
 #include <sys/mman.h>
 #include <sys/mount.h>
 #include <aio.h>
diff --git a/criu/include/files.h b/criu/include/files.h
index 5e3d6dc..e0b853d 100644
--- a/criu/include/files.h
+++ b/criu/include/files.h
@@ -1,6 +1,8 @@
 #ifndef __CR_FILES_H__
 #define __CR_FILES_H__
 
+#include <sys/stat.h>
+
 #include "compiler.h"
 #include "asm/types.h"
 #include "fcntl.h"
diff --git a/criu/include/syscall-types.h b/criu/include/syscall-types.h
index 49798fa..db0dbc0 100644
--- a/criu/include/syscall-types.h
+++ b/criu/include/syscall-types.h
@@ -11,6 +11,8 @@
 #include <sys/time.h>
 #include <arpa/inet.h>
 #include <sched.h>
+#include <time.h>
+#include <fcntl.h>
 
 #include "asm/types.h"
 
diff --git a/criu/netfilter.c b/criu/netfilter.c
index 7a1ac91..ab01535 100644
--- a/criu/netfilter.c
+++ b/criu/netfilter.c
@@ -2,7 +2,7 @@
 #include <arpa/inet.h>
 #include <unistd.h>
 #include <string.h>
-#include <wait.h>
+#include <sys/wait.h>
 #include <stdlib.h>
 
 #include "asm/types.h"
diff --git a/criu/pie/restorer.c b/criu/pie/restorer.c
index 5d72e13..424ccf3 100644
--- a/criu/pie/restorer.c
+++ b/criu/pie/restorer.c
@@ -6,6 +6,7 @@
 #include <linux/aio_abi.h>
 #include <sys/types.h>
 #include <sys/mman.h>
+#include <sys/file.h>
 #include <sys/stat.h>
 #include <sys/wait.h>
 #include <sys/time.h>
diff --git a/criu/sk-unix.c b/criu/sk-unix.c
index ca6673e..5498718 100644
--- a/criu/sk-unix.c
+++ b/criu/sk-unix.c
@@ -1166,7 +1166,7 @@ static int open_unixsk_standalone(struct unix_sk_info *ui)
 		 * The below is hack: we use that connect with AF_UNSPEC
 		 * clears socket's peer.
 		 */
-		if (connect(sk, &addr, sizeof(addr.sun_family))) {
+		if (connect(sk, (struct sockaddr *)&addr, sizeof(addr.sun_family))) {
 			pr_perror("Can't clear socket's peer");
 			return -1;
 		}
diff --git a/lib/c/criu.c b/lib/c/criu.c
index e75268c..5c65d9f 100644
--- a/lib/c/criu.c
+++ b/lib/c/criu.c
@@ -10,6 +10,7 @@
 #include <stdlib.h>
 #include <errno.h>
 #include <signal.h>
+#include <string.h>
 
 #include "criu.h"
 #include "rpc.pb-c.h"
-- 
2.7.4



More information about the CRIU mailing list