@@ -1897,30 +1897,28 @@ static int usage_server(const char *err)
18971897
18981898#define LISTEN_BACKLOG 1
18991899static int
1900- cmd_server ( int argc , char * argv [] )
1900+ server_bind_socket ( const char * path )
19011901{
1902- int sfd = -1 , cfd , sockaddr_len , rv ;
1903- const char * unixsocket ;
1902+ int sfd = -1 , rv , sockaddr_len ;
19041903 struct sockaddr_un sockaddr ;
19051904
1906- if (argc < 2 )
1907- return usage_server ("UNIX socket argument is missing" );
1908-
1909- unixsocket = argv [1 ];
1910-
1911- if (argc >= 3 )
1912- strcpy (storage_dir , argv [2 ]);
1905+ /* Handle invocation by libcare.service */
1906+ if (path [0 ] == '&' ) {
1907+ if (sscanf (path , "&%d" , & sfd ) == 0 )
1908+ return -1 ;
1909+ return sfd ;
1910+ }
19131911
19141912 memset (& sockaddr , 0 , sizeof (sockaddr ));
19151913 sockaddr .sun_family = AF_UNIX ;
1916- sockaddr_len = strlen (unixsocket ) + 1 ;
1914+ sockaddr_len = strlen (path ) + 1 ;
19171915 if (sockaddr_len >= sizeof (sockaddr .sun_path )) {
19181916 kperr ("sockaddr is too long\n" );
19191917 return -1 ;
19201918 }
19211919
1922- strncpy (sockaddr .sun_path , unixsocket , sizeof (sockaddr .sun_path ));
1923- if (unixsocket [0 ] == '\n ' )
1920+ strncpy (sockaddr .sun_path , path , sizeof (sockaddr .sun_path ));
1921+ if (path [0 ] == '@ ' )
19241922 sockaddr .sun_path [0 ] = '\0' ;
19251923
19261924 sockaddr_len += sizeof (sockaddr .sun_family );
@@ -1938,6 +1936,31 @@ cmd_server(int argc, char *argv[])
19381936 if (rv == -1 )
19391937 goto err_close ;
19401938
1939+ return sfd ;
1940+
1941+ err_close :
1942+ if (rv < 0 )
1943+ kplogerror ("can't listen on unix socket %s\n" , path );
1944+ if (sfd != -1 )
1945+ close (sfd );
1946+ return rv ;
1947+ }
1948+
1949+ static int
1950+ cmd_server (int argc , char * argv [])
1951+ {
1952+ int sfd = -1 , cfd , rv ;
1953+
1954+ if (argc < 2 )
1955+ return usage_server ("UNIX socket argument is missing" );
1956+
1957+ sfd = server_bind_socket (argv [1 ]);
1958+ if (sfd < 0 )
1959+ return sfd ;
1960+
1961+ if (argc >= 3 )
1962+ strcpy (storage_dir , argv [2 ]);
1963+
19411964 setlinebuf (stdout );
19421965
19431966 while ((cfd = accept4 (sfd , NULL , 0 , SOCK_CLOEXEC )) >= 0 ) {
@@ -1950,12 +1973,8 @@ cmd_server(int argc, char *argv[])
19501973 break ;
19511974 }
19521975
1953- err_close :
1954- if (rv < 0 )
1955- kplogerror ("can't listen on unix socket %s\n" , unixsocket );
1956- if (sfd != -1 )
1957- close (sfd );
1958- return rv ;
1976+ close (sfd );
1977+ return 0 ;
19591978}
19601979
19611980
0 commit comments