Coverage Report

Created: 2026-06-08 06:07

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/util-linux/include/fileutils.h
Line
Count
Source
1
/*
2
 * No copyright is claimed.  This code is in the public domain; do with
3
 * it what you wish.
4
 **/
5
#ifndef UTIL_LINUX_FILEUTILS
6
#define UTIL_LINUX_FILEUTILS
7
8
#include <stdio.h>
9
#include <fcntl.h>
10
#include <unistd.h>
11
#include <dirent.h>
12
#include <sys/stat.h>
13
14
#include "c.h"
15
16
extern int mkstemp_cloexec(char *template);
17
18
extern int xmkstemp(char **tmpname, const char *dir, const char *prefix);
19
20
static inline FILE *xfmkstemp(char **tmpname, const char *dir, const char *prefix)
21
0
{
22
0
  int fd;
23
0
  FILE *ret;
24
0
25
0
  fd = xmkstemp(tmpname, dir, prefix);
26
0
  if (fd == -1)
27
0
    return NULL;
28
0
29
0
  if (!(ret = fdopen(fd, "w+" UL_CLOEXECSTR))) {
30
0
    close(fd);
31
0
    return NULL;
32
0
  }
33
0
  return ret;
34
0
}
Unexecuted instantiation: probe.c:xfmkstemp
Unexecuted instantiation: blkdev.c:xfmkstemp
Unexecuted instantiation: fileutils.c:xfmkstemp
Unexecuted instantiation: path.c:xfmkstemp
Unexecuted instantiation: sysfs.c:xfmkstemp
Unexecuted instantiation: devname.c:xfmkstemp
Unexecuted instantiation: save.c:xfmkstemp
Unexecuted instantiation: canonicalize.c:xfmkstemp
Unexecuted instantiation: loopdev.c:xfmkstemp
35
36
#ifdef HAVE_OPENAT
37
static inline FILE *fopen_at(int dir, const char *filename,
38
                             int flags, const char *mode)
39
0
{
40
0
  int fd = openat(dir, filename, flags);
41
0
  FILE *ret;
42
0
43
0
  if (fd < 0)
44
0
    return NULL;
45
0
46
0
  ret = fdopen(fd, mode);
47
0
  if (!ret)
48
0
    close(fd);
49
0
  return ret;
50
0
}
Unexecuted instantiation: probe.c:fopen_at
Unexecuted instantiation: blkdev.c:fopen_at
Unexecuted instantiation: fileutils.c:fopen_at
Unexecuted instantiation: path.c:fopen_at
Unexecuted instantiation: sysfs.c:fopen_at
Unexecuted instantiation: devname.c:fopen_at
Unexecuted instantiation: save.c:fopen_at
Unexecuted instantiation: canonicalize.c:fopen_at
Unexecuted instantiation: loopdev.c:fopen_at
51
52
extern FILE *fopen_at_no_link(int dir, const char *filename,
53
                             int flags, mode_t perm, const char *mode);
