From: Nobuyoshi N. <nob...@so...> - 2003-01-25 16:07:06
|
なかだです。 At Tue, 21 Jan 2003 13:38:31 +0900, Nobuyoshi Nakada wrote: > でも/tmp/mlterm.unixはunlink()してbind()してしまうので、結局は > 関係ないと思いますが。存在チェックとかせずに、単にbind()するだ > けでいいような気がしてきました。 デーモンが死んでる場合にはなりかわるようにしてみました。 Index: tool/mlclient/main.c =================================================================== RCS file: /cvsroot/mlterm/mlterm/tool/mlclient/main.c,v retrieving revision 1.7 diff -u -2 -p -r1.7 main.c --- tool/mlclient/main.c 14 May 2002 12:05:24 -0000 1.7 +++ tool/mlclient/main.c 25 Jan 2003 16:03:41 -0000 @@ -88,5 +88,5 @@ main( memset( &servaddr , 0 , sizeof( servaddr)) ; servaddr.sun_family = AF_LOCAL ; - strcpy( servaddr.sun_path , "/tmp/mlterm.unix") ; + sprintf( servaddr.sun_path , "/tmp/.mlterm-%d.unix" , getuid()) ; if( connect( sock_fd , (struct sockaddr*) &servaddr , sizeof( servaddr)) < 0) Index: xwindow/x_term_manager.c =================================================================== RCS file: /cvsroot/mlterm/mlterm/xwindow/x_term_manager.c,v retrieving revision 1.22 diff -u -2 -p -r1.22 x_term_manager.c --- xwindow/x_term_manager.c 23 Nov 2002 08:10:41 -0000 1.22 +++ xwindow/x_term_manager.c 25 Jan 2003 16:03:41 -0000 @@ -13,5 +13,5 @@ #include <signal.h> /* kill */ #include <stdlib.h> /* getenv */ -#include <fcntl.h> /* creat */ +#include <errno.h> #include <kiklib/kik_debug.h> #include <kiklib/kik_str.h> /* kik_str_sep/kik_str_to_int/kik_str_alloca_dup/strdup */ @@ -666,20 +666,39 @@ start_daemon(void) { int fd ; - char * path = "/tmp/mlterm.unix" ; pid_t pid ; int sock_fd ; struct sockaddr_un servaddr ; + char * const path = servaddr.sun_path ; - if( ( fd = creat( path , 0600)) == -1) + memset( &servaddr , 0 , sizeof( servaddr)) ; + servaddr.sun_family = AF_LOCAL ; + sprintf( path , "/tmp/.mlterm-%d.unix" , getuid()) ; + + if( ( sock_fd = socket( AF_LOCAL , SOCK_STREAM , 0)) < 0) + { + return -1 ; + } + + while( bind( sock_fd , (struct sockaddr *) &servaddr , sizeof( servaddr)) < 0) { - /* already exists */ + if( errno == EADDRINUSE) + { + if( connect( sock_fd , (struct sockaddr*) &servaddr , sizeof( servaddr)) == 0) + { + kik_msg_printf( "daemon is already running.\n") ; + return -1 ; + } + + kik_msg_printf( "removing stale lock file %s.\n" , path) ; + if( unlink( path) == 0) continue ; + } + + close( sock_fd) ; - kik_msg_printf( "remove %s before starting daemon.\n" , path) ; + kik_msg_printf( "failed to lock file %s: %s\n" , path , strerror(errno)) ; return -1 ; } - close( fd) ; - pid = fork() ; @@ -725,30 +744,13 @@ start_daemon(void) */ - if( ( sock_fd = socket( AF_LOCAL , SOCK_STREAM , 0)) < 0) - { - return -1 ; - } - - unlink( path) ; - - memset( &servaddr , 0 , sizeof( servaddr)) ; - servaddr.sun_family = AF_LOCAL ; - strcpy( servaddr.sun_path , path) ; - - if( bind( sock_fd , (struct sockaddr *) &servaddr , sizeof( servaddr)) < 0) - { - close( sock_fd) ; - - return -1 ; - } - if( listen( sock_fd , 1024) < 0) { close( sock_fd) ; + unlink( path) ; return -1 ; } - un_file = path ; + un_file = strdup( path) ; return sock_fd ; -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦 |