mirror of
https://github.com/emanuele-f/PCAPdroid.git
synced 2026-06-16 21:10:57 +08:00
Improve pcapd error reporting
This makes it possible to get pcapd errors which occur before the logfile is open.
This commit is contained in:
parent
997113b0ee
commit
241a39ae91
@ -19,6 +19,8 @@
|
|||||||
|
|
||||||
#include <sys/un.h>
|
#include <sys/un.h>
|
||||||
#include <linux/limits.h>
|
#include <linux/limits.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
|
#include <paths.h>
|
||||||
#include "vpnproxy.h"
|
#include "vpnproxy.h"
|
||||||
#include "pcapd/pcapd.h"
|
#include "pcapd/pcapd.h"
|
||||||
#include "common/utils.h"
|
#include "common/utils.h"
|
||||||
@ -41,19 +43,76 @@ typedef struct {
|
|||||||
/* ******************************************************* */
|
/* ******************************************************* */
|
||||||
|
|
||||||
static int su_cmd(const char *prog, const char *args) {
|
static int su_cmd(const char *prog, const char *args) {
|
||||||
FILE *fp;
|
int in_p[2], out_p[2];
|
||||||
|
int rv = -1;
|
||||||
|
pid_t pid;
|
||||||
|
|
||||||
if((fp = popen("su", "w")) == NULL) {
|
if((pipe(in_p) != 0) || (pipe(out_p) != 0)) {
|
||||||
log_e("popen(\"su\") failed[%d]: %s", errno, strerror(errno));
|
log_f("pipe failed[%d]: %s", errno, strerror(errno));
|
||||||
pclose(fp);
|
return -1;
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
log_d("su_cmd: %s %s", prog, args);
|
if((pid = fork()) == 0) {
|
||||||
fprintf(fp, "%s", prog);
|
// child
|
||||||
fprintf(fp, " %s\n", args);
|
char *argp[] = {"sh", "-c", "su", NULL};
|
||||||
|
|
||||||
return pclose(fp);
|
close(in_p[1]);
|
||||||
|
close(out_p[0]);
|
||||||
|
|
||||||
|
dup2(in_p[0], STDIN_FILENO);
|
||||||
|
dup2(out_p[1], STDOUT_FILENO);
|
||||||
|
dup2(out_p[1], STDERR_FILENO);
|
||||||
|
|
||||||
|
execve(_PATH_BSHELL, argp, environ);
|
||||||
|
fprintf(stderr, "execve failed[%d]: %s", errno, strerror(errno));
|
||||||
|
exit(1);
|
||||||
|
} else if(pid > 0) {
|
||||||
|
// parent
|
||||||
|
int out = out_p[0];
|
||||||
|
close(in_p[0]);
|
||||||
|
close(out_p[1]);
|
||||||
|
|
||||||
|
// write "su" command input
|
||||||
|
log_d("su_cmd: %s %s", prog, args);
|
||||||
|
write(in_p[1], prog, strlen(prog));
|
||||||
|
write(in_p[1], " ", 1);
|
||||||
|
write(in_p[1], args, strlen(args));
|
||||||
|
write(in_p[1], "\n", 1);
|
||||||
|
close(in_p[1]);
|
||||||
|
|
||||||
|
waitpid(pid, &rv, 0);
|
||||||
|
|
||||||
|
if(rv != 0) {
|
||||||
|
char buf[128];
|
||||||
|
struct timeval timeout = {0};
|
||||||
|
fd_set fds;
|
||||||
|
|
||||||
|
buf[0] = '\0';
|
||||||
|
FD_ZERO(&fds);
|
||||||
|
FD_SET(out, &fds);
|
||||||
|
|
||||||
|
select(out + 1, &fds, NULL, NULL, &timeout);
|
||||||
|
if (FD_ISSET(out, &fds)) {
|
||||||
|
int num = read(out, buf, sizeof(buf) - 1);
|
||||||
|
if (num > 0)
|
||||||
|
buf[num] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
log_f("su \"%s\" invocation failed: %s", prog, buf);
|
||||||
|
rv = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
close(out_p[0]);
|
||||||
|
} else {
|
||||||
|
log_f("fork() failed[%d]: %s", errno, strerror(errno));
|
||||||
|
close(in_p[0]);
|
||||||
|
close(in_p[1]);
|
||||||
|
close(out_p[0]);
|
||||||
|
close(out_p[1]);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ******************************************************* */
|
/* ******************************************************* */
|
||||||
@ -160,7 +219,8 @@ static int connectPcapd(vpnproxy_data_t *proxy) {
|
|||||||
// Start the daemon
|
// Start the daemon
|
||||||
char args[256];
|
char args[256];
|
||||||
snprintf(args, sizeof(args), "-l pcapd.log -i %s -d -u %d -b \"%s\"", capture_interface, proxy->app_filter, bpf);
|
snprintf(args, sizeof(args), "-l pcapd.log -i %s -d -u %d -b \"%s\"", capture_interface, proxy->app_filter, bpf);
|
||||||
su_cmd(pcapd, args);
|
if(su_cmd(pcapd, args) != 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
// Wait for pcapd to start
|
// Wait for pcapd to start
|
||||||
struct timeval timeout = {.tv_sec = 1, .tv_usec = 0};
|
struct timeval timeout = {.tv_sec = 1, .tv_usec = 0};
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user