| 
     
      
      
      From: KITAGAWA T. <ra...@km...> - 2002-05-07 14:39:47
      
     
   | 
先程このMLに登録させてもらいました。
以後よろしくお願いします。
mlterm 2.4.0 を FreeBSD 4.5 + XFree86 4.2.0 上で使ってみましたが、
いくつか不便な点があったので改造しました。
1. TERM を xterm や kterm に決め打ちされると emacs (21.2) のターミナル
モードで色が出ません。w3m では出るのですが、多分 termcap データベースを
無視しているのでしょう。
色付きの xterm 用には xterm-color が、色付きの kterm 用には
kterm16c という termcap エントリがあるのでこちらを使えば色が出るのですが、
mlterm 2.4.0 は TERM として xterm と kterm しか受け付けてくれません。
アーカイブを斜めよみしたらつい最近このへんが問題になっていたみたいですが、
手元では解決方法として term_type として「termcap 的に有効な名前なら受け
入れる」というように改造して使ってます。
今しがた CVS 版を取り出したらこの部分は「とりあえず何指定してもOK」
に変わってしまってるようですが。
2. xterm や kterm と違って tty の ECHOKE と ECHOCTL フラグが最初から
有効になってないので行編集時の挙動が変わってしまうようです。
これも xterm , kterm と同じになるように改造して使っています。
3. daemon モードで通信用に使うソケットが全ユーザ共通でマルチユーザ環境だと
使えないので、ユーザ名をつけるようにしてみました。
2.4.0 からの差分なんて今さら役にたたないかもしれませんが、
参考用に後につけておきます。ご検討ください。
手抜きパッチなのでそのまま取り込まれるといろいろ困ったことになると思いますが…
-- 
北川拓郎@京大マイコンクラブ(KMC)
E-mail:ra...@km...
diff -ruBw -x configure -x *~ -x *.orig mlterm-2.4.0.orig/autoconf/configure.in mlterm-2.4.0/autoconf/configure.in
--- mlterm-2.4.0.orig/autoconf/configure.in	Sun Apr 14 22:46:01 2002
+++ mlterm-2.4.0/autoconf/configure.in	Tue May  7 16:51:16 2002
@@ -152,6 +152,11 @@
 fi
 AC_SUBST(GTK_CONFIG)
 
+AC_CHECK_LIB(termcap,tgetent,[TERMCAP_LIBS=-ltermcap])
+AC_SUBST(TERMCAP_LIBS)
+
+AC_CHECK_FUNCS(daemon)
+
 MAKE_DIRS="${TOPDIR}/src ${TOPDIR}/tool/mlclient ${TOPDIR}/man ${TOPDIR}/etc ${TOPDIR}/scrollbar/sample ${MAKE_DIRS}"
 AC_SUBST(MAKE_DIRS)
 
diff -ruBw -x configure -x *~ -x *.orig mlterm-2.4.0.orig/kiklib/src/kik_pty_bsd.c mlterm-2.4.0/kiklib/src/kik_pty_bsd.c
--- mlterm-2.4.0.orig/kiklib/src/kik_pty_bsd.c	Sun Apr 14 22:46:02 2002
+++ mlterm-2.4.0/kiklib/src/kik_pty_bsd.c	Tue May  7 13:29:28 2002
@@ -187,7 +187,14 @@
 	tio.c_iflag = BRKINT | IGNPAR | ICRNL | IXON ;
 	tio.c_oflag = OPOST | ONLCR ;
 	tio.c_cflag = CS8 | CREAD ;
-	tio.c_lflag = ISIG | ICANON | IEXTEN | ECHO | ECHOE | ECHOK ;
+	tio.c_lflag = ISIG | ICANON | ECHO | ECHOE | ECHOK
+#ifdef ECHOKE
+		| ECHOKE | IEXTEN
+#endif
+#ifdef ECHOCTL
+		| ECHOCTL | IEXTEN
+#endif
+		;
 
 	tio.c_cc[VEOF] = CEOF ;
 	tio.c_cc[VEOL] = VDISABLE ;
