OpenCoverage

openat-proc.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/coreutils/src/gnulib/lib/openat-proc.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/* Create /proc/self/fd-related names for subfiles of open directories.-
2-
3 Copyright (C) 2006, 2009-2018 Free Software Foundation, Inc.-
4-
5 This program is free software: you can redistribute it and/or modify-
6 it under the terms of the GNU General Public License as published by-
7 the Free Software Foundation; either version 3 of the License, or-
8 (at your option) any later version.-
9-
10 This program is distributed in the hope that it will be useful,-
11 but WITHOUT ANY WARRANTY; without even the implied warranty of-
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the-
13 GNU General Public License for more details.-
14-
15 You should have received a copy of the GNU General Public License-
16 along with this program. If not, see <https://www.gnu.org/licenses/>. */-
17-
18/* Written by Paul Eggert. */-
19-
20#include <config.h>-
21-
22#include "openat-priv.h"-
23-
24#include <sys/types.h>-
25#include <sys/stat.h>-
26#include <fcntl.h>-
27-
28#include <stdio.h>-
29#include <stdlib.h>-
30#include <string.h>-
31#include <unistd.h>-
32-
33#ifdef __KLIBC__-
34# include <InnoTekLIBC/backend.h>-
35#endif-
36-
37#include "intprops.h"-
38-
39/* Set BUF to the name of the subfile of the directory identified by-
40 FD, where the subfile is named FILE. If successful, return BUF if-
41 the result fits in BUF, dynamically allocated memory otherwise.-
42 Return NULL (setting errno) on error. */-
43char *-
44openat_proc_name (char buf[OPENAT_BUFFER_SIZE], int fd, char const *file)-
45{-
46 char *result = buf;-
47 int dirlen;-
48-
49 /* Make sure the caller gets ENOENT when appropriate. */-
50 if (!*file)
!*fileDescription
TRUEnever evaluated
FALSEnever evaluated
0
51 {-
52 buf[0] = '\0';-
53 return buf;
never executed: return buf;
0
54 }-
55-
56#ifndef __KLIBC__-
57# define PROC_SELF_FD_FORMAT "/proc/self/fd/%d/"-
58 {-
59 enum {-
60 PROC_SELF_FD_DIR_SIZE_BOUND-
61 = (sizeof PROC_SELF_FD_FORMAT - (sizeof "%d" - 1)-
62 + INT_STRLEN_BOUND (int))-
63 };-
64-
65 static int proc_status = 0;-
66 if (! proc_status)
! proc_statusDescription
TRUEnever evaluated
FALSEnever evaluated
0
67 {-
68 /* Set PROC_STATUS to a positive value if /proc/self/fd is-
69 reliable, and a negative value otherwise. Solaris 10-
70 /proc/self/fd mishandles "..", and any file name might expand-
71 to ".." after symbolic link expansion, so avoid /proc/self/fd-
72 if it mishandles "..". Solaris 10 has openat, but this-
73 problem is exhibited on code that built on Solaris 8 and-
74 running on Solaris 10. */-
75-
76 int proc_self_fd = open ("/proc/self/fd",-
77 O_SEARCH | O_DIRECTORY | O_NOCTTY | O_NONBLOCK);-
78 if (proc_self_fd < 0)
proc_self_fd < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
79 proc_status = -1;
never executed: proc_status = -1;
0
80 else-
81 {-
82 /* Detect whether /proc/self/fd/%i/../fd exists, where %i is the-
83 number of a file descriptor open on /proc/self/fd. On Linux,-
84 that name resolves to /proc/self/fd, which was opened above.-
85 However, on Solaris, it may resolve to /proc/self/fd/fd, which-
86 cannot exist, since all names in /proc/self/fd are numeric. */-
87 char dotdot_buf[PROC_SELF_FD_DIR_SIZE_BOUND + sizeof "../fd" - 1];-
88 sprintf (dotdot_buf, PROC_SELF_FD_FORMAT "../fd", proc_self_fd);-
89 proc_status = access (dotdot_buf, F_OK) ? -1 : 1;
access (dotdot_buf, 0 )Description
TRUEnever evaluated
FALSEnever evaluated
0
90 close (proc_self_fd);-
91 }
never executed: end of block
0
92 }-
93-
94 if (proc_status < 0)
proc_status < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
95 return NULL;
never executed: return ((void *)0) ;
0
96 else-
97 {-
98 size_t bufsize = PROC_SELF_FD_DIR_SIZE_BOUND + strlen (file);-
99 if (OPENAT_BUFFER_SIZE < bufsize)
(( 4096 ) < (4...64)) < bufsizeDescription
TRUEnever evaluated
FALSEnever evaluated
( 4096 ) < (4096 - 64)Description
TRUEnever evaluated
FALSEnever evaluated
0
100 {-
101 result = malloc (bufsize);-
102 if (! result)
! resultDescription
TRUEnever evaluated
FALSEnever evaluated
0
103 return NULL;
never executed: return ((void *)0) ;
0
104 }
never executed: end of block
0
105-
106 dirlen = sprintf (result, PROC_SELF_FD_FORMAT, fd);-
107 }
never executed: end of block
0
108 }-
109#else-
110 /* OS/2 kLIBC provides a function to retrieve a path from a fd. */-
111 {-
112 char dir[_MAX_PATH];-
113 size_t bufsize;-
114-
115 if (__libc_Back_ioFHToPath (fd, dir, sizeof dir))-
116 return NULL;-
117-
118 dirlen = strlen (dir);-
119 bufsize = dirlen + 1 + strlen (file) + 1; /* 1 for '/', 1 for null */-
120 if (OPENAT_BUFFER_SIZE < bufsize)-
121 {-
122 result = malloc (bufsize);-
123 if (! result)-
124 return NULL;-
125 }-
126-
127 strcpy (result, dir);-
128 result[dirlen++] = '/';-
129 }-
130#endif-
131-
132 strcpy (result + dirlen, file);-
133 return result;
never executed: return result;
0
134}-
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.1.2