Example #1
0
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;
}
Example #2
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;
}