diff -ruBw -x configure -x *~ -x *.orig mlterm-2.4.0.orig/src/Makefile.in mlterm-2.4.0/src/Makefile.in
--- mlterm-2.4.0.orig/src/Makefile.in	Sun Apr 14 22:46:01 2002
+++ mlterm-2.4.0/src/Makefile.in	Tue May  7 17:01:35 2002
@@ -30,12 +30,12 @@
 LKIK_DEB = -lkik_deb
 LMKF_DEB = -lmkf_deb
 
-CFLAGS=$(CFLAGS_LOCAL) @KIK_CFLAGS@ @MKF_CFLAGS@ @DEB_CFLAGS@ @IMLIB_CFLAGS@ @FRIBIDI_CFLAGS@ \
+CFLAGS=$(CFLAGS_LOCAL) @DEFS@ @KIK_CFLAGS@ @MKF_CFLAGS@ @DEB_CFLAGS@ @IMLIB_CFLAGS@ @FRIBIDI_CFLAGS@ \
 	@AA_CFLAGS@ @UCS4_CFLAGS@ @IND_CFLAGS@ @UTMP_CFLAGS@ @XUTF8_CFLAGS@ @CFLAGS@ \
 	-DLIBDIR=\"$(LIBDIR)\" -DLIBEXECDIR=\"$(LIBEXECDIR)\" -DSYSCONFDIR=\"$(SYSCONFDIR)\" \
 	-I/usr/X11R6/include -I/usr/local/include
 LIBS=$(LIBS_LOCAL) @FRIBIDI_LIBS@ @IMLIB_LIBS@ @AA_LIBS@ @IND_LIBS@ \
-	@X_EXTRA_LIBS@ -lX11 $(LKIK) $(LMKF) @DL_LIBS@ \
+	@X_EXTRA_LIBS@ -lX11 $(LKIK) $(LMKF) @DL_LIBS@ @TERMCAP_LIBS@ \
 	-L/usr/X11R6/lib -L/usr/local/lib -R/usr/X11R6/lib -R/usr/local/lib
 
 PROG = mlterm
diff -ruBw -x configure -x *~ -x *.orig mlterm-2.4.0.orig/src/ml_term_manager.c mlterm-2.4.0/src/ml_term_manager.c
--- mlterm-2.4.0.orig/src/ml_term_manager.c	Sun Apr 14 22:46:01 2002
+++ mlterm-2.4.0/src/ml_term_manager.c	Tue May  7 16:53:35 2002
@@ -2,6 +2,8 @@
  *	$Id: ml_term_manager.c,v 1.68 2002/04/10 12:06:17 arakiken Exp $
  */
 
+#define RANRAN_HACK
+
 #include  "ml_term_manager.h"
 
 #include  <stdio.h>		/* sprintf */
@@ -23,6 +25,9 @@
 #include  <kiklib/kik_locale.h>	/* kik_get_codeset */
 #include  <kiklib/kik_net.h>	/* socket/bind/listen/sockaddr_un */
 #include  <mkf/mkf_charset.h>	/* mkf_charset_t */
+#ifdef RANRAN_HACK
+#include  <term.h>
+#endif
 
 #include  "version.h"
 #include  "ml_xim.h"
@@ -614,6 +619,8 @@
 				if( un_file)
 				{
 					unlink( un_file) ;
+					free( un_file) ;
+					un_file = NULL ;
 				}
 			
 				exit( 0) ;
@@ -666,6 +673,8 @@
 	if( un_file)
 	{
 		unlink( un_file) ;
+		free( un_file) ;
+		un_file = NULL ;
 	}
 	
 	exit(status) ;
@@ -747,6 +756,8 @@
 	if( un_file)
 	{
 		unlink( un_file) ;
+		free( un_file) ;
+		un_file = NULL ;
 	}
 
 	/* reset */
@@ -755,29 +766,12 @@
 	kill( getpid() , sig) ;
 }
 
