static gboolean open_continue(gpointer user_data) { struct serial_port *port = user_data; int fd; static int ntries = MAX_OPEN_TRIES; if (!port->listener_id) return FALSE; /* Owner exited */ fd = open(port->dev, O_RDONLY | O_NOCTTY); if (fd < 0) { int err = errno; error("Could not open %s: %s (%d)", port->dev, strerror(err), err); if (!--ntries) { /* Reporting error */ open_notify(fd, err, port); ntries = MAX_OPEN_TRIES; return FALSE; } return TRUE; } /* Connection succeeded */ open_notify(fd, 0, port); return FALSE; }
static void rfcomm_connect_cb(GIOChannel *chan, GError *conn_err, gpointer user_data) { struct serial_port *port = user_data; struct serial_device *device = port->device; struct rfcomm_dev_req req; int sk, fd; DBusMessage *reply; /* Owner exited? */ if (!port->listener_id) return; if (conn_err) { error("%s", conn_err->message); reply = failed(port->msg, conn_err->message); goto fail; } memset(&req, 0, sizeof(req)); req.dev_id = -1; req.flags = (1 << RFCOMM_REUSE_DLC); bacpy(&req.src, &device->src); bacpy(&req.dst, &device->dst); req.channel = port->channel; g_io_channel_unref(port->io); port->io = NULL; sk = g_io_channel_unix_get_fd(chan); port->id = ioctl(sk, RFCOMMCREATEDEV, &req); if (port->id < 0) { int err = errno; error("ioctl(RFCOMMCREATEDEV): %s (%d)", strerror(err), err); reply = failed(port->msg, strerror(err)); g_io_channel_shutdown(chan, TRUE, NULL); goto fail; } port->dev = g_strdup_printf("/dev/rfcomm%d", port->id); debug("Serial port %s created", port->dev); g_io_channel_shutdown(chan, TRUE, NULL); /* Addressing connect port */ fd = port_open(port); if (fd < 0) /* Open in progress: Wait the callback */ return; open_notify(fd, 0, port); return; fail: g_dbus_send_message(device->conn, reply); g_dbus_remove_watch(device->conn, port->listener_id); port->listener_id = 0; }
int fstatat(int dirfd, const char *pathname, struct stat *buf, int flags) { int rc; dir_mutex_lock(dirfd); if(flags & AT_SYMLINK_NOFOLLOW) { #ifdef _WIN32 open_notify(ACCESS_READ, pathname); #endif rc = lstat(pathname, buf); } else { #ifdef _WIN32 open_notify(ACCESS_READ, pathname); #endif rc = stat(pathname, buf); } dir_mutex_unlock(); return rc; }
int __wrap_open(const char *pathname, int flags, ...) { mode_t mode = 0; enum access_type at = ACCESS_READ; HANDLE h; SECURITY_ATTRIBUTES sec; DWORD desiredAccess; DWORD creationDisposition; if(flags & O_WRONLY || flags & O_RDWR) at = ACCESS_WRITE; if(open_notify(at, pathname) < 0) return -1; if(flags & O_CREAT) { va_list ap; va_start(ap, flags); mode = va_arg(ap, int); va_end(ap); } else {
int proc_loop(void) { int rc = 0; log_debug("setting working directory ...\n"); if ((mkdir(daemon_cfg.notify_dir, 0777) != 0) && (errno != EEXIST)) { rc = -errno; log_error("failed create folder %s (errno = %d)\n", daemon_cfg.notify_dir, errno); goto err; } log_debug("setting store ...\n"); rc = open_store(); if (rc < 0) { goto err; } log_debug("setting flow ...\n"); rc = open_flow(); if (rc < 0) { goto err; } log_debug("setting notification ...\n"); rc = open_notify(); if (rc < 0) { goto err; } log_debug("setting message processing ...\n"); rc = open_message(); if (rc < 0) { goto err; } log_debug("starting loop ...\n"); while ((0 == daemon_cfg.sig) && (errno != EINTR)) { fd_set readfds; struct timeval tv; int max_fd = -1; FD_ZERO(&readfds); FD_SET(daemon_cfg.sock_fd, &readfds); max_fd = daemon_cfg.sock_fd; FD_SET(daemon_cfg.notify_fd, &readfds); max_fd = (max_fd < daemon_cfg.notify_fd ? daemon_cfg.notify_fd : max_fd); /* Use timeout for select() call */ tv.tv_sec = 60; tv.tv_usec = 0; rc = select(max_fd + 1, &readfds, NULL, NULL, &tv); if (rc < 0) { rc = 0; if (errno != EINTR) { rc = -errno; log_error("Failed select() errno %d (%s)\n", errno, strerror(errno)); } goto err; } else if (rc == 0) { continue; } /* Check messages from processes */ if (FD_ISSET(daemon_cfg.sock_fd, &readfds)) { log_debug("message processing ...\n"); rc = proc_message(); } /* Check any events from file system monitor */ if (FD_ISSET(daemon_cfg.notify_fd, &readfds)) { log_debug("notification processing ...\n"); rc = proc_notify(); } } err: log_debug("finishing loop ...\n"); close_message(); close_notify(); close_flow(); close_store(); return rc; }