2016年10月12日水曜日

fdを他のプロセスに引き継ぐ。

cc -o send send.c fdtrans.c
cc -o recv recv.c fdtrans.c

別ウインドウで次の順番で起動し、recv画面にキー入力。
① send起動
② recv起動

【fdtrans.c】
#include <stdio.h>
#include <errno.h>

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <fcntl.h>
#include <string.h>
//#include "vncgw.h"
//#include "../android/jni/vncserver.h"

//extern web_gate_settings_t settings;

#define UNIX_DOMAIN_PATH_NAME_REQ "/var/local/netreg/request"
#define UNIX_DOMAIN_PATH_NAME_RES "/var/local/netreg/response"

int listen_un(const char* id )
{
char path[48];
int soc,c_soc;
struct sockaddr_un u_addr;

if( (soc = socket(PF_UNIX, SOCK_SEQPACKET, 0)) < 0 ) {
printf( "ERROR Socket in listen_un %s\n", strerror(errno));
return -1;
}

strcpy(  path, UNIX_DOMAIN_PATH_NAME_REQ );
strncat( path, id, 16 );

memset(&u_addr, 0, sizeof(u_addr));
u_addr.sun_family = AF_UNIX;

        u_addr.sun_path[0] = '\0';  /* abstract namespace */
strncpy(u_addr.sun_path + 1, path, sizeof(u_addr.sun_path));

// handler_msg( "unix domain path (ACCEPT)= %s\n", u_addr.sun_path + 1 );

if( bind(soc, (struct sockaddr*)&u_addr, sizeof(u_addr)) < 0 ) {
printf( "ERROR Bind 1 in listen_un() %s\n", strerror(errno));
c_soc = connect_un( id );

/* // add by takahab 20180724
struct timeval timeout;
fd_set rfds;
char buf[2048];

timeout.tv_sec  = 1;
timeout.tv_usec = 0;

FD_ZERO( &rfds );
FD_SET( c_soc, &rfds );

select(c_soc+1, &rfds, NULL, NULL, &timeout);

if (FD_ISSET(c_soc, &rfds)) {
errno = 0;
recv(c_soc, buf, sizeof(buf), 0);
printf( "Done Dummy reading Beause UNIX DOMAIN SOCKET broken  %s\n", strerror(errno));
}
// add by takahab 20180724 */

close( c_soc );
sleep(1);
errno = 0;
if( bind(soc, (struct sockaddr*)&u_addr, sizeof(u_addr)) < 0 ) {

printf( "ERROR Bind 2 in listen_un() %s\n", strerror(errno));
close( soc );
return -1;
}
}

if( listen( soc, 1 ) < 0 ) {
printf( "ERROR listen in listen_un() %s\n", strerror(errno));
close( soc );
return -1;
}

struct sockaddr_un c_addr;
        socklen_t c_len = sizeof(c_addr);

// handler_msg("Accept in Linsten_un() soc=%d\n", soc);
 
if ( (c_soc = accept(soc, (struct sockaddr*)&c_addr, &c_len)) < 0 ) {
printf( "ERROR Accept in listen_un() %s\n", strerror(errno));
close( soc );
return -1;
}
// handler_msg( "accept form   %s     len:%d    c_soc:%d\n", c_addr.sun_path + 1, c_len, c_soc );
close( soc );

return c_soc;
}

int connect_un(const char* id )
{
char path[48];
int soc;
struct sockaddr_un u_addr;

if( (soc = socket(PF_UNIX, SOCK_SEQPACKET, 0)) < 0 ) {
printf( "ERROR Socket in connect_un() %s\n", strerror(errno));
return -1;
}


strcpy(  path, UNIX_DOMAIN_PATH_NAME_RES );
strncat( path, id, 16 );

memset(&u_addr, 0, sizeof(u_addr));
u_addr.sun_family = AF_UNIX;

        u_addr.sun_path[0] = '\0';  /* abstract namespace */
strncpy(u_addr.sun_path + 1, path, sizeof(u_addr.sun_path));

// handler_msg( "unix domain path (CONNECT)= %s\n", u_addr.sun_path + 1);

if( bind(soc, (struct sockaddr*)&u_addr, sizeof(u_addr)) < 0 ) {
printf( "ERROR Bind in connect_un() %s\n", strerror(errno));
close( soc );
return -1;
}

strcpy(  path, UNIX_DOMAIN_PATH_NAME_REQ );
strncat( path, id, 16 );

memset(&u_addr, 0, sizeof(u_addr));
u_addr.sun_family = AF_UNIX;

        u_addr.sun_path[0] = '\0';  /* abstract namespace */
strncpy(u_addr.sun_path + 1, path, sizeof(u_addr.sun_path));

if ( connect(soc, (struct sockaddr*)&u_addr, sizeof(u_addr)) < 0 ) {
printf( "ERROR connect in connect_un() %s\n", strerror(errno));
close( soc );
return -1;
}

return soc;
}


int recv_un(int soc, void* pid, size_t pid_len)
{
struct msghdr msg;
struct iovec  iov;
char cmsgbuf[CMSG_SPACE(sizeof(int))];

iov.iov_base = pid;
iov.iov_len = pid_len;

msg.msg_name = NULL;
msg.msg_namelen = 0;
msg.msg_iov = &iov;
msg.msg_iovlen = 1;
msg.msg_control = cmsgbuf;
msg.msg_controllen = sizeof(cmsgbuf);
msg.msg_flags = MSG_WAITALL;

if ( recvmsg(soc, &msg, 0) < 0 ) {
printf( "ERROR Recvmsg in recv_un() %s\n", strerror(errno));
return -1;
}

struct cmsghdr *cmsg = (struct cmsghdr*)cmsgbuf;
return *((int *)CMSG_DATA(cmsg));
}

int send_un(int soc, int fd, void* pid, int pid_len)
{
struct iovec iov;
char buf[CMSG_SPACE(sizeof(int))];

iov.iov_base = pid;
iov.iov_len = pid_len;

struct cmsghdr *cmsg = (struct cmsghdr*)buf;
cmsg->cmsg_len = CMSG_LEN(sizeof(int));
cmsg->cmsg_level = SOL_SOCKET;
cmsg->cmsg_type = SCM_RIGHTS;
*((int *)CMSG_DATA(cmsg)) = fd;

struct msghdr msg;
memset(&msg, 0, sizeof(msg));
msg.msg_name = NULL;
msg.msg_namelen = 0;
msg.msg_iov = &iov;
msg.msg_iovlen = 1;
msg.msg_control = buf;
msg.msg_controllen = sizeof(buf);
msg.msg_flags = 0;

if (sendmsg(soc, &msg, 0) < 0) {
printf( "ERROR Sendmsg when sending fd in send_un() %s soc=%d\n", strerror(errno),soc);
return -1;
}
return 0;
}


int send_fdesc(int fd, const char* id )
{
int soc, ret;
        pid_t pid; 
// handshake_headers_t headers;

        soc = listen_un( id );

        pid     = getpid(); 

if( soc >= 0 ) {

// memset( &headers, 0 , sizeof( headers ));
// strcpy( headers.version, PROXY_HANDSHAKE_VERSION );
// headers.cmd = PROXY_HANDSHAKE_CMD;
// strcpy(headers.protocols, PROXY_HANDSHAKE_PROTOCOL );
//
// headers.type = PROXY_HANDSHAKE_TYPE_REQ;
// handshakeToTarget( fd, &headers);


ret    = send_un(soc, fd, &pid, sizeof(pid)); 
if( ret != -1 ) {
printf( "Send to  fd:%d from pid:%d\n", fd, pid );
}

}


close (soc);
perror( "close(soc) in send_fdesc()");

// handler_msg( "Go to  close:%d\n", soc );

return ret;
}

int recv_fdesc( const char* id )
{
int soc, ret, fd;
        int pid = 0; 

        soc       = connect_un( id );

if( soc >= 0 ) {
fd  = recv_un(soc, &pid, sizeof(pid));
// handler_msg( "Answer from pid %d( fd:%d)\n", pid, fd );
}

close( soc );
// handler_msg( "Go to  close:%d\n", soc );


        return fd;
}


テストプログラム
【送り手 send.c】
#include <stdio.h>
int main(void)
{
send_fdesc( 1, "/7716618000486" );
   perror("end");
   return 0;
}

【受け手 recv.c 】
int main(void)
{
      int fd = recv_fdesc( "/7716618000486" );
      printf("Recieve file descriptor %d\n", fd);
      char buf[1024];
      ssize_t len; 
      while( (len = read(0, buf, sizeof(buf))) > 0 ) {
          write(fd, buf, len);
      }
}





2016年8月26日金曜日

androidvncserverをビルドしてみた。

$ cd libvncserver
$ ./autogen.sh --without-gnutls --without-crypt --without-ipv6 --without-client-gcrypt --without-websockets --without-jpeg
$ cd examples/android
$ echo "APP_ABI := x86 armeabi armeabi-v7a" > jni/Application.mk

# PATH=$PATH:/home/takaha-m/Android/Ndk # ndkのインストール場所のPATHに設定
# ndk-build

autoreconfを使ってビルド環境構築