-
-static int
-start_daemon(
-	ml_term_manager_t *  term_man
-	)
-{
-	int  fd ;
-	char *  path = "/tmp/mlterm.unix" ;
-	pid_t  pid ;
-	int  sock_fd ;
-	struct sockaddr_un  servaddr ;
-
-	if( ( fd = creat( path , 0600)) == -1)
+static void
+mydaemonize(void)
 	{
-		/* already exists */
-
-		kik_msg_printf( "remove %s before starting daemon.\n" , path) ;
-
-		return  -1 ;
-	}
-
-	close( fd) ;
-	
+#ifdef HAVE_DAEMON
+	daemon(0, 1);
+#else
 	pid = fork() ;
 
 	if( pid == -1)
@@ -820,17 +814,63 @@
 	/*
 	 * grandchild
 	 */
+#endif
+}
+
+static int
+start_daemon(
+	ml_term_manager_t *  term_man
+	)
+{
+	int  fd ;
+#ifndef RANRAN_HACK
+	char *  path = "/tmp/mlterm.unix" ;
+#endif
+	pid_t  pid ;
+	int  sock_fd ;
+	struct sockaddr_un  servaddr ;
+
+#ifndef RANRAN_HACK
+	if( ( fd = creat( path , 0600)) == -1)
+	{
+		/* already exists */
+
+		kik_msg_printf( "remove %s before starting daemon.\n" , path) ;
+
+		return  -1 ;
+	}
+
+	close( fd) ;
+#endif
+
+	mydaemonize() ;
 
 	if( ( sock_fd = socket( AF_LOCAL , SOCK_STREAM , 0)) < 0)
 	{
 		return  -1 ;
 	}
 
+#ifndef RANRAN_HACK
 	unlink( path) ;
+#endif
 
 	memset( &servaddr , 0 , sizeof( servaddr)) ;
 	servaddr.sun_family = AF_LOCAL ;
+#ifdef RANRAN_HACK
+	{
+		struct passwd *  pw = getpwuid(getuid());
+		if( pw != NULL)
+		{
+			sprintf( servaddr.sun_path , "/tmp/mlterm.unix.%s", pw->pw_name) ;
+		}
+		else
+		{
+			strcpy( servaddr.sun_path , "/tmp/mlterm.unix") ;
+		}
+	}
+#else
 	strcpy( servaddr.sun_path , path) ;
+#endif
 
 	if( bind( sock_fd , (struct sockaddr *) &servaddr , sizeof( servaddr)) < 0)
 	{
@@ -839,6 +879,8 @@
 		return  -1 ;
 	}
 	
+	chmod( servaddr.sun_path , 0600) ;
+	
 	if( listen( sock_fd , 1024) < 0)
 	{
 		close( sock_fd) ;
@@ -846,7 +888,11 @@
 		return  -1 ;
 	}
 
-	un_file = path ;
+#ifdef RANRAN_HACK
+	un_file = strdup( servaddr.sun_path) ;
+#else
+	un_file = strdup( path) ;
+#endif
 
 	return  sock_fd ;
 }
@@ -1012,8 +1058,12 @@
 	char **  argv
 	)
 {
+#ifdef RANRAN_HACK
+	char *  default_term_type = "xterm" ;
+#else
 	char *  kterm = "kterm" ;
 	char *  xterm = "xterm" ;
+#endif
 	char *  value ;
 	
 	if( ( value = kik_conf_get_value( conf , "display")) == NULL)
@@ -1179,6 +1229,27 @@
 	
 	if( ( value = kik_conf_get_value( conf , "termtype")))
 	{
+#ifdef RANRAN_HACK
+		char tcap[1024];
+		if( tgetent( tcap , value) == 1)
+		{
+			if( ( term_man->conf.term_type = malloc( strlen( value) + 1)) != NULL)
+			{
+				strcpy( term_man->conf.term_type , value) ;
+			}
+		}
+		else
+		{
+			term_man->conf.term_type = NULL ;
+		}
+		if( term_man->conf.term_type == NULL)
+		{
+			kik_msg_printf(
+				"cannot set terminal type. %s will be used.\n", default_term_type) ;
+
+			term_man->conf.term_type = strdup( default_term_type) ;
+		}
+#else
 		if( strcasecmp( value , kterm) == 0)
 		{
 			term_man->conf.term_type = kterm ;
@@ -1194,10 +1265,15 @@
 
 			term_man->conf.term_type = xterm ;
 		}
+#endif
 	}
 	else
 	{
+#ifdef RANRAN_HACK
+		term_man->conf.term_type = strdup( default_term_type) ;
+#else
 		term_man->conf.term_type = xterm ;
+#endif
 	}
 	
 	term_man->conf.x = 0 ;
@@ -1615,7 +1691,12 @@
 	free( term_man->conf.sb_fg_color) ;
 	free( term_man->conf.sb_bg_color) ;
 	free( term_man->conf.cmd_argv) ;
-
+#ifdef RANRAN_HACK
+	if( term_man->conf.term_type)
+	{
+		free( term_man->conf.term_type) ;
+	}
+#endif
 	return  1 ;
 }
 
