+#ifndef _BIRD_SYSPRIV_H_
+#define _BIRD_SYSPRIV_H_
+#include <unistd.h>
#include <sys/prctl.h>
#include <linux/capability.h>
if (setresuid(uid, uid, uid) < 0)
die("setresuid: %m");
}
+
+#endif /* _BIRD_SYSPRIV_H_ */
log.c
main_helper.c
+main_helper.h
timer.h
io.c
unix.h
* Can be freely distributed and used under the terms of the GNU GPL.
*/
-#include "lib/main_helper.c"
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE 1
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <signal.h>
+#include <pwd.h>
+#include <grp.h>
+#include <sys/stat.h>
+#include <libgen.h>
+
+#include "nest/bird.h"
+#include "lib/lists.h"
+#include "lib/resource.h"
+#include "lib/socket.h"
+#include "lib/event.h"
+#include "lib/string.h"
+#include "nest/route.h"
+#include "nest/protocol.h"
+#include "nest/iface.h"
+#include "nest/cli.h"
+#include "nest/locks.h"
+#include "conf/conf.h"
+#include "filter/filter.h"
+
+#include "unix.h"
+#include "krt.h"
+
+#include "lib/main_helper.h"
+
/*
* Hic Est main()
#undef LOCAL_DEBUG
+#ifndef _GNU_SOURCE
#define _GNU_SOURCE 1
+#endif
#include <stdio.h>
#include <stdlib.h>
*/
#ifdef DEBUGGING
-static int debug_flag = 1;
+int debug_flag = 1;
#else
-static int debug_flag = 0;
+int debug_flag = 0;
#endif
void
#include "lib/syspriv.h"
#else
-static inline void
+void
drop_uid(uid_t uid)
{
die("Cannot change user on this platform");
#endif
-static inline void
+void
drop_gid(gid_t gid)
{
if (setgid(gid) < 0)
#ifdef PATH_IPROUTE_DIR
-static inline void
+void
add_num_const(char *name, int val)
{
struct symbol *s = cf_find_symbol(name);
/* the code of read_iproute_table() is based on
rtnl_tab_initialize() from iproute2 package */
-static void
+void
read_iproute_table(char *file, char *prefix, int max)
{
char buf[512], namebuf[512];
#endif // PATH_IPROUTE_DIR
-static char *config_name = PATH_CONFIG_FILE;
+char *config_name = PATH_CONFIG_FILE;
-static int
+int
cf_read(byte *dest, uint len, int fd)
{
int l = read(fd, dest, len);
return 0;
}
-static int
+int
unix_read_config(struct config **cp, char *name)
{
struct config *conf = config_alloc(name);
return ret;
}
-static struct config *
+struct config *
read_config(void)
{
struct config *conf;
config_commit(conf, RECONFIG_HARD, 0);
}
-static struct config *
+struct config *
cmd_read_config(char *name)
{
struct config *conf;
config_free(conf);
}
-static void
+void
cmd_reconfig_msg(int r)
{
switch (r)
* Command-Line Interface
*/
-static sock *cli_sk;
-static char *path_control_socket = PATH_CONTROL_SOCKET;
+sock *cli_sk;
+char *path_control_socket = PATH_CONTROL_SOCKET;
-static void
+void
cli_write(cli *c)
{
sock *s = c->priv;
cli_write(c);
}
-static void
+void
cli_tx(sock *s)
{
cli_write(s->data);
return 0;
}
-static int
+int
cli_rx(sock *s, int size UNUSED)
{
cli_kick(s->data);
return 0;
}
-static void
+void
cli_err(sock *s, int err)
{
if (config->cli_debug)
cli_free(s->data);
}
-static int
+int
cli_connect(sock *s, int size UNUSED)
{
cli *c;
return 1;
}
-static void
+void
cli_init_unix(uid_t use_uid, gid_t use_gid)
{
sock *s;
* PID file
*/
-static char *pid_file;
-static int pid_fd;
+char *pid_file;
+int pid_fd;
-static inline void
+void
open_pid_file(void)
{
if (!pid_file)
die("Cannot create PID file %s: %m", pid_file);
}
-static inline void
+void
write_pid_file(void)
{
int pl, rv;
close(pid_fd);
}
-static inline void
+void
unlink_pid_file(void)
{
if (pid_file)
* Signals
*/
-static void
+void
handle_sighup(int sig UNUSED)
{
DBG("Caught SIGHUP...\n");
async_config_flag = 1;
}
-static void
+void
handle_sigusr(int sig UNUSED)
{
DBG("Caught SIGUSR...\n");
async_dump_flag = 1;
}
-static void
+void
handle_sigterm(int sig UNUSED)
{
DBG("Caught SIGTERM...\n");
void watchdog_sigalrm(int sig UNUSED);
-static void
+void
signal_init(void)
{
struct sigaction sa;
* Parsing of command-line arguments
*/
-static char *opt_list = "c:dD:ps:P:u:g:fR";
-static int parse_and_exit;
+char *opt_list = "c:dD:ps:P:u:g:fR";
+int parse_and_exit;
char *bird_name;
-static char *use_user;
-static char *use_group;
-static int run_in_foreground = 0;
+char *use_user;
+char *use_group;
+int run_in_foreground = 0;
-static void
+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);
exit(1);
}
-static inline char *
+char *
get_bird_name(char *s, char *def)
{
char *t;
return t+1;
}
-static inline uid_t
+uid_t
get_uid(const char *s)
{
struct passwd *pw;
return pw->pw_uid;
}
-static inline gid_t
+gid_t
get_gid(const char *s)
{
struct group *gr;
return gr->gr_gid;
}
-static void
+void
parse_args(int argc, char **argv)
{
int c;
--- /dev/null
+/*
+ * BIRD Internet Routing Daemon -- Helper for main.c
+ *
+ * (c) 1998--2000 Martin Mares <mj@ucw.cz>
+ *
+ * Can be freely distributed and used under the terms of the GNU GPL.
+ */
+
+#ifndef _BIRD_MAIN_HELPER_H_
+#define _BIRD_MAIN_HELPER_H_
+
+/*
+ * Global variables
+ */
+
+extern int debug_flag;
+extern char *config_name;
+extern int run_in_foreground;
+extern char *path_control_socket;
+extern char *opt_list;
+extern sock *cli_sk;
+extern char *pid_file;
+extern int pid_fd;
+extern int parse_and_exit;
+extern char *bird_name;
+extern char *use_user;
+extern char *use_group;
+
+/*
+ * Origin 'static' functions from main.c
+ */
+
+void async_dump(void);
+void drop_gid(gid_t gid);
+void add_num_const(char *name, int val);
+void read_iproute_table(char *file, char *prefix, int max);
+int cf_read(byte *dest, uint len, int fd);
+int unix_read_config(struct config **cp, char *name);
+struct config * read_config(void);
+struct config * cmd_read_config(char *name);
+void cmd_reconfig_msg(int r);
+void cli_write(cli *c);
+void cli_tx(sock *s);
+int cli_rx(sock *s, int size UNUSED);
+void cli_err(sock *s, int err);
+int cli_connect(sock *s, int size UNUSED);
+void cli_init_unix(uid_t use_uid, gid_t use_gid);
+void open_pid_file(void);
+void write_pid_file(void);
+void unlink_pid_file(void);
+void handle_sighup(int sig UNUSED);
+void handle_sigusr(int sig UNUSED);
+void handle_sigterm(int sig UNUSED);
+void signal_init(void);
+void usage(void);
+char * get_bird_name(char *s, char *def);
+uid_t get_uid(const char *s);
+gid_t get_gid(const char *s);
+void parse_args(int argc, char **argv);
+
+#ifdef CONFIG_RESTRICTED_PRIVILEGES
+#include "lib/syspriv.h"
+#else
+void drop_uid(uid_t uid);
+#endif
+
+#endif /* _BIRD_MAIN_HELPER_H_ */