#define SERVER_READ_BUF_LEN 4096
-static char *opt_list = "s:vr";
+static char *opt_list = "s:vrl";
static int verbose, restricted, once;
static char *init_cmd;
static void
usage(char *name)
{
- fprintf(stderr, "Usage: %s [-s <control-socket>] [-v] [-r]\n", name);
+ fprintf(stderr, "Usage: %s [-s <control-socket>] [-v] [-r] [-l]\n", name);
exit(1);
}
static void
parse_args(int argc, char **argv)
{
+ int server_changed = 0;
int c;
while ((c = getopt(argc, argv, opt_list)) >= 0)
{
case 's':
server_path = optarg;
+ server_changed = 1;
break;
case 'v':
verbose++;
case 'r':
restricted = 1;
break;
+ case 'l':
+ if (!server_changed)
+ server_path = xbasename(server_path);
+ break;
default:
usage(argv[0]);
}
<tag>-f</tag>
run bird in foreground.
+ <tag>-l</tag>
+ look for a configuration file and a communication socket in the current
+ working directory instead of in default system paths. However, paths
+ specified by options <cf/-c/, <cf/-s/ have higher priority.
+
<tag>-R</tag>
apply graceful restart recovery after start.
</descrip>
int patmatch(const byte *pat, const byte *str);
+static inline char *xbasename(const char *str)
+{
+ char *s = strrchr(str, '/');
+ return s ? s+1 : (char *) str;
+}
+
#endif
* Parsing of command-line arguments
*/
-static char *opt_list = "c:dD:ps:P:u:g:fR";
+static char *opt_list = "c:dD:ps:P:u:g:flR";
static int parse_and_exit;
char *bird_name;
static char *use_user;
static void
usage(void)
{
- fprintf(stderr, "Usage: %s [-c <config-file>] [-d] [-D <debug-file>] [-p] [-s <control-socket>] [-P <pid-file>] [-u <user>] [-g <group>] [-f] [-R]\n", bird_name);
+ fprintf(stderr, "Usage: %s [-c <config-file>] [-d] [-D <debug-file>] [-p] [-s <control-socket>] [-P <pid-file>] [-u <user>] [-g <group>] [-f] [-l] [-R]\n", bird_name);
exit(1);
}
if (!s)
return 0;
-
+
errno = 0;
rv = strtol(s, &endptr, 10);
static void
parse_args(int argc, char **argv)
{
+ int config_changed = 0;
+ int socket_changed = 0;
int c;
bird_name = get_bird_name(argv[0], "bird");
{
case 'c':
config_name = optarg;
+ config_changed = 1;
break;
case 'd':
debug_flag |= 1;
break;
case 's':
path_control_socket = optarg;
+ socket_changed = 1;
break;
case 'P':
pid_file = optarg;
case 'f':
run_in_foreground = 1;
break;
+ case 'l':
+ if (!config_changed)
+ config_name = xbasename(config_name);
+ if (!socket_changed)
+ path_control_socket = xbasename(path_control_socket);
+ break;
case 'R':
graceful_restart_recovery();
break;