@@ -1625,7 +1706,7 @@
 	)
 {
 	struct sockaddr_un  addr ;
-	socklen_t  sock_len ;
+	socklen_t  sock_len = sizeof(addr);
 	int  fd ;
 	FILE *  fp ;
 	kik_file_t *  from ;
@@ -1938,6 +2019,10 @@
 		{
 		}
 	#endif
+		else
+		{
+			kik_msg_printf( "daemon_mode must be either 'genuine' or 'blend'.\n");
+		}
 	}
 
 	use_xim = 1 ;
diff -ruBw -x configure -x *~ -x *.orig mlterm-2.4.0.orig/tool/mlclient/main.c mlterm-2.4.0/tool/mlclient/main.c
--- mlterm-2.4.0.orig/tool/mlclient/main.c	Sun Apr 14 22:46:01 2002
+++ mlterm-2.4.0/tool/mlclient/main.c	Tue May  7 16:49:15 2002
@@ -2,12 +2,14 @@
  *	$Id: main.c,v 1.6 2002/02/17 02:06:03 arakiken Exp $
  */
 
+#define  RANRAN_HACK
+
 #include  <stdio.h>
 #include  <sys/types.h>
 #include  <unistd.h>		/* write */
 #include  <string.h>		/* memset */
 #include  <kiklib/kik_net.h>	/* socket/bind/listen/sockaddr_un */
-
+#include  <pwd.h>
 
 /* --- static variables --- */
 
@@ -37,7 +39,8 @@
 {
 	int  counter ;
 
-	printf( "Not available options.\n") ;
+	printf( "Usage: mlclient <options for mlterm>\n") ;
+	printf( "Note: Following options are not available:\n") ;
 
 	for( counter = 0 ; counter < sizeof( na_options) / sizeof( na_options[0]) ; counter ++)
 	{
@@ -59,7 +62,7 @@
 	struct sockaddr_un  servaddr ;
 	int  counter ;
 
-	for( counter = 0 ; counter < argc ; counter ++)
+	for( counter = 1 ; counter < argc ; counter ++)
 	{
 		if( ( p = strrchr( argv[counter] , '-')) != NULL)
 		{
@@ -87,7 +90,22 @@
 	
 	memset( &servaddr , 0 , sizeof( servaddr)) ;
 	servaddr.sun_family = AF_LOCAL ;
+#ifdef RANRAN_HACK
+ 	{
+		struct passwd *pw = getpwuid( getuid());
+		if( pw != NULL)
+		{
+			sprintf( servaddr.sun_path , "/tmp/mlterm.unix.%s", pw->pw_name) ;
+		}
+		else
+		{
+			strcpy( servaddr.sun_path , "/tmp/mlterm.unix") ;
+		}
+		
+	}
+#else
 	strcpy( servaddr.sun_path , "/tmp/mlterm.unix") ;
+#endif
 	
 	if( connect( sock_fd , (struct sockaddr*) &servaddr , sizeof( servaddr)) < 0)
 	{
 |