23
23
#endif
24
24
#include "epmd.h" /* Renamed from 'epmd_r4.h' */
25
25
#include "epmd_int.h"
26
+ #include "erl_printf.h"
26
27
27
28
#ifdef HAVE_STDLIB_H
28
29
# include <stdlib.h>
33
34
static void usage (EpmdVars * );
34
35
static void run_daemon (EpmdVars * );
35
36
static int get_port_no (void );
37
+ static int check_relaxed (void );
36
38
#ifdef __WIN32__
37
39
static int has_console (void );
38
40
#endif
@@ -161,6 +163,7 @@ int main(int argc, char** argv)
161
163
162
164
g -> silent = 0 ;
163
165
g -> is_daemon = 0 ;
166
+ g -> brutal_kill = check_relaxed ();
164
167
g -> packet_timeout = CLOSE_TIMEOUT ; /* Default timeout */
165
168
g -> delay_accept = 0 ;
166
169
g -> delay_write = 0 ;
@@ -196,6 +199,9 @@ int main(int argc, char** argv)
196
199
} else if (strcmp (argv [0 ], "-daemon" ) == 0 ) {
197
200
g -> is_daemon = 1 ;
198
201
argv ++ ; argc -- ;
202
+ } else if (strcmp (argv [0 ], "-relaxed_command_check" ) == 0 ) {
203
+ g -> brutal_kill = 1 ;
204
+ argv ++ ; argc -- ;
199
205
} else if (strcmp (argv [0 ], "-kill" ) == 0 ) {
200
206
if (argc == 1 )
201
207
kill_epmd (g );
@@ -387,10 +393,10 @@ static void run_daemon(EpmdVars *g)
387
393
388
394
static void usage (EpmdVars * g )
389
395
{
390
- fprintf (stderr , "usage: epmd [-d|-debug] [DbgExtra...] [-port No] [-daemon]\n" );
396
+ fprintf (stderr , "usage: epmd [-d|-debug] [DbgExtra...] [-port No] [-daemon] [-allow_brutal_kill] \n" );
391
397
fprintf (stderr , " [-d|-debug] [-port No] [-names|-kill|-stop name]\n\n" );
392
- fprintf (stderr , "See the Erlang epmd manual page for info about the usage.\n" );
393
- fprintf (stderr , "The -port and DbgExtra options are\n \n" );
398
+ fprintf (stderr , "See the Erlang epmd manual page for info about the usage.\n\n " );
399
+ fprintf (stderr , "Regular options\n" );
394
400
fprintf (stderr , " -port No\n" );
395
401
fprintf (stderr , " Let epmd listen to another port than default %d\n" ,
396
402
EPMD_PORT_NO );
@@ -401,6 +407,14 @@ static void usage(EpmdVars *g)
401
407
fprintf (stderr , " the number of saved used node names to 5.\n\n" );
402
408
fprintf (stderr , " If you give more than one debug flag you may\n" );
403
409
fprintf (stderr , " get more debugging information.\n\n" );
410
+ fprintf (stderr , " -daemon\n" );
411
+ fprintf (stderr , " Start epmd detached (as a daemon)\n" );
412
+ fprintf (stderr , " -relaxed_command_check\n" );
413
+ fprintf (stderr , " Allow this instance of epmd to be killed with\n" );
414
+ fprintf (stderr , " epmd -kill even if there "
415
+ "are registered nodes.\n" );
416
+ fprintf (stderr , " Also allows forced unregister (epmd -stop).\n" );
417
+ fprintf (stderr , "\nDbgExtra options\n" );
404
418
fprintf (stderr , " -packet_timout Seconds\n" );
405
419
fprintf (stderr , " Set the number of seconds a connection can be\n" );
406
420
fprintf (stderr , " inactive before epmd times out and closes the\n" );
@@ -413,6 +427,18 @@ static void usage(EpmdVars *g)
413
427
fprintf (stderr , " -delay_write Seconds\n" );
414
428
fprintf (stderr , " Also a simulation of a busy server. Inserts\n" );
415
429
fprintf (stderr , " a delay before a reply is sent.\n" );
430
+ fprintf (stderr , "\nInteractive options\n" );
431
+ fprintf (stderr , " -names\n" );
432
+ fprintf (stderr , " List names registered with the currently "
433
+ "running epmd\n" );
434
+ fprintf (stderr , " -kill\n" );
435
+ fprintf (stderr , " Kill the currently runniing epmd\n" );
436
+ fprintf (stderr , " (only allowed if -names show empty database or\n" );
437
+ fprintf (stderr , " -allow_brutal_kill was given when epmd was started).\n" );
438
+ fprintf (stderr , " -stop Name\n" );
439
+ fprintf (stderr , " Forcibly unregisters a name with epmd\n" );
440
+ fprintf (stderr , " (only allowed if -allow_brutal_kill was given when \n" );
441
+ fprintf (stderr , " epmd was started).\n" );
416
442
epmd_cleanup_exit (g ,1 );
417
443
}
418
444
@@ -432,20 +458,20 @@ static void usage(EpmdVars *g)
432
458
* args... Arguments to print out according to the format
433
459
*
434
460
*/
435
-
461
+ #define DEBUG_BUFFER_SIZE 2048
436
462
static void dbg_gen_printf (int onsyslog ,int perr ,int from_level ,
437
463
EpmdVars * g ,const char * format , va_list args )
438
464
{
439
465
time_t now ;
440
466
char * timestr ;
441
- char buf [2048 ];
467
+ char buf [DEBUG_BUFFER_SIZE ];
442
468
443
469
if (g -> is_daemon )
444
470
{
445
471
#ifndef NO_SYSLOG
446
472
if (onsyslog )
447
473
{
448
- vsprintf (buf , format , args );
474
+ erts_vsnprintf (buf , DEBUG_BUFFER_SIZE , format , args );
449
475
syslog (LOG_ERR ,"epmd: %s" ,buf );
450
476
}
451
477
#endif
@@ -456,9 +482,10 @@ static void dbg_gen_printf(int onsyslog,int perr,int from_level,
456
482
457
483
time (& now );
458
484
timestr = (char * )ctime (& now );
459
- sprintf (buf , "epmd: %.*s: " , (int ) strlen (timestr )- 1 , timestr );
485
+ erts_snprintf (buf , DEBUG_BUFFER_SIZE , "epmd: %.*s: " ,
486
+ (int ) strlen (timestr )- 1 , timestr );
460
487
len = strlen (buf );
461
- vsprintf (buf + len , format , args );
488
+ erts_vsnprintf (buf + len , DEBUG_BUFFER_SIZE - len , format , args );
462
489
if (perr == 1 )
463
490
perror (buf );
464
491
else
@@ -545,4 +572,9 @@ static int get_port_no(void)
545
572
char * port_str = getenv ("ERL_EPMD_PORT" );
546
573
return (port_str != NULL ) ? atoi (port_str ) : EPMD_PORT_NO ;
547
574
}
575
+ static int check_relaxed (void )
576
+ {
577
+ char * port_str = getenv ("ERL_EPMD_RELAXED_COMMAND_CHECK" );
578
+ return (port_str != NULL ) ? 1 : 0 ;
579
+ }
548
580
0 commit comments