{
char *msg;
int ret;
+ va_list ap;
- PARA_VSPRINTF(fmt, msg);
- ret = write_buffer(fd, msg);
+ va_start(ap, fmt);
+ ret = xvasprintf(&msg, fmt, ap);
+ ret = write_all(fd, msg, ret);
free(msg);
return ret;
}
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)