#define HOSTAPD_ENTROPY_FILE tzplatform_mkpath(TZ_SYS_VAR, "/lib/misc/hostapd.bin")
#define HOSTAPD_MESH_CONF_FILE tzplatform_mkpath(TZ_SYS_VAR, "/lib/mesh/mesh_hostapd.conf")
#define HOSTAPD_CTRL_INTF_DIR tzplatform_mkpath(TZ_SYS_RUN, "/hostapd")
+#define HOSTAPD_PID_FILE tzplatform_mkpath(TZ_SYS_RUN, "/.mesh_hostapd.pid")
#define HOSTAPD_ALLOWED_LIST tzplatform_mkpath(TZ_SYS_VAR, "/lib/hostapd/hostapd.accept")
#define HOSTAPD_BLOCKED_LIST tzplatform_mkpath(TZ_SYS_VAR, "/lib/hostapd/hostapd.deny")
#define HOSTAPD_RETRY_MAX 5
#define PSK_ITERATION_COUNT 4096
#define MAX_BUF_SIZE (256u)
-static pid_t hostapd_pid = 0;
static int hostapd_ctrl_fd = 0;
static int __get_psk_hexascii(const char *pass, const unsigned char *salt,
return MESHD_ERROR_NONE;
}
+static int __get_pid_of_hostapd(pid_t *pid)
+{
+ FILE *fd = NULL;
+ int ret = -1;
+ int rv = 0;
+ char error_buf[256] = {0, };
+ char file_path[256] = {0, };
+
+ snprintf(file_path, 256, "%s", HOSTAPD_PID_FILE);
+
+ if (0 == access(file_path, F_OK)) {
+ fd = fopen(file_path, "r");
+ if (fd == NULL) {
+ MESH_LOGE("Error! Could not open pid file");
+ return MESHD_ERROR_IO_ERROR;
+ }
+ } else {
+ MESH_LOGE("Error! Could not access pid file");
+ return MESHD_ERROR_IO_ERROR;
+ }
+
+ errno = 0;
+ rv = fscanf(fd, "%d", &ret);
+ if (rv < 0) {
+ strerror_r(errno, error_buf, 256);
+ MESH_LOGE("Error! Failed to read from file, rv:[%d], error:[%s]",
+ rv, error_buf);
+ fclose(fd);
+ return MESHD_ERROR_IO_ERROR;
+ }
+
+ *pid = (pid_t)ret;
+ MESH_LOGD(" PID: [%d]", ret);
+
+ fclose(fd);
+ return MESHD_ERROR_NONE;
+}
+
static int __terminate_hostapd()
{
int ret;
+ pid_t hostapd_pid = 0;
+
+ /* Get pid */
+ ret = __get_pid_of_hostapd(&hostapd_pid);
+ if (MESHD_ERROR_NONE != ret) {
+ MESH_LOGE("There is no hostapd");
+ return MESHD_ERROR_NONE;
+ }
if (hostapd_pid == 0) {
MESH_LOGE("There is no hostapd");
MESH_LOGE("__close_hostapd_intf is failed");
kill(hostapd_pid, SIGTERM);
- waitpid(hostapd_pid, NULL, 0);
- hostapd_pid = 0;
return MESHD_ERROR_NONE;
}
static int __execute_hostapd()
{
- pid_t pid;
+ pid_t pid = 0;
+ int status;
+ int ret = MESHD_ERROR_NONE;
- if (hostapd_pid) {
+ ret = __get_pid_of_hostapd(&pid);
+ if (0 != pid) {
MESH_LOGE("hostapd is running already");
- return MESHD_ERROR_OPERATION_FAILED;
+ return MESHD_ERROR_NONE;
}
pid = fork();
if (pid == 0) {
if (execl(HOSTAPD_BIN, HOSTAPD_BIN, "-e", HOSTAPD_ENTROPY_FILE,
HOSTAPD_MESH_CONF_FILE,
- "-f", HOSTAPD_DEBUG_FILE, "-ddd",
+ "-f", HOSTAPD_DEBUG_FILE,
+ "-P", HOSTAPD_PID_FILE,
+ "-ddd", "-B",
(char *)NULL)) {
MESH_LOGE("execl failed");
}
MESH_LOGE("Should not get here!");
exit(1);
+ } else {
+ /* Reap child */
+ waitpid(pid, &status, 0);
+ MESH_LOGD(" child [%d] reaped with status(%d)", pid, status);
}
- hostapd_pid = pid;
-
return MESHD_ERROR_NONE;
}