sionescu / iolib

Common Lisp I/O library
http://common-lisp.net/project/iolib/
MIT License
141 stars 31 forks source link

Termux support #77

Closed aadcg closed 1 year ago

aadcg commented 1 year ago

Now that libfixposix landed on Termux, calling (asdf:load-system "iolib") should theoretically go smooth. Sadly, it failed as it can be seen below. Any ideas? Thanks.

Subprocess #<UIOP/LAUNCH-PROGRAM::PROCESS-INFO {1006D7C363}>
 with command ("cc" "-o"
               "/data/data/com.termux/files/home/.cache/common-lisp/sbcl-2.3.0-linux-arm64/data/data/com.termux/files/home/common-lisp/iolib/src/sockets/grovel__grovel-tmpIO5N7K88.o"
               "-c" "-g" "-Wall" "-Wundef" "-Wsign-compare"
               "-Wpointer-arith" "-O3" "-std=gnu99" "-fPIC"
               "-I/data/data/com.termux/files/home/common-lisp/cffi/"
               "/data/data/com.termux/files/home/.cache/common-lisp/sbcl-2.3.0-linux-arm64/data/data/com.termux/files/home/common-lisp/iolib/src/sockets/grovel__grovel.c")
 exited with error code 1
   [Condition of type CFFI-GROVEL:GROVEL-ERROR]