54
#endif /* HAVE_OPENAT */
55
56
static inline int is_same_inode(const int fd, const struct stat *st)
57
0
{
58
0
  struct stat f;
59
60
0
  if (fstat(fd, &f) < 0)
61
0
    return 0;
62
0
  else if (f.st_dev != st->st_dev || f.st_ino != st->st_ino)
63
0
    return 0;
64
0
  return 1;
65
0
}
Unexecuted instantiation: probe.c:is_same_inode
Unexecuted instantiation: blkdev.c:is_same_inode
Unexecuted instantiation: fileutils.c:is_same_inode
Unexecuted instantiation: path.c:is_same_inode
Unexecuted instantiation: sysfs.c:is_same_inode
Unexecuted instantiation: devname.c:is_same_inode
Unexecuted instantiation: save.c:is_same_inode
Unexecuted instantiation: canonicalize.c:is_same_inode
Unexecuted instantiation: loopdev.c:is_same_inode
66
67
extern int ul_open_no_symlinks(const char *path, int flags, mode_t mode);
68
69
extern int dup_fd_cloexec(int oldfd, int lowfd);
70
extern unsigned int get_fd_tabsize(void);
71
72
extern int ul_mkdir_p(const char *path, mode_t mode);
73
extern char *stripoff_last_component(char *path);
74
75
/* This is readdir()-like function, but skips "." and ".." directory entries */
76
static inline struct dirent *xreaddir(DIR *dp)
77
0
{
78
0
  struct dirent *d;
79
80
0
  while ((d = readdir(dp))) {
81
0
    if (!strcmp(d->d_name, ".") ||
82
0
        !strcmp(d->d_name, ".."))
83
0
      continue;
84
0
    break;
85
0
  }
86
0
  return d;
87
0
}
Unexecuted instantiation: probe.c:xreaddir
Unexecuted instantiation: blkdev.c:xreaddir
Unexecuted instantiation: fileutils.c:xreaddir
Unexecuted instantiation: path.c:xreaddir
Unexecuted instantiation: sysfs.c:xreaddir
Unexecuted instantiation: devname.c:xreaddir
Unexecuted instantiation: save.c:xreaddir
Unexecuted instantiation: canonicalize.c:xreaddir
Unexecuted instantiation: loopdev.c:xreaddir
88
89
90
#ifdef HAVE_SYS_SYSCALL_H
91
# include <sys/syscall.h>
92
93
# if !defined(HAVE_CLOSE_RANGE) && defined(SYS_close_range)
94
#  include <sys/types.h>
95
static inline int close_range(unsigned int first, unsigned int last, int flags)
96
{
97
  return syscall(SYS_close_range, first, last, flags);
98
}
99
#  define HAVE_CLOSE_RANGE 1
100
# endif /* SYS_close_range */
101
102
# if !defined(HAVE_STATX) && defined(HAVE_STRUCT_STATX) && defined(SYS_statx)
103
static inline int statx(int fd, const char *restrict path, int flags,
104
      unsigned int mask, struct statx *stx)
105
{
106
  return syscall(SYS_statx, fd, path, flags, mask, stx);
107
}
108
#  define HAVE_STATX 1
109
# endif /* SYS_statx */
110
111
# if !defined(HAVE_COPY_FILE_RANGE) && defined(SYS_copy_file_range)
112
static inline ssize_t copy_file_range(int fd_in, off_t *off_in,
113
      int fd_out, off_t *off_out, size_t size, unsigned int flags)
114
{
115
  return syscall(SYS_copy_file_range, fd_in, off_in, fd_out,
116
    off_out, size, flags);
117
}
118
#  define HAVE_COPY_FILE_RANGE 1
119
# endif /* SYS_copy_file_range */
120
121
#endif  /* HAVE_SYS_SYSCALL_H */
122
123
124
extern void ul_close_all_fds(unsigned int first, unsigned int last);
125
126
0
#define UL_COPY_READ_ERROR (-1)
127
0
#define UL_COPY_WRITE_ERROR (-2)
128
int ul_copy_file(int from, int to);
129
130
extern int ul_reopen(int fd, int flags);
131
extern char *ul_basename(char *path);
132
133
extern char *ul_restricted_path_oper(const char *path,
134
    int (*oper)(const char *path, char **result, void *data),
135
    void *data);
136
137
/* return 1 if @d is "." or ".." */
138
static inline bool is_dotdir_dirent(const struct dirent *d)
139
0
{
140
0
  return (d && d->d_name[0] == '.'
141
0
    && (d->d_name[1] == 0
142
0
      || (d->d_name[1] == '.' && d->d_name[2] == 0)));
143
0
}
Unexecuted instantiation: probe.c:is_dotdir_dirent
Unexecuted instantiation: blkdev.c:is_dotdir_dirent
Unexecuted instantiation: fileutils.c:is_dotdir_dirent
Unexecuted instantiation: path.c:is_dotdir_dirent
Unexecuted instantiation: sysfs.c:is_dotdir_dirent
Unexecuted instantiation: devname.c:is_dotdir_dirent
Unexecuted instantiation: save.c:is_dotdir_dirent
Unexecuted instantiation: canonicalize.c:is_dotdir_dirent
Unexecuted instantiation: loopdev.c:is_dotdir_dirent
144
145
#endif /* UTIL_LINUX_FILEUTILS */