Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
L
lxc
Project
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Chen Yisong
lxc
Commits
5f76b90f
Unverified
Commit
5f76b90f
authored
Nov 02, 2018
by
2xsec
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
lxcmntent: coding rules
Signed-off-by:
2xsec
<
dh48.jeong@samsung.com
>
parent
a8c7d037
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
108 additions
and
101 deletions
+108
-101
lxcmntent.c
src/include/lxcmntent.c
+108
-101
No files found.
src/include/lxcmntent.c
View file @
5f76b90f
/* Utilities for reading/writing fstab, mtab, etc.
/* Utilities for reading/writing fstab, mtab, etc.
Copyright (C) 1995-2000, 2001, 2002, 2003, 2006
*
Copyright (C) 1995-2000, 2001, 2002, 2003, 2006
Free Software Foundation, Inc.
*
Free Software Foundation, Inc.
This file is part of the GNU C Library.
*
This file is part of the GNU C Library.
*
The GNU C Library is free software; you can redistribute it and/or
*
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
*
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
*
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
*
version 2.1 of the License, or (at your option) any later version.
*
The GNU C Library is distributed in the hope that it will be useful,
*
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
*
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
*
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
*
Lesser General Public License for more details.
*
You should have received a copy of the GNU Lesser General Public
*
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
*
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
*/
#ifndef _GNU_SOURCE
#define _GNU_SOURCE 1
#endif
#include <alloca.h>
#include <alloca.h>
#include <macro.h>
#include <mntent.h>
#include <stdio.h>
#include <stdio.h>
#include <string.h>
#include <string.h>
#include <mntent.h>
/* Since the values in a line are separated by spaces, a name cannot
/* Since the values in a line are separated by spaces, a name cannot
contain a space. Therefore some programs encode spaces in names
*
contain a space. Therefore some programs encode spaces in names
by the strings "\040". We undo the encoding when reading an entry.
*
by the strings "\040". We undo the encoding when reading an entry.
The decoding happens in place. */
* The decoding happens in place.
static
char
*
*/
decode_name
(
char
*
buf
)
static
char
*
decode_name
(
char
*
buf
)
{
{
char
*
rp
=
buf
;
char
*
rp
=
buf
;
char
*
wp
=
buf
;
char
*
wp
=
buf
;
do
do
{
if
(
rp
[
0
]
==
'\\'
&&
rp
[
1
]
==
'0'
&&
rp
[
2
]
==
'4'
&&
rp
[
3
]
==
'0'
)
if
(
rp
[
0
]
==
'\\'
&&
rp
[
1
]
==
'0'
&&
rp
[
2
]
==
'4'
&&
{
rp
[
3
]
==
'0'
)
{
/* \040 is a SPACE. */
/* \040 is a SPACE. */
*
wp
++
=
' '
;
*
wp
++
=
' '
;
rp
+=
3
;
rp
+=
3
;
}
}
else
if
(
rp
[
0
]
==
'\\'
&&
rp
[
1
]
==
'0'
&&
rp
[
2
]
==
'1'
&&
else
if
(
rp
[
0
]
==
'\\'
&&
rp
[
1
]
==
'0'
&&
rp
[
2
]
==
'1'
&&
rp
[
3
]
==
'1'
)
rp
[
3
]
==
'1'
)
{
{
/* \011 is a TAB. */
/* \011 is a TAB. */
*
wp
++
=
'\t'
;
*
wp
++
=
'\t'
;
rp
+=
3
;
rp
+=
3
;
}
}
else
if
(
rp
[
0
]
==
'\\'
&&
rp
[
1
]
==
'0'
&&
rp
[
2
]
==
'1'
&&
else
if
(
rp
[
0
]
==
'\\'
&&
rp
[
1
]
==
'0'
&&
rp
[
2
]
==
'1'
&&
rp
[
3
]
==
'2'
)
rp
[
3
]
==
'2'
)
{
{
/* \012 is a NEWLINE. */
/* \012 is a NEWLINE. */
*
wp
++
=
'\n'
;
*
wp
++
=
'\n'
;
rp
+=
3
;
rp
+=
3
;
}
}
else
if
(
rp
[
0
]
==
'\\'
&&
rp
[
1
]
==
'\\'
)
{
else
if
(
rp
[
0
]
==
'\\'
&&
rp
[
1
]
==
'\\'
)
{
/* We have to escape \\ to be able to represent all characters. */
/* We have to escape \\ to be able to represent all characters. */
*
wp
++
=
'\\'
;
*
wp
++
=
'\\'
;
rp
+=
1
;
rp
+=
1
;
}
}
else
if
(
rp
[
0
]
==
'\\'
&&
rp
[
1
]
==
'1'
&&
rp
[
2
]
==
'3'
&&
else
if
(
rp
[
0
]
==
'\\'
&&
rp
[
1
]
==
'1'
&&
rp
[
2
]
==
'3'
&&
rp
[
3
]
==
'4'
)
rp
[
3
]
==
'4'
)
{
{
/* \134 is also \\. */
/* \134 is also \\. */
*
wp
++
=
'\\'
;
*
wp
++
=
'\\'
;
rp
+=
3
;
rp
+=
3
;
}
}
else
{
else
*
wp
++
=
*
rp
;
*
wp
++
=
*
rp
;
while
(
*
rp
++
!=
'\0'
);
}
}
while
(
*
rp
++
!=
'\0'
);
return
buf
;
return
buf
;
}
}
/* Read one mount table entry from STREAM. Returns a pointer to storage
/* Read one mount table entry from STREAM. Returns a pointer to storage
reused on the next call, or null for EOF or error (use feof/ferror to
* reused on the next call, or null for EOF or error (use feof/ferror to check).
check).
*/
*/
struct
mntent
*
getmntent_r
(
FILE
*
stream
,
struct
mntent
*
mp
,
char
*
buffer
,
int
bufsiz
)
struct
mntent
*
getmntent_r
(
FILE
*
stream
,
struct
mntent
*
mp
,
char
*
buffer
,
int
bufsiz
)
{
{
char
*
cp
;
char
*
cp
;
char
*
head
;
char
*
head
;
do
do
{
{
char
*
end_ptr
;
char
*
end_ptr
;
if
(
fgets
(
buffer
,
bufsiz
,
stream
)
==
NULL
)
if
(
!
fgets
(
buffer
,
bufsiz
,
stream
))
{
return
NULL
;
return
NULL
;
}
end_ptr
=
strchr
(
buffer
,
'\n'
);
end_ptr
=
strchr
(
buffer
,
'\n'
);
if
(
end_ptr
!=
NULL
)
/* chop newline */
if
(
end_ptr
!=
NULL
)
{
/* chop newline */
*
end_ptr
=
'\0'
;
*
end_ptr
=
'\0'
;
else
}
else
{
{
/* Not the whole line was read. Do it now but forget it. */
/* Not the whole line was read. Do it now but forget it. */
char
tmp
[
1024
];
char
tmp
[
1024
]
=
{
0
};
while
(
fgets
(
tmp
,
sizeof
tmp
,
stream
)
!=
NULL
)
if
(
strchr
(
tmp
,
'\n'
)
!=
NULL
)
while
(
fgets
(
tmp
,
sizeof
tmp
,
stream
))
if
(
strchr
(
tmp
,
'\n'
)
!=
NULL
)
break
;
break
;
}
}
head
=
buffer
+
strspn
(
buffer
,
"
\t
"
);
head
=
buffer
+
strspn
(
buffer
,
"
\t
"
);
/* skip empty lines and comment lines: */
/* skip empty lines and comment lines: */
}
}
while
(
head
[
0
]
==
'\0'
||
head
[
0
]
==
'#'
);
while
(
head
[
0
]
==
'\0'
||
head
[
0
]
==
'#'
);
cp
=
strsep
(
&
head
,
"
\t
"
);
cp
=
strsep
(
&
head
,
"
\t
"
);
mp
->
mnt_fsname
=
cp
!=
NULL
?
decode_name
(
cp
)
:
(
char
*
)
""
;
mp
->
mnt_fsname
=
cp
?
decode_name
(
cp
)
:
(
char
*
)
""
;
if
(
head
)
if
(
head
)
head
+=
strspn
(
head
,
"
\t
"
);
head
+=
strspn
(
head
,
"
\t
"
);
cp
=
strsep
(
&
head
,
"
\t
"
);
mp
->
mnt_dir
=
cp
!=
NULL
?
decode_name
(
cp
)
:
(
char
*
)
""
;
cp
=
strsep
(
&
head
,
"
\t
"
);
mp
->
mnt_dir
=
cp
?
decode_name
(
cp
)
:
(
char
*
)
""
;
if
(
head
)
if
(
head
)
head
+=
strspn
(
head
,
"
\t
"
);
head
+=
strspn
(
head
,
"
\t
"
);
cp
=
strsep
(
&
head
,
"
\t
"
);
mp
->
mnt_type
=
cp
!=
NULL
?
decode_name
(
cp
)
:
(
char
*
)
""
;
cp
=
strsep
(
&
head
,
"
\t
"
);
mp
->
mnt_type
=
cp
?
decode_name
(
cp
)
:
(
char
*
)
""
;
if
(
head
)
if
(
head
)
head
+=
strspn
(
head
,
"
\t
"
);
head
+=
strspn
(
head
,
"
\t
"
);
cp
=
strsep
(
&
head
,
"
\t
"
);
mp
->
mnt_opts
=
cp
!=
NULL
?
decode_name
(
cp
)
:
(
char
*
)
""
;
cp
=
strsep
(
&
head
,
"
\t
"
);
switch
(
head
?
sscanf
(
head
,
" %d %d "
,
&
mp
->
mnt_freq
,
&
mp
->
mnt_passno
)
:
0
)
mp
->
mnt_opts
=
cp
?
decode_name
(
cp
)
:
(
char
*
)
""
;
{
if
(
head
)
{
int
ret
=
sscanf
(
head
,
" %d %d "
,
&
mp
->
mnt_freq
,
&
mp
->
mnt_passno
);
switch
(
ret
)
{
case
0
:
case
0
:
mp
->
mnt_freq
=
0
;
mp
->
mnt_freq
=
0
;
case
1
:
case
1
:
...
@@ -128,68 +129,74 @@ struct mntent *getmntent_r (FILE *stream, struct mntent *mp, char *buffer, int b
...
@@ -128,68 +129,74 @@ struct mntent *getmntent_r (FILE *stream, struct mntent *mp, char *buffer, int b
case
2
:
case
2
:
break
;
break
;
}
}
}
else
{
mp
->
mnt_freq
=
0
;
}
return
mp
;
return
mp
;
}
}
struct
mntent
*
getmntent
(
FILE
*
stream
)
struct
mntent
*
getmntent
(
FILE
*
stream
)
{
{
static
struct
mntent
m
;
static
struct
mntent
m
;
static
char
*
getmntent_buffer
;
static
char
*
getmntent_buffer
;
#define BUFFER_SIZE 4096
if
(
!
getmntent_buffer
)
{
if
(
getmntent_buffer
==
NULL
)
{
getmntent_buffer
=
(
char
*
)
malloc
(
LXC_MAX_BUFFER
);
getmntent_buffer
=
(
char
*
)
malloc
(
BUFFER_SIZE
);
if
(
!
getmntent_buffer
)
return
NULL
;
}
}
return
getmntent_r
(
stream
,
&
m
,
getmntent_buffer
,
BUFFER_SIZE
);
return
getmntent_r
(
stream
,
&
m
,
getmntent_buffer
,
LXC_MAX_BUFFER
);
#undef BUFFER_SIZE
}
}
/* Prepare to begin reading and/or writing mount table entries from the
/* Prepare to begin reading and/or writing mount table entries from the
beginning of FILE. MODE is as for `fopen'. */
* beginning of FILE. MODE is as for `fopen'.
FILE
*
setmntent
(
const
char
*
file
,
const
char
*
mode
)
*/
FILE
*
setmntent
(
const
char
*
file
,
const
char
*
mode
)
{
{
/* Extend the mode parameter with "c" to disable cancellation in the
/* Extend the mode parameter with "c" to disable cancellation in the
I/O functions and "e" to set FD_CLOEXEC. */
* I/O functions and "e" to set FD_CLOEXEC.
size_t
modelen
=
strlen
(
mode
);
*/
size_t
modelen
=
strlen
(
mode
);
char
*
newmode
;
char
*
newmode
;
newmode
=
alloca
(
modelen
+
3
);
newmode
=
alloca
(
modelen
+
3
);
memcpy
(
newmode
,
mode
,
modelen
);
memcpy
(
newmode
,
mode
,
modelen
);
memcpy
(
newmode
+
modelen
,
"ce"
,
3
);
memcpy
(
newmode
+
modelen
,
"ce"
,
3
);
FILE
*
result
=
fopen
(
file
,
newmode
);
return
result
;
return
fopen
(
file
,
newmode
)
;
}
}
/* Close a stream opened with `setmntent'. */
/* Close a stream opened with `setmntent'. */
int
endmntent
(
FILE
*
stream
)
int
endmntent
(
FILE
*
stream
)
{
{
if
(
stream
)
/* SunOS 4.x allows for NULL stream */
/* SunOS 4.x allows for NULL stream */
fclose
(
stream
);
if
(
stream
)
return
1
;
/* SunOS 4.x says to always return 1 */
fclose
(
stream
);
/* SunOS 4.x says to always return 1 */
return
1
;
}
}
/* Search MNT->mnt_opts for an option matching OPT.
/* Search MNT->mnt_opts for an option matching OPT.
Returns the address of the substring, or null if none found. */
* Returns the address of the substring, or null if none found.
char
*
hasmntopt
(
const
struct
mntent
*
mnt
,
const
char
*
opt
)
*/
char
*
hasmntopt
(
const
struct
mntent
*
mnt
,
const
char
*
opt
)
{
{
const
size_t
optlen
=
strlen
(
opt
);
const
size_t
optlen
=
strlen
(
opt
);
char
*
rest
=
mnt
->
mnt_opts
,
*
p
;
char
*
rest
=
mnt
->
mnt_opts
,
*
p
;
while
((
p
=
strstr
(
rest
,
opt
))
!=
NULL
)
while
((
p
=
strstr
(
rest
,
opt
)))
{
{
if
((
p
==
rest
||
p
[
-
1
]
==
','
)
&&
if
((
p
==
rest
||
p
[
-
1
]
==
','
)
(
p
[
optlen
]
==
'\0'
||
p
[
optlen
]
==
'='
||
p
[
optlen
]
==
','
))
&&
(
p
[
optlen
]
==
'\0'
||
p
[
optlen
]
==
'='
||
p
[
optlen
]
==
','
))
return
p
;
return
p
;
rest
=
strchr
(
p
,
','
);
rest
=
strchr
(
p
,
','
);
if
(
rest
==
NULL
)
if
(
!
rest
)
break
;
break
;
++
rest
;
++
rest
;
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment