Skip to content
This repository has been archived by the owner on Jun 18, 2023. It is now read-only.

Can't get you lib working #1

Closed
cybernetlab opened this issue Dec 23, 2015 · 6 comments
Closed

Can't get you lib working #1

cybernetlab opened this issue Dec 23, 2015 · 6 comments

Comments

@cybernetlab
Copy link

Hi, I can't get your lib working. Here is my attept:

cd /tmp
curl -kL https://patch-diff.githubusercontent.com/raw/erlang/otp/pull/612.patch -o uds.patch
curl -kL https://github.com/erlang/otp/archive/maint.tar.gz -o otp.tgz
tar -zxf otp.tgz
cd otp-maint
export ERL_TOP=`pwd`
git apply /tmp/uds.patch
./otp_build autoconf
./configure --prefix=/usr
make
make install

cd /tmp
git clone https://github.com/saleyn/euds.git
cd euds
make

mkdir /tmp/test && cd /tmp/test
cp /tmp/euds/ebin/gen_uds.beam /tmp/test
cp -R /tmp/euds/priv /tmp/test

erl
1> {ok, S} = gen_uds:listen("/tmp/test.sock", [stream]).
** exception error: no function clause matching prim_inet:enc_family(local) 
     in function  prim_inet:open/6 
     in call from inet:fdopen/8 (inet.erl, line 1322)
     in call from inet_tcp:listen/2 (inet_tcp.erl, line 137)
     in call from gen_uds:listen/2 (src/gen_uds.erl, line 91)

Looks like prim_inet wasn't patched, but:

cat /tmp/otp-maint/erts/preloaded/src/prim_inet.erl | grep INET_AF_LOCAL
enc_family(local) -> ?INET_AF_LOCAL.
    [?INET_AF_LOCAL,0,0,length(File)|File];
    [?INET_AF_LOCAL,0,0,length(File)|File];
get_ip(?INET_AF_LOCAL, [0])  -> {[], []};
get_ip(?INET_AF_LOCAL, [N | Addr]) -> lists:split(N, Addr).

My guess is that newly compiled and installed prim_inet doesn't override its previous version. My attempt to fix it:

find / -name prim_inet.*
/usr/lib/erlang/lib/erts-7.2.1/ebin/prim_inet.beam
/usr/lib/erlang/lib/erts-7.2.1/src/prim_inet.erl
/usr/lib/erlang/lib/erts-6.2/ebin/prim_inet.beam
/tmp/otp-maint/erts/preloaded/ebin/prim_inet.beam
/tmp/otp-maint/erts/preloaded/src/prim_inet.erl

rm -rf /usr/lib/erlang/lib/erts-6.2 

But without success - same error. To ensure that I've install patched version:

cd /tmp/otp-maint
make install | grep prim_inet
Makefile:72: warning: overriding recipe for target 'clean'
/otp/make/otp_subdir.mk:29: warning: ignoring old recipe for target 'clean'
/usr/bin/install -c -m 644 erl_prim_loader.erl init.erl prim_file.erl prim_inet.erl zlib.erl prim_zip.erl otp_ring0.erl erlang.erl erts_internal.erl prim_eval.S prim_eval.erl "/usr/lib/erlang/lib/erts-7.2.1/src"
/usr/bin/install -c -m 644 ../ebin/erl_prim_loader.beam ../ebin/init.beam ../ebin/prim_file.beam ../ebin/prim_inet.beam ../ebin/zlib.beam ../ebin/prim_zip.beam ../ebin/otp_ring0.beam ../ebin/erlang.beam ../ebin/erts_internal.beam ../ebin/prim_eval.beam ../ebin/erts.app "/usr/lib/erlang/lib/erts-7.2.1/ebin"
Makefile:72: warning: overriding recipe for target 'clean'
/otp/make/otp_subdir.mk:29: warning: ignoring old recipe for target 'clean'

find / -name prim_inet.*
/usr/lib/erlang/lib/erts-7.2.1/ebin/prim_inet.beam
/usr/lib/erlang/lib/erts-7.2.1/src/prim_inet.erl
/otp/erts/preloaded/ebin/prim_inet.beam
/otp/erts/preloaded/src/prim_inet.erl