rm -rf Makefile.am aclocal.m4 autom4te.cache autoscan.log config.h.in config.log config.status configure configure.ac sample.c install-sh missing
#
# sample.c
#
vi sample.c <<__EOF__
i#include <stdio.h>
int main(int argc, char* argv[])
{
    printf("Hello, world!\n");
    return;
} ^[
ZZ
__EOF__
#
# Makefile.am
#
vi Makefile.am <<__EOF__
iROGRAMS=sample
SOURCES=sample.c ^[
ZZ
__EOF__
autoscan
mv configure.scan configure.ac
#
# configure.ac
#
vi configure.ac <<__EOF__
/FULL
:s/FULL-PACKAGE-NAME/sample/
:s/VERSION/1.0.0/
:s/BUG-REPORT-ADDRESS/hoge@piyo.co.jp/
/AC_INIT
oAM_INIT_AUTOMAKE([-Wall -Werror foreign])^[
ZZ
__EOF__
autoreconf -vfi
ls -l
./configure
ls -l
make


※^[は、viで本当のESCコードになおす。 cntl+v esc

2016年8月24日水曜日

Android studio カスタマイズ


1) viを使えるようにする。
  設定->Pluginsー>Browse repositoriesー>IdeaVimー>install

2) メニューフォントを変更する。
  設定->Appearance&Behavior->表示->"デフォルトのフォントをオーバライドする"

3) glxinfo がインストールされていない。
  apt-get install mesa-utils

4) エラー :A problem occurred configuring project ':app'.
> Buildtools 24.0.1 requires Java 1.8 or above. Current JDK version is 1.7.
     file->setting->project struct->SDK Location
 

Android studio カスタマイズ

1) viを使えるようにする。
  設定->Pluginsー>Browse repositoriesー>IdeaVimー>install
2) メニューフォントを変更する。
  設定->Appearance&Behavior->表示->"デフォルトのフォントをオーバライドする"


2016年8月23日火曜日

eclipse-neonをインストール


1) Install Android SDK

help->Install New software
http://dl-ssl.google.com/android/eclipse/
name: Android SDK
location: http://dl-ssl.google.com/android/eclipse/


下記で必要な表示を設定。
window->parspective->custamize Parspective



2)  eclipseにviをインストール

help->Install New software
http://vrapper.sourceforge.net/update-site/stable

3) eclipseにテーマをインストール
https://www.genuitec.com/tech/darkest-dark

JAVAをインストール



Java SE 10.0.1


jdk-10.0.1_linux-x64_bin.tar.gz


を/usr/lib/jvmに展開



