/*
- * Copyright (C) 2006-2010 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2006-2012 Andre Noll <maan@systemlinux.org>
*
* Licensed under the GPL v2. For licencing details see COPYING.
*/
* \param fd The file descriptor.
* \param buf the buffer to write.
* \param len the number of bytes of \a buf.
- * \param max_bytes_per_write Do not write more than that many bytes at once.
- *
- * If \a max_bytes_per_write is non-zero, do not send more than that many bytes
- * per write().
*
* EAGAIN is not considered an error condition. For example CCID3 has a
* sending wait queue which fills up and is emptied asynchronously. The EAGAIN
*
* \return Negative on errors, number of bytes written else.
*/
-int write_nonblock(int fd, const char *buf, size_t len,
- size_t max_bytes_per_write)
+int write_nonblock(int fd, const char *buf, size_t len)
{
size_t written = 0;
int ret = 0;
while (written < len) {
size_t num = len - written;
- if (max_bytes_per_write && max_bytes_per_write < num)
- num = max_bytes_per_write;
ret = write(fd, buf + written, num);
if (ret < 0 && errno == EAGAIN)
return written;
* In any case, \a num_bytes contains the number of bytes that have been
* successfully read from \a fd (zero if the first readv() call failed with
* EAGAIN). Note that even if the function returns negative, some data might
- * have been read before the error occured. In this case \a num_bytes is
+ * have been read before the error occurred. In this case \a num_bytes is
* positive.
*
* \sa \ref write_nonblock(), read(2), readv(2).
* \sa getcwd(3).
*
*/
-int para_opendir(const char *dirname, DIR **dir, int *cwd)
+static int para_opendir(const char *dirname, DIR **dir, int *cwd)
{
int ret;
*
* \return Standard.
*/
-int para_fchdir(int fd)
+static int para_fchdir(int fd)
{
if (fchdir(fd) < 0)
return -ERRNO_TO_PARA_ERROR(errno);
goto out;
}
*size = file_status.st_size;
+ /*
+ * If the file is empty, *size is zero and mmap() would return EINVAL
+ * (Invalid argument). This error is common enough to spend an extra
+ * error code which explicitly states the problem.
+ */
+ ret = -E_EMPTY;
+ if (*size == 0)
+ goto out;
+ /*
+ * If fd refers to a directory, mmap() returns ENODEV (No such device),
+ * at least on Linux. "Is a directory" seems to be more to the point.
+ */
+ ret = -ERRNO_TO_PARA_ERROR(EISDIR);
+ if (S_ISDIR(file_status.st_mode))
+ goto out;
+
ret = para_mmap(*size, mmap_prot, mmap_flags, fd, 0, map);
out:
if (ret < 0 || !fd_ptr)
int para_munmap(void *start, size_t length)
{
int err;
+
+ if (!start)
+ return 0;
if (munmap(start, length) >= 0)
return 1;
err = errno;