-
Notifications
You must be signed in to change notification settings - Fork 0
/
c_abspath.c
163 lines (125 loc) · 4 KB
/
c_abspath.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
////////////////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include "i_utils.h"
//
void c_realpath_ (
const char *fname, char *path, size_t *len_path, size_t *lentrim_path )
{
char buff [ MAXLEN_PATHNAME ] = "" ;
size_t lm = *len_path ;
size_t lt = 0 ;
char *ptr = realpath ( fname, &buff[0] ) ;
errno = 0 ;
if ( ptr == NULL )
{
lt = 0 ;
}
else
{
lt = strlen( buff ) ;
if ( lt > lm )
{
errno = ERANGE ;
printf (
"WARNNG: c_realpath_ requires a larger PATH. "
"len realpath = %ld > len PATH =%ld \n",
lt, lm
) ;
lt = lm ;
strncpy ( path, buff, lt ) ;
}
else
{
strncpy ( path, buff, lm ) ;
}
}
*lentrim_path = lt ;
}
//
void c_abspath_ (
const char *fname, char *path, size_t *len_path, size_t *lentrim_path )
{
c_realpath_ ( fname, path, len_path, lentrim_path ) ;
}
///////////////////////////////////////////////////////////////////////////////
//
// to work with allocatable array of character. Later on, we use this for
// str as type(string).
//
char * c_abspath_TmpBuff ;
// To obtain the length of string, i.e. len_val (not counting NULL)
void c_abspath_prep_ ( const char *fname, size_t *len_val )
{
char buff [ MAXLEN_PATHNAME ] = "" ;
char *ptr = realpath ( fname, &buff[0] ) ;
if ( ptr == NULL )
{
*len_val = 0 ;
errno = EEXIST ;
}
else
{
*len_val = strlen ( ptr ) ;
if ( *len_val > 0 )
{
c_abspath_TmpBuff = (char *) malloc ( sizeof(char) * (*len_val + 1) );
strncpy ( c_abspath_TmpBuff, buff, *len_val+1 ) ;
}
}
}
// then, copy the result in the buff c_abspath_TmpBuff to *val
void c_abspath_post_ ( size_t *len_val, char *val )
{
if ( *len_val > 0 )
{
strncpy ( val, c_abspath_TmpBuff, *len_val ) ;
free ( c_abspath_TmpBuff );
}
}
////////////////////////////////////////////////////////////////////////////////
/*
#include <stdlib.h>
/usr/include/stdlib.h
+ realpath
char *realpath ( const char *file_name, char *resolved_name )
Return the canonical absolute name of FILE_NAME. If RESOLVED_NAME
is null, the result is malloc'd; otherwise, if the canonical name is
PATH_MAX chars or more, returns null with 'errno' set to ENAMETOOLONG;
if the name fits in fewer than PATH_MAX chars, returns the name in
RESOLVED.
Upon successful completion, realpath() shall return a pointer to
the resolved name. Otherwise, realpath() shall return a null pointer
and set errno to indicate the error, and the contents of the buffer
pointed to by resolved_name are undefined.
ERRORS
The realpath() function shall fail if:
[EACCES]
Read or search permission was denied for a component of file_name.
[EINVAL]
The file_name argument is a null pointer.
[EIO]
An error occurred while reading from the file system.
[ELOOP]
A loop exists in symbolic links encountered during resolution of the
file_name argument.
[ENAMETOOLONG]
The length of the file_name argument exceeds {PATH_MAX} or a pathname
component is longer than {NAME_MAX}.
[ENOENT]
A component of file_name does not name an existing file or file_name
points to an empty string.
[ENOTDIR]
A component of the path prefix is not a directory.
The realpath() function may fail if:
[ELOOP]
More than {SYMLOOP_MAX} symbolic links were encountered during resolution
of the file_name argument.
[ENAMETOOLONG]
Pathname resolution of a symbolic link produced an intermediate result
whose length exceeds {PATH_MAX}.
[ENOMEM]
Insufficient storage space is available.
*/