74
74
#include <unistd.h> /* close(), SEEK_SET, off_t, write(),
75
75
getuid(), getgid(), seteuid(),
76
setgid(), pause(), _exit() */
77
77
#include <arpa/inet.h> /* inet_pton(), htons, inet_ntop() */
78
78
#include <iso646.h> /* not, or, and */
79
79
#include <argp.h> /* struct argp_option, error_t, struct
87
87
EX_NOHOST, EX_IOERR, EX_PROTOCOL */
88
88
#include <sys/wait.h> /* waitpid(), WIFEXITED(),
89
89
WEXITSTATUS(), WTERMSIG() */
90
#include <grp.h> /* setgroups() */
93
92
#include <sys/klog.h> /* klogctl() */
204
203
/* Add server to set of servers to retry periodically */
205
bool add_server(const char *ip, uint16_t port, AvahiIfIndex if_index,
204
int add_server(const char *ip, uint16_t port, AvahiIfIndex if_index,
208
207
server *new_server = malloc(sizeof(server));
209
208
if(new_server == NULL){
210
209
perror_plus("malloc");
213
212
*new_server = (server){ .ip = strdup(ip),
1031
1030
avahi_simple_poll_quit(mc.simple_poll);
1033
if(not add_server(ip, port, interface,
1034
avahi_proto_to_af(proto))){
1035
fprintf_plus(stderr, "Failed to add server \"%s\" to server"
1032
ret = add_server(ip, port, interface,
1033
avahi_proto_to_af(proto));
1410
1402
pid_t hook_pid = fork();
1411
1403
if(hook_pid == 0){
1413
/* Raise privileges */
1417
perror_plus("seteuid");
1419
/* Raise privileges even more */
1423
perror_plus("setuid");
1429
perror_plus("setgid");
1431
/* Reset supplementary groups */
1433
ret = setgroups(0, NULL);
1435
perror_plus("setgroups");
1437
1405
dup2(devnull, STDIN_FILENO);
1438
1406
close(devnull);
1439
1407
dup2(STDERR_FILENO, STDOUT_FILENO);
1440
1408
ret = setenv("MANDOSNETHOOKDIR", hookdir, 1);
1442
1410
perror_plus("setenv");
1445
1413
ret = setenv("DEVICE", interface, 1);
1447
1415
perror_plus("setenv");
1450
1418
ret = setenv("VERBOSE", debug ? "1" : "0", 1);
1452
1420
perror_plus("setenv");
1455
1423
ret = setenv("MODE", mode, 1);
1457
1425
perror_plus("setenv");
1460
1428
char *delaystring;
1461
1429
ret = asprintf(&delaystring, "%f", delay);
1463
1431
perror_plus("asprintf");
1466
1434
ret = setenv("DELAY", delaystring, 1);
1468
1436
free(delaystring);
1469
1437
perror_plus("setenv");
1472
1440
free(delaystring);
1473
1441
ret = execl(fullname, direntry->d_name, mode, NULL);
1674
1641
argp_state_help(state, state->out_stream,
1675
1642
ARGP_HELP_USAGE | ARGP_HELP_EXIT_ERR);
1676
1643
case 'V': /* --version */
1644
fprintf_plus(state->out_stream,
1645
"Mandos plugin mandos-client: ");
1677
1646
fprintf_plus(state->out_stream, "%s\n", argp_program_version);
1678
1647
exit(argp_err_exit_status);
1708
1677
/* Work around Debian bug #633582:
1709
1678
<http://bugs.debian.org/633582> */
1711
1681
/* Re-raise priviliges */
1713
1683
ret = seteuid(0);
1715
1685
perror_plus("seteuid");
1719
if(strcmp(seckey, PATHDIR "/" SECKEY) == 0){
1720
int seckey_fd = open(seckey, O_RDONLY);
1721
if(seckey_fd == -1){
1722
perror_plus("open");
1724
ret = (int)TEMP_FAILURE_RETRY(fstat(seckey_fd, &st));
1726
perror_plus("fstat");
1728
if(S_ISREG(st.st_mode)
1729
and st.st_uid == 0 and st.st_gid == 0){
1730
ret = fchown(seckey_fd, uid, gid);
1732
perror_plus("fchown");
1736
TEMP_FAILURE_RETRY(close(seckey_fd));
1740
if(strcmp(pubkey, PATHDIR "/" PUBKEY) == 0){
1741
int pubkey_fd = open(pubkey, O_RDONLY);
1742
if(pubkey_fd == -1){
1743
perror_plus("open");
1745
ret = (int)TEMP_FAILURE_RETRY(fstat(pubkey_fd, &st));
1747
perror_plus("fstat");
1749
if(S_ISREG(st.st_mode)
1750
and st.st_uid == 0 and st.st_gid == 0){
1751
ret = fchown(pubkey_fd, uid, gid);
1753
perror_plus("fchown");
1757
TEMP_FAILURE_RETRY(close(pubkey_fd));
1688
if(strcmp(seckey, PATHDIR "/" SECKEY) == 0){
1689
int seckey_fd = open(seckey, O_RDONLY);
1690
if(seckey_fd == -1){
1691
perror_plus("open");
1693
ret = (int)TEMP_FAILURE_RETRY(fstat(seckey_fd, &st));
1695
perror_plus("fstat");
1697
if(S_ISREG(st.st_mode)
1698
and st.st_uid == 0 and st.st_gid == 0){
1699
ret = fchown(seckey_fd, uid, gid);
1701
perror_plus("fchown");
1705
TEMP_FAILURE_RETRY(close(seckey_fd));
1709
if(strcmp(pubkey, PATHDIR "/" PUBKEY) == 0){
1710
int pubkey_fd = open(pubkey, O_RDONLY);
1711
if(pubkey_fd == -1){
1712
perror_plus("open");
1714
ret = (int)TEMP_FAILURE_RETRY(fstat(pubkey_fd, &st));
1716
perror_plus("fstat");
1718
if(S_ISREG(st.st_mode)
1719
and st.st_uid == 0 and st.st_gid == 0){
1720
ret = fchown(pubkey_fd, uid, gid);
1722
perror_plus("fchown");
1726
TEMP_FAILURE_RETRY(close(pubkey_fd));
1730
/* Lower privileges */
1734
perror_plus("seteuid");
1738
/* Run network hooks */
1741
/* Re-raise priviliges */
1745
perror_plus("seteuid");
1748
if(not run_network_hooks("start", interface, delay)){
1761
1752
/* Lower privileges */
1763
1754
ret = seteuid(uid);
2229
/* Run network hooks */
2230
run_network_hooks("stop", interface, delay);
2232
2215
/* Re-raise priviliges */
2237
perror_plus("seteuid");
2221
perror_plus("seteuid");
2224
/* Run network hooks */
2225
if(not run_network_hooks("stop", interface, delay)){
2240
2229
/* Take down the network interface */