+ RETURN_ERROR_IF_RO_OR_LO;
+ trim_trailing_slashes(fname);
+ return mkdir(fname, mode);
+}
+
+
+/* like mkstemp but forces permissions */
+int do_mkstemp(char *template, mode_t perms)
+{
+ RETURN_ERROR_IF(dry_run, 0);
+ RETURN_ERROR_IF(read_only, EROFS);
+
+#if HAVE_SECURE_MKSTEMP && HAVE_FCHMOD && (!HAVE_OPEN64 || HAVE_MKSTEMP64)
+ {
+ int fd = mkstemp(template);
+ if (fd == -1)
+ return -1;
+ if (fchmod(fd, perms) != 0 && preserve_perms) {
+ int errno_save = errno;
+ close(fd);
+ unlink(template);
+ errno = errno_save;
+ return -1;
+ }
+ return fd;
+ }
+#else
+ if (!mktemp(template))
+ return -1;
+ return do_open(template, O_RDWR|O_EXCL|O_CREAT, perms);
+#endif
+}
+
+int do_stat(const char *fname, STRUCT_STAT *st)
+{
+#if HAVE_OFF64_T
+ return stat64(fname, st);
+#else
+ return stat(fname, st);
+#endif
+}
+
+#if SUPPORT_LINKS
+int do_lstat(const char *fname, STRUCT_STAT *st)
+{
+#if HAVE_OFF64_T
+ return lstat64(fname, st);
+#else
+ return lstat(fname, st);
+#endif
+}
+#endif
+
+int do_fstat(int fd, STRUCT_STAT *st)
+{
+#if HAVE_OFF64_T
+ return fstat64(fd, st);
+#else
+ return fstat(fd, st);
+#endif