util: unify how we parse mode_t strings
This commit is contained in:
+12
-23
@@ -759,41 +759,30 @@ int config_parse_strv(const char *unit,
|
||||
return 0;
|
||||
}
|
||||
|
||||
int config_parse_mode(const char *unit,
|
||||
const char *filename,
|
||||
unsigned line,
|
||||
const char *section,
|
||||
int config_parse_mode(
|
||||
const char *unit,
|
||||
const char *filename,
|
||||
unsigned line,
|
||||
const char *section,
|
||||
unsigned section_line,
|
||||
const char *lvalue,
|
||||
int ltype,
|
||||
const char *rvalue,
|
||||
void *data,
|
||||
void *userdata) {
|
||||
const char *lvalue,
|
||||
int ltype,
|
||||
const char *rvalue,
|
||||
void *data,
|
||||
void *userdata) {
|
||||
|
||||
mode_t *m = data;
|
||||
long l;
|
||||
char *x = NULL;
|
||||
|
||||
assert(filename);
|
||||
assert(lvalue);
|
||||
assert(rvalue);
|
||||
assert(data);
|
||||
|
||||
errno = 0;
|
||||
l = strtol(rvalue, &x, 8);
|
||||
if (!x || x == rvalue || *x || errno) {
|
||||
log_syntax(unit, LOG_ERR, filename, line, errno,
|
||||
"Failed to parse mode value, ignoring: %s", rvalue);
|
||||
if (parse_mode(rvalue, m) < 0) {
|
||||
log_syntax(unit, LOG_ERR, filename, line, errno, "Failed to parse mode value, ignoring: %s", rvalue);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (l < 0000 || l > 07777) {
|
||||
log_syntax(unit, LOG_ERR, filename, line, ERANGE,
|
||||
"Mode value out of range, ignoring: %s", rvalue);
|
||||
return 0;
|
||||
}
|
||||
|
||||
*m = (mode_t) l;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -8159,3 +8159,24 @@ char *shell_maybe_quote(const char *s) {
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
int parse_mode(const char *s, mode_t *ret) {
|
||||
char *x;
|
||||
long l;
|
||||
|
||||
assert(s);
|
||||
assert(ret);
|
||||
|
||||
errno = 0;
|
||||
l = strtol(s, &x, 8);
|
||||
if (errno != 0)
|
||||
return -errno;
|
||||
|
||||
if (!x || x == s || *x)
|
||||
return -EINVAL;
|
||||
if (l < 0 || l > 07777)
|
||||
return -ERANGE;
|
||||
|
||||
*ret = (mode_t) l;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1089,3 +1089,5 @@ void cmsg_close_all(struct msghdr *mh);
|
||||
int rename_noreplace(int olddirfd, const char *oldpath, int newdirfd, const char *newpath);
|
||||
|
||||
char *shell_maybe_quote(const char *s);
|
||||
|
||||
int parse_mode(const char *s, mode_t *ret);
|
||||
|
||||
Reference in New Issue
Block a user