Restarts:
 0: [RETRY] Retry #<PROCESS-OP > on #<GROVEL-FILE "iolib/sockets" "grovel">.
 1: [ACCEPT] Continue, treating #<PROCESS-OP > on #<GROVEL-FILE "iolib/sockets" "grovel"> as having been successful.
 2: [RETRY] Retry ASDF operation.
 3: [CLEAR-CONFIGURATION-AND-RETRY] Retry ASDF operation after resetting the configuration.
 4: [RETRY] Retry ASDF operation.
 5: [CLEAR-CONFIGURATION-AND-RETRY] Retry ASDF operation after resetting the configuration.
 6: [RETRY] Retry SLY mREPL evaluation request.
 7: [*ABORT] Return to SLY's top level.
 8: [ABORT] abort thread (#<THREAD "sly-channel-1-mrepl-remote-1" RUNNING {1002C933F3}>)

Backtrace:
 0: (CFFI-GROVEL:GROVEL-ERROR "~a" #<UIOP/RUN-PROGRAM:SUBPROCESS-ERROR {1006D7E263}>)
 1: ((FLET "THUNK" :IN CFFI-GROVEL:PROCESS-GROVEL-FILE))
 2: (SB-IMPL::%WITH-STANDARD-IO-SYNTAX #<FUNCTION (FLET "THUNK" :IN CFFI-GROVEL:PROCESS-GROVEL-FILE) {7502AA22DB}>)
 3: (CFFI-GROVEL:PROCESS-GROVEL-FILE #P"/data/data/com.termux/files/home/common-lisp/iolib/src/sockets/grovel.lisp" #P"/data/data/com.termux/files/home/.cache/common-lisp/sbcl-2.3.0-linux-arm64/data/data/..
 4: ((:METHOD ASDF/ACTION:PERFORM (CFFI-GROVEL::PROCESS-OP CFFI-GROVEL:GROVEL-FILE)) #<CFFI-GROVEL::PROCESS-OP > #<CFFI-GROVEL:GROVEL-FILE "iolib/sockets" "grovel">) [fast-method]
 5: ((SB-PCL::EMF ASDF/ACTION:PERFORM) #<unused argument> #<unused argument> #<CFFI-GROVEL::PROCESS-OP > #<CFFI-GROVEL:GROVEL-FILE "iolib/sockets" "grovel">)
 6: ((LAMBDA NIL :IN ASDF/ACTION:CALL-WHILE-VISITING-ACTION))
 7: ((:METHOD ASDF/ACTION:PERFORM :AROUND (CFFI-GROVEL::PROCESS-OP CFFI-GROVEL::CC-FLAGS-MIXIN)) #<CFFI-GROVEL::PROCESS-OP > #<CFFI-GROVEL:GROVEL-FILE "iolib/sockets" "grovel">) [fast-method]
 8: ((:METHOD ASDF/ACTION:PERFORM-WITH-RESTARTS :AROUND (T T)) #<CFFI-GROVEL::PROCESS-OP > #<CFFI-GROVEL:GROVEL-FILE "iolib/sockets" "grovel">) [fast-method]
 9: ((:METHOD ASDF/PLAN:PERFORM-PLAN (T)) #<ASDF/PLAN:SEQUENTIAL-PLAN {1002070733}>) [fast-method]
10: ((FLET SB-C::WITH-IT :IN SB-C::%WITH-COMPILATION-UNIT))
11: ((:METHOD ASDF/PLAN:PERFORM-PLAN :AROUND (T)) #<ASDF/PLAN:SEQUENTIAL-PLAN {1002070733}>) [fast-method]
12: ((:METHOD ASDF/OPERATE:OPERATE (ASDF/OPERATION:OPERATION ASDF/COMPONENT:COMPONENT)) #<ASDF/LISP-ACTION:LOAD-OP > #<ASDF/SYSTEM:SYSTEM "iolib"> :PLAN-CLASS NIL :PLAN-OPTIONS NIL) [fast-method]
13: ((SB-PCL::EMF ASDF/OPERATE:OPERATE) #<unused argument> #<unused argument> #<ASDF/LISP-ACTION:LOAD-OP > #<ASDF/SYSTEM:SYSTEM "iolib">)
14: ((LAMBDA NIL :IN ASDF/OPERATE:OPERATE))
15: ((:METHOD ASDF/OPERATE:OPERATE :AROUND (T T)) #<ASDF/LISP-ACTION:LOAD-OP > #<ASDF/SYSTEM:SYSTEM "iolib">) [fast-method]
16: ((SB-PCL::EMF ASDF/OPERATE:OPERATE) #<unused argument> #<unused argument> ASDF/LISP-ACTION:LOAD-OP "iolib")
17: ((LAMBDA NIL :IN ASDF/OPERATE:OPERATE))
18: ((:METHOD ASDF/OPERATE:OPERATE :AROUND (T T)) ASDF/LISP-ACTION:LOAD-OP "iolib") [fast-method]
19: (ASDF/SESSION:CALL-WITH-ASDF-SESSION #<FUNCTION (LAMBDA NIL :IN ASDF/OPERATE:OPERATE) {100207050B}> :OVERRIDE T :KEY NIL :OVERRIDE-CACHE T :OVERRIDE-FORCING NIL)
20: ((LAMBDA NIL :IN ASDF/OPERATE:OPERATE))
21: (ASDF/SESSION:CALL-WITH-ASDF-SESSION #<FUNCTION (LAMBDA NIL :IN ASDF/OPERATE:OPERATE) {10020703FB}> :OVERRIDE NIL :KEY NIL :OVERRIDE-CACHE NIL :OVERRIDE-FORCING NIL)
22: ((:METHOD ASDF/OPERATE:OPERATE :AROUND (T T)) ASDF/LISP-ACTION:LOAD-OP "iolib") [fast-method]
23: (ASDF/OPERATE:LOAD-SYSTEM "iolib")
24: (SB-INT:SIMPLE-EVAL-IN-LEXENV (ASDF/OPERATE:LOAD-SYSTEM "iolib") #<NULL-LEXENV>)
25: (EVAL (ASDF/OPERATE:LOAD-SYSTEM "iolib"))
26: ((LAMBDA NIL :IN SLYNK-MREPL::MREPL-EVAL-1))
27: (SLYNK::CALL-WITH-RETRY-RESTART "Retry SLY mREPL evaluation request." #<FUNCTION (LAMBDA NIL :IN SLYNK-MREPL::MREPL-EVAL-1) {100207027B}>)
28: ((LAMBDA NIL :IN SLYNK-MREPL::MREPL-EVAL-1))
29: ((LAMBDA NIL :IN SLYNK::CALL-WITH-LISTENER))
30: (SLYNK::CALL-WITH-BINDINGS ((*PACKAGE* . #<PACKAGE "COMMON-LISP-USER">) (*DEFAULT-PATHNAME-DEFAULTS* . #P"/data/data/com.termux/files/usr/bin/") (*) (**) (*** . 4005) (/ NIL NIL 0) ...) #<FUNCTION (LA..
31: (SLYNK-MREPL::MREPL-EVAL-1 #<SLYNK-MREPL::MREPL mrepl-1-1> "(asdf:load-system \"iolib\")")
32: (SLYNK-MREPL::MREPL-EVAL #<SLYNK-MREPL::MREPL mrepl-1-1> "(asdf:load-system \"iolib\")")
33: (SLYNK:PROCESS-REQUESTS NIL)
34: ((LAMBDA NIL :IN SLYNK::SPAWN-CHANNEL-THREAD))
35: ((LAMBDA NIL :IN SLYNK::SPAWN-CHANNEL-THREAD))
36: (SLYNK-SBCL::CALL-WITH-BREAK-HOOK #<FUNCTION SLYNK:SLYNK-DEBUGGER-HOOK> #<FUNCTION (LAMBDA NIL :IN SLYNK::SPAWN-CHANNEL-THREAD) {100207000B}>)
37: ((FLET SLYNK-BACKEND:CALL-WITH-DEBUGGER-HOOK :IN "/data/data/com.termux/files/home/.emacs.d/elpa/sly-20220713.1433/slynk/backend/sbcl.lisp") #<FUNCTION SLYNK:SLYNK-DEBUGGER-HOOK> #<FUNCTION (LAMBDA NI..
38: ((LAMBDA NIL :IN SLYNK::CALL-WITH-LISTENER))
39: (SLYNK::CALL-WITH-BINDINGS ((*PACKAGE* . #<PACKAGE "COMMON-LISP-USER">) (*DEFAULT-PATHNAME-DEFAULTS* . #P"/data/data/com.termux/files/usr/bin/") (*) (**) (*** . 4005) (/ NIL NIL 0) ...) #<FUNCTION (LA..
40: ((LAMBDA NIL :IN SLYNK::SPAWN-CHANNEL-THREAD))
41: ((FLET SB-UNIX::BODY :IN SB-THREAD::RUN))
42: ((FLET "WITHOUT-INTERRUPTS-BODY-128" :IN SB-THREAD::RUN))
43: ((FLET SB-UNIX::BODY :IN SB-THREAD::RUN))
44: ((FLET "WITHOUT-INTERRUPTS-BODY-121" :IN SB-THREAD::RUN))
45: (SB-THREAD::RUN)
sionescu commented 1 year ago

Can you run that command in a terminal ? I'd like to see the error message.

aadcg commented 1 year ago

Sure!

$ cc -o /data/data/com.termux/files/home/.cache/common-lisp/sbcl-2.3.0-linux-arm64/data/data/com.termux/files/home/common-lisp/iolib/src/sockets/grovel__grovel-tmpIO5N7K88.o -c -g -Wall -Wundef -Wsign-compare -Wpointer-arith -O3 -std=gnu99 -fPIC -I/data/data/com.termux/files/home/common-lisp/cffi/ /data/data/com.termux/files/home/.cache/common-lisp/sbcl-2.3.0-linux-arm64/data/data/com.termux/files/home/common-lisp/iolib/src/sockets/grovel__grovel.c

In file included from /data/data/com.termux/files/home/.cache/common-lisp/sbcl-2.3.0-linux-arm64/data/data/com.termux/files/home/common-lisp/iolib/src/sockets/grovel__grovel.c:14:
/data/data/com.termux/files/usr/include/linux/errqueue.h:54:21: error: array has incomplete element type 'struct timespec'
  struct timespec ts[3];
                    ^
/data/data/com.termux/files/usr/include/sys/socket.h:46:8: note: forward declaration of 'struct timespec'
struct timespec;
       ^
/data/data/com.termux/files/home/.cache/common-lisp/sbcl-2.3.0-linux-arm64/data/data/com.termux/files/home/common-lisp/iolib/src/sockets/grovel__grovel.c:22:7: warning: unused variable 'autotype_tmp' [-Wunused-variable]
  int autotype_tmp;
      ^
1 warning and 1 error generated.
aadcg commented 1 year ago

Find below the relevant files.

sys/socket.h

/*
 * Copyright (C) 2008 The Android Open Source Project
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *  * Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *  * Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 */

#ifndef _SYS_SOCKET_H_
#define _SYS_SOCKET_H_

#include <sys/cdefs.h>
#include <sys/types.h>

#include <asm/fcntl.h>
#include <asm/socket.h>
#include <linux/sockios.h>
#include <linux/uio.h>
#include <linux/types.h>
#include <linux/compiler.h>

#include <bits/sa_family_t.h>

__BEGIN_DECLS

struct timespec;

[...]

linux/errqueue.h

/****************************************************************************
 ****************************************************************************
 ***
 ***   This header was automatically generated from a Linux kernel header
 ***   of the same name, to make information necessary for userspace to
 ***   call into the kernel available to libc.  It contains only constants,
 ***   structures, and macros generated from the original header, and thus,
 ***   contains no copyrightable information.
 ***
 ***   To edit the content of this header, modify the corresponding
 ***   source file (e.g. under external/kernel-headers/original/) then
 ***   run bionic/libc/kernel/tools/update_all.py
 ***
 ***   Any manual change here will be lost the next time this script will
 ***   be run. You've been warned!
 ***
 ****************************************************************************
 ****************************************************************************/
#ifndef _UAPI_LINUX_ERRQUEUE_H
#define _UAPI_LINUX_ERRQUEUE_H
#include <linux/types.h>
#include <linux/time_types.h>
struct sock_ee_data_rfc4884 {
  __u16 len;
  __u8 flags;
  __u8 reserved;
};
struct sock_extended_err {
  __u32 ee_errno;
  __u8 ee_origin;
  __u8 ee_type;
  __u8 ee_code;
  __u8 ee_pad;
  __u32 ee_info;
  union {
    __u32 ee_data;
    struct sock_ee_data_rfc4884 ee_rfc4884;
  };
};
#define SO_EE_ORIGIN_NONE 0
#define SO_EE_ORIGIN_LOCAL 1
#define SO_EE_ORIGIN_ICMP 2
#define SO_EE_ORIGIN_ICMP6 3
#define SO_EE_ORIGIN_TXSTATUS 4
#define SO_EE_ORIGIN_ZEROCOPY 5
#define SO_EE_ORIGIN_TXTIME 6
#define SO_EE_ORIGIN_TIMESTAMPING SO_EE_ORIGIN_TXSTATUS
#define SO_EE_OFFENDER(ee) ((struct sockaddr *) ((ee) + 1))
#define SO_EE_CODE_ZEROCOPY_COPIED 1
#define SO_EE_CODE_TXTIME_INVALID_PARAM 1
#define SO_EE_CODE_TXTIME_MISSED 2
#define SO_EE_RFC4884_FLAG_INVALID 1
struct scm_timestamping {
  struct timespec ts[3];
};
struct scm_timestamping64 {
  struct __kernel_timespec ts[3];
};
enum {
  SCM_TSTAMP_SND,
  SCM_TSTAMP_SCHED,
  SCM_TSTAMP_ACK,
};
#endif
sionescu commented 1 year ago

I believe commit 010b7a6 fixes the issue. Can you try it ?

aadcg commented 1 year ago

Yes, that fixes it! Thank you @sionescu :)