update-alternatives --install  /usr/bin/java java /usr/lib/jvm/jdk-10.0.1/bin/java 100100 \
--slave /usr/bin/appletviewer appletviewer /usr/lib/jvm/jdk-10.0.1/bin/appletviewer \
--slave /usr/bin/idlj idlj /usr/lib/jvm/jdk-10.0.1/bin/idlj \
--slave /usr/bin/jaotc jaotc /usr/lib/jvm/jdk-10.0.1/bin/jaotc \
--slave /usr/bin/jar jar /usr/lib/jvm/jdk-10.0.1/bin/jar \
--slave /usr/bin/jarsigner jarsigner /usr/lib/jvm/jdk-10.0.1/bin/jarsigner \
--slave /usr/bin/javac javac /usr/lib/jvm/jdk-10.0.1/bin/javac \
--slave /usr/bin/javadoc javadoc /usr/lib/jvm/jdk-10.0.1/bin/javadoc \
--slave /usr/bin/javap javap /usr/lib/jvm/jdk-10.0.1/bin/javap \
--slave /usr/bin/javapackager javapackager /usr/lib/jvm/jdk-10.0.1/bin/javapackager \
--slave /usr/bin/javaws javaws /usr/lib/jvm/jdk-10.0.1/bin/javaws \
--slave /usr/bin/jcmd jcmd /usr/lib/jvm/jdk-10.0.1/bin/jcmd \
--slave /usr/bin/jconsole jconsole /usr/lib/jvm/jdk-10.0.1/bin/jconsole \
--slave /usr/bin/jcontrol jcontrol /usr/lib/jvm/jdk-10.0.1/bin/jcontrol \
--slave /usr/bin/jdb jdb /usr/lib/jvm/jdk-10.0.1/bin/jdb \
--slave /usr/bin/jdeprscan jdeprscan /usr/lib/jvm/jdk-10.0.1/bin/jdeprscan \
--slave /usr/bin/jdeps jdeps /usr/lib/jvm/jdk-10.0.1/bin/jdeps \
--slave /usr/bin/jhsdb jhsdb /usr/lib/jvm/jdk-10.0.1/bin/jhsdb \
--slave /usr/bin/jimage jimage /usr/lib/jvm/jdk-10.0.1/bin/jimage \
--slave /usr/bin/jinfo jinfo /usr/lib/jvm/jdk-10.0.1/bin/jinfo \
--slave /usr/bin/jjs jjs /usr/lib/jvm/jdk-10.0.1/bin/jjs \
--slave /usr/bin/jlink jlink /usr/lib/jvm/jdk-10.0.1/bin/jlink \
--slave /usr/bin/jmap jmap /usr/lib/jvm/jdk-10.0.1/bin/jmap \
--slave /usr/bin/jmc jmc /usr/lib/jvm/jdk-10.0.1/bin/jmc \
--slave /usr/bin/jmod jmod /usr/lib/jvm/jdk-10.0.1/bin/jmod \
--slave /usr/bin/jps jps /usr/lib/jvm/jdk-10.0.1/bin/jps \
--slave /usr/bin/jrunscript jrunscript /usr/lib/jvm/jdk-10.0.1/bin/jrunscript \
--slave /usr/bin/jshell jshell /usr/lib/jvm/jdk-10.0.1/bin/jshell \
--slave /usr/bin/jstack jstack /usr/lib/jvm/jdk-10.0.1/bin/jstack \
--slave /usr/bin/jstat jstat /usr/lib/jvm/jdk-10.0.1/bin/jstat \
--slave /usr/bin/jstatd jstatd /usr/lib/jvm/jdk-10.0.1/bin/jstatd \
--slave /usr/bin/jweblauncher jweblauncher /usr/lib/jvm/jdk-10.0.1/bin/jweblauncher \
--slave /usr/bin/keytool keytool /usr/lib/jvm/jdk-10.0.1/bin/keytool \
--slave /usr/bin/orbd orbd /usr/lib/jvm/jdk-10.0.1/bin/orbd \
--slave /usr/bin/pack200 pack200 /usr/lib/jvm/jdk-10.0.1/bin/pack200 \
--slave /usr/bin/rmic rmic /usr/lib/jvm/jdk-10.0.1/bin/rmic \
--slave /usr/bin/rmid rmid /usr/lib/jvm/jdk-10.0.1/bin/rmid \
--slave /usr/bin/rmiregistry rmiregistry /usr/lib/jvm/jdk-10.0.1/bin/rmiregistry \
--slave /usr/bin/schemagen schemagen /usr/lib/jvm/jdk-10.0.1/bin/schemagen \
--slave /usr/bin/serialver serialver /usr/lib/jvm/jdk-10.0.1/bin/serialver \
--slave /usr/bin/servertool servertool /usr/lib/jvm/jdk-10.0.1/bin/servertool \
--slave /usr/bin/tnameserv tnameserv /usr/lib/jvm/jdk-10.0.1/bin/tnameserv \
--slave /usr/bin/unpack200 unpack200 /usr/lib/jvm/jdk-10.0.1/bin/unpack200 \
--slave /usr/bin/wsgen wsgen /usr/lib/jvm/jdk-10.0.1/bin/wsgen \
--slave /usr/bin/wsimport wsimport /usr/lib/jvm/jdk-10.0.1/bin/wsimport \
--slave /usr/bin/xjc xjc /usr/lib/jvm/jdk-10.0.1/bin/xjc



































ここからJDKをダウンロード
http://www.oracle.com/technetwork/java/javase/downloads/index.html

/usr/lib/jvm下に展開。

#cd /usr/lib/jvm
#tar xvf jdk-8u101-linux-x64.tar.gz

#update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.8.0_101 18101

# update-alternatives --config java

alternative java (/usr/bin/java を提供) には 7 個の選択肢があります。

選択肢 パス 優先度 状態
------------------------------------------------------------
0 /usr/lib/jvm/jdk1.8.0_101/bin/java 18101 自動モード
1 /usr/lib/jvm/java-1.6.0-openjdk-amd64/bin/java 1072 手動モード
2 /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java 1061 手動モード
3 /usr/lib/jvm/java-6-oracle/bin/java 16043 手動モード
4 /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java 1071 手動モード
5 /usr/lib/jvm/java-7-oracle/jre/bin/java 16044 手動モード
* 6 /usr/lib/jvm/jdk1.8.0_101/bin/java 18101 手動モード
7 /usr/lib/jvm/jre1.8.0_101/bin/java 18100 手動モード

現在の選択 [*] を保持するには Enter、さもなければ選択肢の番号のキーを押してください: 6


削除する場合は、
#update-alternatives --remove java /usr/lib/jvm/jdk1.8.0/bin/java

NEXTJS PWA化

$ cd frontend $ npm install @ducanh2912/next-pwa $ vi next.config.ts<<__EOF__ import withPWAInit from "@ducanh2912/next-pwa"...