Any suggestions?

@saleyn
Copy link
Owner

saleyn commented Dec 23, 2015

I faced a similar problem with patching the OTP. What is wrong is that when preloaded modules in erts/preloaded/src get compiled the beam files are placed in the same source folder erts/preloaded/src. You need to move the newly compiled beam's to erts/preloaded/ebin. This might be some kind of bug in the OTP build.

@cybernetlab
Copy link
Author

Hmm.. I think that you mean erts/preloaded/ebin. Anyway it looks like I have correct file layout:

# ls /usr/lib/erlang/lib/erts-7.2.1/src
erl_prim_loader.erl  erlang.erl  erts_internal.erl  init.erl  otp_ring0.erl  prim_eval.S  prim_eval.erl  prim_file.erl  prim_inet.erl  prim_zip.erl  zlib.erl
# ls /usr/lib/erlang/lib/erts-7.2.1/ebin/
erl_prim_loader.beam  erlang.beam  erts.app  erts_internal.beam  init.beam  otp_ring0.beam  prim_eval.beam  prim_file.beam  prim_inet.beam  prim_zip.beam  zlib.beam
# ls /otp/erts/preloaded/src/            
Makefile       erl_prim_loader.erl  erts.app.src       init.erl   prim_eval.S    prim_file.erl  prim_zip.erl      zlib.erl
add_abstract_code  erlang.erl       erts_internal.erl  otp_ring0.erl  prim_eval.erl  prim_inet.erl  zip_internal.hrl
# ls /otp/erts/preloaded/ebin/
erl_prim_loader.beam  erlang.beam  erts.app  erts_internal.beam  init.beam  otp_ring0.beam  prim_eval.beam  prim_file.beam  prim_inet.beam  prim_zip.beam  zlib.beam

maybe this bug was fixed in master resently. Looks like my error is not relate on this bug

@saleyn
Copy link
Owner

saleyn commented Dec 23, 2015

cd into your otp source dir, set export ERL_TOP=ThatDirectory, then cd to erts/preloaded, run make, and make sure that the newly produced *.beam's are in the ebin folder. After that cd to $ERL_TOP and do make install. That worked for me. I believe the issue might be that the old beams are committed to git, and the build process doesn't compile the preloaded modules by default.

@cybernetlab
Copy link
Author

Yes!

# cd /tmp/otp-maint
# export ERL_TOP=/tmp/otp-maint
# cd erts/preloaded
# make
# ls src
Makefile          erl_prim_loader.erl  erts.app.src        init.beam       otp_ring0.erl    prim_eval.beam  prim_file.erl   prim_zip.beam     zlib.beam
add_abstract_code     erlang.beam      erts_internal.beam  init.erl        prim_eval.S  prim_eval.erl   prim_inet.beam  prim_zip.erl      zlib.erl
erl_prim_loader.beam  erlang.erl       erts_internal.erl   otp_ring0.beam  prim_eval.abstr  prim_file.beam  prim_inet.erl   zip_internal.hrl
# mv src/*.beam ebin/
# cd /tmp/otp-maint
# make install

now it works, but with another error:

1> file:delete("/tmp/test.sock").
ok
2> {ok, S} = gen_uds:listen("/tmp/test.sock", [stream]).
** exception error: no match of right hand side value {error,{fdopen,einval}}

What means einval?

Thanks!

@saleyn
Copy link
Owner

saleyn commented Dec 23, 2015

That means that invalid argument supplied to fdopen(2). Not sure why you are getting it. It works in my environment:

$ erl
Erlang/OTP 18 [erts-7.1] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false]
Eshell V7.1  (abort with ^G)
1> {ok, S} = gen_uds:listen("/tmp/test.sock", [stream]).
{ok,#Port<0.739>}
2>

You may want to run it under strace, and see why it happens.

@cybernetlab
Copy link
Author

Ok, I thing that I should open another issue.

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants