struct dirent *dentry = NULL;
int fd;
int max_fd;
+ int aul_fd = -1;
+ const char *aul_listen_fd;
+
+ aul_listen_fd = getenv("AUL_LISTEN_FD");
+ if (aul_listen_fd)
+ aul_fd = atoi(aul_listen_fd);
dp = opendir("/proc/self/fd");
if (dp == NULL) {
/* fallback */
max_fd = sysconf(_SC_OPEN_MAX);
- for (fd = 3; fd < max_fd; fd++)
- close(fd);
+ for (fd = 3; fd < max_fd; fd++) {
+ if (fd != aul_fd)
+ close(fd);
+ }
return 0;
}
if (fd < 3)
continue;
- if (fd == dirfd(dp))
+ if (fd == dirfd(dp) || fd == aul_fd)
continue;
close(fd);
_I("Mount has been done.");
return 0;
}
+
+static int __create_app_socket(int pid, uid_t uid)
+{
+ int fd;
+ char path[PATH_MAX];
+ struct sockaddr_un addr = {
+ .sun_family = AF_UNIX,
+ };
+
+ fd = socket(AF_UNIX, SOCK_STREAM | SOCK_NONBLOCK, 0);
+ if (fd < 0) {
+ if (errno == EINVAL) {
+ fd = socket(AF_UNIX, SOCK_STREAM, 0);
+ if (fd < 0) {
+ _E("Second chance - socket create errno(%d)",
+ errno);
+ return -1;
+ }
+ } else {
+ _E("Failed to create socket. errno(%d)", errno);
+ return -1;
+ }
+ }
+
+ snprintf(path, sizeof(path), "/run/aul/apps/%u/%d", uid, pid);
+ if (mkdir(path, 0700) != 0) {
+ if (errno == EEXIST) {
+ if (access(path, R_OK) != 0) {
+ _E("Failed to access %s. errno(%d)",
+ path, errno);
+ close(fd);
+ return -1;
+ }
+ } else {
+ _E("Failed to access %s. errno(%d)", path, errno);
+ close(fd);
+ return -1;
+ }
+ }
+
+ snprintf(addr.sun_path, sizeof(addr.sun_path),
+ "/run/aul/apps/%u/%d/.app-sock", uid, pid);
+ unlink(addr.sun_path);
+
+ if (bind(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
+ _E("Failed to bind socket(%d), errno(%d)", fd, errno);
+ close(fd);
+ return -1;
+ }
+
+ _set_sock_option(fd, 0);
+
+ if (listen(fd, 128) < 0) {
+ _E("Failed to listen %d, errno(%d)", fd, errno);
+ close(fd);
+ return -1;
+ }
+
+ return fd;
+}
+
+void _prepare_app_socket(void)
+{
+ int fd;
+ char buf[12];
+
+ fd = __create_app_socket(getpid(), getuid());
+ if (fd < 0)
+ return;
+
+ snprintf(buf, sizeof(buf), "%d", fd);
+ setenv("AUL_LISTEN_FD", buf, 1);
+}