void swAio_handler_read_file(swAio_event *event) { int ret = -1; int fd = open(event->req, O_RDONLY); if (fd < 0) { swSysError("open(%s, O_RDONLY) failed.", (char * )event->req); event->ret = ret; event->error = errno; return; } struct stat file_stat; if (fstat(fd, &file_stat) < 0) { swSysError("fstat(%s) failed.", (char * )event->req); _error: close(fd); event->ret = ret; event->error = errno; return; } if ((file_stat.st_mode & S_IFMT) != S_IFREG) { errno = EISDIR; goto _error; } long filesize = file_stat.st_size; if (filesize == 0) { errno = SW_ERROR_FILE_EMPTY; goto _error; } if (flock(fd, LOCK_SH) < 0) { swSysError("flock(%d, LOCK_SH) failed.", event->fd); goto _error; } event->buf = sw_malloc(filesize); if (event->buf == NULL) { goto _error; } int readn = swoole_sync_readfile(fd, event->buf, (int) filesize); if (flock(fd, LOCK_UN) < 0) { swSysError("flock(%d, LOCK_UN) failed.", event->fd); } close(fd); event->ret = readn; event->error = 0; }
void swAio_handler_read_file(swAio_event *event) { int ret = -1; int fd = open(event->req, O_RDONLY); if (fd < 0) { swSysWarn("open(%s, O_RDONLY) failed", (char * )event->req); event->ret = ret; event->error = errno; return; } struct stat file_stat; if (fstat(fd, &file_stat) < 0) { swSysWarn("fstat(%s) failed", (char * )event->req); _error: close(fd); event->ret = ret; event->error = errno; return; } if ((file_stat.st_mode & S_IFMT) != S_IFREG) { errno = EISDIR; goto _error; } /** * lock */ if (event->lock && flock(fd, LOCK_SH) < 0) { swSysWarn("flock(%d, LOCK_SH) failed", event->fd); goto _error; } /** * regular file */ if (file_stat.st_size == 0) { swString *data = swoole_sync_readfile_eof(fd); if (data == NULL) { goto _error; } event->ret = data->length; event->buf = data->str; sw_free(data); } else { event->buf = sw_malloc(file_stat.st_size); if (event->buf == NULL) { goto _error; } size_t readn = swoole_sync_readfile(fd, event->buf, file_stat.st_size); event->ret = readn; } /** * unlock */ if (event->lock && flock(fd, LOCK_UN) < 0) { swSysWarn("flock(%d, LOCK_UN) failed", event->fd); } close(fd); event->error = 0; }