Coverage Report

Created: 2026-09-03 07:13

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: script.c:xfmkstemp
Unexecuted instantiation: blkdev.c:xfmkstemp
Unexecuted instantiation: path.c:xfmkstemp
Unexecuted instantiation: sysfs.c:xfmkstemp
Unexecuted instantiation: canonicalize.c:xfmkstemp
Unexecuted instantiation: fileutils.c:xfmkstemp
Unexecuted instantiation: probe.c:xfmkstemp
Unexecuted instantiation: devname.c:xfmkstemp
Unexecuted instantiation: save.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: script.c:fopen_at
Unexecuted instantiation: blkdev.c:fopen_at
Unexecuted instantiation: path.c:fopen_at
Unexecuted instantiation: sysfs.c:fopen_at
Unexecuted instantiation: canonicalize.c:fopen_at
Unexecuted instantiation: fileutils.c:fopen_at
Unexecuted instantiation: probe.c:fopen_at
Unexecuted instantiation: devname.c:fopen_at
Unexecuted instantiation: save.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: script.c:is_same_inode
Unexecuted instantiation: blkdev.c:is_same_inode
Unexecuted instantiation: path.c:is_same_inode
Unexecuted instantiation: sysfs.c:is_same_inode
Unexecuted instantiation: canonicalize.c:is_same_inode
Unexecuted instantiation: fileutils.c:is_same_inode
Unexecuted instantiation: probe.c:is_same_inode
Unexecuted instantiation: devname.c:is_same_inode
Unexecuted instantiation: save.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
extern int ul_openat_resolve(int dirfd, const char *path, int flags,
69
           mode_t mode, unsigned long long resolve);
70
71
#ifndef RESOLVE_NO_SYMLINKS
72
0
# define RESOLVE_NO_SYMLINKS  0x02
73
#endif
74
#ifndef RESOLVE_BENEATH
75
# define RESOLVE_BENEATH  0x08
76
#endif
77
78
extern int dup_fd_cloexec(int oldfd, int lowfd);
79
extern unsigned int get_fd_tabsize(void);
80
81
extern int ul_mkdir_p(const char *path, mode_t mode);
82
extern char *stripoff_last_component(char *path);
83
84
/* This is readdir()-like function, but skips "." and ".." directory entries */
85
static inline struct dirent *xreaddir(DIR *dp)
86
0
{
87
0
  struct dirent *d;
88
89
0
  while ((d = readdir(dp))) {
90
0
    if (!strcmp(d->d_name, ".") ||
91
0
        !strcmp(d->d_name, ".."))
92
0
      continue;
93
0
    break;
94
0
  }
95
0
  return d;
96
0
}
Unexecuted instantiation: script.c:xreaddir
Unexecuted instantiation: blkdev.c:xreaddir
Unexecuted instantiation: path.c:xreaddir
Unexecuted instantiation: sysfs.c:xreaddir
Unexecuted instantiation: canonicalize.c:xreaddir
Unexecuted instantiation: fileutils.c:xreaddir
Unexecuted instantiation: probe.c:xreaddir
Unexecuted instantiation: devname.c:xreaddir
Unexecuted instantiation: save.c:xreaddir
Unexecuted instantiation: loopdev.c:xreaddir
97
98
99
#ifdef HAVE_SYS_SYSCALL_H
100
# include <sys/syscall.h>
101
102
# if !defined(HAVE_CLOSE_RANGE) && defined(SYS_close_range)
103
#  include <sys/types.h>
104
static inline int close_range(unsigned int first, unsigned int last, int flags)
105
{
106
  return syscall(SYS_close_range, first, last, flags);
107
}
108
#  define HAVE_CLOSE_RANGE 1
109
# endif /* SYS_close_range */
110
111
# if !defined(HAVE_STATX) && defined(HAVE_STRUCT_STATX) && defined(SYS_statx)
112
static inline int statx(int fd, const char *restrict path, int flags,
113
      unsigned int mask, struct statx *stx)
114
{
115
  return syscall(SYS_statx, fd, path, flags, mask, stx);
116
}
117
#  define HAVE_STATX 1
118
# endif /* SYS_statx */
119
120
# if !defined(HAVE_COPY_FILE_RANGE) && defined(SYS_copy_file_range)
121
static inline ssize_t copy_file_range(int fd_in, off_t *off_in,
122
      int fd_out, off_t *off_out, size_t size, unsigned int flags)
123
{
124
  return syscall(SYS_copy_file_range, fd_in, off_in, fd_out,
125
    off_out, size, flags);
126
}
127
#  define HAVE_COPY_FILE_RANGE 1
128
# endif /* SYS_copy_file_range */
129
130
#endif  /* HAVE_SYS_SYSCALL_H */
131
132
133
extern void ul_close_all_fds(unsigned int first, unsigned int last);
134
135
0
#define UL_COPY_READ_ERROR (-1)
136
0
#define UL_COPY_WRITE_ERROR (-2)
137
int ul_copy_file(int from, int to);
138
139
extern int ul_reopen(int fd, int flags);
140
extern char *ul_basename(char *path);
141
142
extern char *ul_restricted_path_oper(const char *path,
143
    int (*oper)(const char *path, char **result, void *data),
144
    void *data);
145
146
/* return 1 if @d is "." or ".." */
147
static inline bool is_dotdir_dirent(const struct dirent *d)
148
0
{
149
0
  return (d && d->d_name[0] == '.'
150
0
    && (d->d_name[1] == 0
151
0
      || (d->d_name[1] == '.' && d->d_name[2] == 0)));
152
0
}
Unexecuted instantiation: script.c:is_dotdir_dirent
Unexecuted instantiation: blkdev.c:is_dotdir_dirent
Unexecuted instantiation: path.c:is_dotdir_dirent
Unexecuted instantiation: sysfs.c:is_dotdir_dirent
Unexecuted instantiation: canonicalize.c:is_dotdir_dirent
Unexecuted instantiation: fileutils.c:is_dotdir_dirent
Unexecuted instantiation: probe.c:is_dotdir_dirent
Unexecuted instantiation: devname.c:is_dotdir_dirent
Unexecuted instantiation: save.c:is_dotdir_dirent
Unexecuted instantiation: loopdev.c:is_dotdir_dirent
153
154
#endif /* UTIL_LINUX_FILEUTILS */