Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
6
66
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Eric Vidal
66
Commits
4f95210c
Commit
4f95210c
authored
3 years ago
by
Eric Vidal
Browse files
Options
Downloads
Patches
Plain Diff
follow changes of the resolve_tree_s structure
parent
88655b4f
No related branches found
Branches containing commit
No related tags found
Tags containing commit
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
src/lib66/tree_resolve.c
+289
-10
289 additions, 10 deletions
src/lib66/tree_resolve.c
with
289 additions
and
10 deletions
src/lib66/tree_resolve.c
+
289
−
10
View file @
4f95210c
...
...
@@ -15,8 +15,11 @@
#include
<stdint.h>
#include
<stddef.h>
#include
<stdlib.h>
//free
#include
<pwd.h>
#include
<sys/stat.h>
#include
<oblibs/log.h>
#include
<oblibs/string.h>
#include
<skalibs/stralloc.h>
#include
<skalibs/cdbmake.h>
...
...
@@ -24,6 +27,30 @@
#include
<66/tree.h>
#include
<66/resolve.h>
#include
<66/constants.h>
#include
<66/graph.h>
resolve_tree_field_table_t
resolve_tree_field_table
[]
=
{
[
TREE_ENUM_NAME
]
=
{
.
field
=
"name"
},
[
TREE_ENUM_DEPENDS
]
=
{
.
field
=
"depends"
},
[
TREE_ENUM_REQUIREDBY
]
=
{
.
field
=
"requiredby"
},
[
TREE_ENUM_ALLOW
]
=
{
.
field
=
"allow"
},
[
TREE_ENUM_GROUPS
]
=
{
.
field
=
"groups"
},
[
TREE_ENUM_CONTENTS
]
=
{
.
field
=
"contents"
},
[
TREE_ENUM_ENABLED
]
=
{
.
field
=
"enabled"
},
[
TREE_ENUM_CURRENT
]
=
{
.
field
=
"current"
},
[
TREE_ENUM_NDEPENDS
]
=
{
.
field
=
"ndepends"
},
[
TREE_ENUM_NREQUIREDBY
]
=
{
.
field
=
"nrequiredby"
},
[
TREE_ENUM_NALLOW
]
=
{
.
field
=
"nallow"
},
[
TREE_ENUM_NGROUPS
]
=
{
.
field
=
"ngroups"
},
[
TREE_ENUM_NCONTENTS
]
=
{
.
field
=
"ncontents"
},
[
TREE_ENUM_INIT
]
=
{
.
field
=
"init"
},
[
TREE_ENUM_DISEN
]
=
{
.
field
=
"disen"
},
[
TREE_ENUM_NENABLED
]
=
{
.
field
=
"nenabled"
},
[
TREE_ENUM_ENDOFKEY
]
=
{
.
field
=
0
}
}
;
int
tree_read_cdb
(
cdb
*
c
,
resolve_tree_t
*
tres
)
{
...
...
@@ -33,7 +60,7 @@ int tree_read_cdb(cdb *c, resolve_tree_t *tres)
resolve_wrapper_t_ref
wres
;
uint32_t
x
;
wres
=
resolve_set_struct
(
SERVICE
_STRUCT
,
tres
)
;
wres
=
resolve_set_struct
(
DATA_
SERVICE
,
tres
)
;
resolve_init
(
wres
)
;
...
...
@@ -53,10 +80,22 @@ int tree_read_cdb(cdb *c, resolve_tree_t *tres)
resolve_find_cdb
(
&
tmp
,
c
,
"allow"
)
;
tres
->
allow
=
tmp
.
len
?
resolve_add_string
(
wres
,
tmp
.
s
)
:
0
;
/* groups */
resolve_find_cdb
(
&
tmp
,
c
,
"groups"
)
;
tres
->
groups
=
tmp
.
len
?
resolve_add_string
(
wres
,
tmp
.
s
)
:
0
;
/* contents */
resolve_find_cdb
(
&
tmp
,
c
,
"contents"
)
;
tres
->
contents
=
tmp
.
len
?
resolve_add_string
(
wres
,
tmp
.
s
)
:
0
;
/* enabled */
resolve_find_cdb
(
&
tmp
,
c
,
"enabled"
)
;
tres
->
enabled
=
tmp
.
len
?
resolve_add_string
(
wres
,
tmp
.
s
)
:
0
;
/* current */
resolve_find_cdb
(
&
tmp
,
c
,
"current"
)
;
tres
->
current
=
tmp
.
len
?
resolve_add_string
(
wres
,
tmp
.
s
)
:
0
;
/* ndepends */
x
=
resolve_find_cdb
(
&
tmp
,
c
,
"ndepends"
)
;
tres
->
ndepends
=
x
;
...
...
@@ -65,14 +104,18 @@ int tree_read_cdb(cdb *c, resolve_tree_t *tres)
x
=
resolve_find_cdb
(
&
tmp
,
c
,
"nrequiredby"
)
;
tres
->
nrequiredby
=
x
;
/* nallow */
x
=
resolve_find_cdb
(
&
tmp
,
c
,
"nallow"
)
;
tres
->
nallow
=
x
;
/* ngroups */
x
=
resolve_find_cdb
(
&
tmp
,
c
,
"ngroups"
)
;
tres
->
ngroups
=
x
;
/* ncontents */
x
=
resolve_find_cdb
(
&
tmp
,
c
,
"ncontents"
)
;
tres
->
ncontents
=
x
;
/* current */
x
=
resolve_find_cdb
(
&
tmp
,
c
,
"current"
)
;
tres
->
current
=
x
;
/* init */
x
=
resolve_find_cdb
(
&
tmp
,
c
,
"init"
)
;
tres
->
init
=
x
;
...
...
@@ -81,6 +124,10 @@ int tree_read_cdb(cdb *c, resolve_tree_t *tres)
x
=
resolve_find_cdb
(
&
tmp
,
c
,
"disen"
)
;
tres
->
disen
=
x
;
/* nenabled */
x
=
resolve_find_cdb
(
&
tmp
,
c
,
"nenabled"
)
;
tres
->
nenabled
=
x
;
free
(
wres
)
;
stralloc_free
(
&
tmp
)
;
...
...
@@ -105,26 +152,41 @@ int tree_write_cdb(cdbmaker *c, resolve_tree_t *tres)
/* allow */
!
resolve_add_cdb
(
c
,
"allow"
,
str
+
tres
->
allow
)
||
/* groups */
!
resolve_add_cdb
(
c
,
"groups"
,
str
+
tres
->
groups
)
||
/* contents */
!
resolve_add_cdb
(
c
,
"contents"
,
str
+
tres
->
contents
)
||
/* enabled */
!
resolve_add_cdb
(
c
,
"enabled"
,
str
+
tres
->
enabled
)
||
/* current */
!
resolve_add_cdb
(
c
,
"current"
,
str
+
tres
->
current
)
||
/* ndepends */
!
resolve_add_cdb_uint
(
c
,
"ndepends"
,
tres
->
ndepends
)
||
/* nrequiredby */
!
resolve_add_cdb_uint
(
c
,
"nrequiredby"
,
tres
->
nrequiredby
)
||
/* nallow */
!
resolve_add_cdb_uint
(
c
,
"nallow"
,
tres
->
nallow
)
||
/* ngroups */
!
resolve_add_cdb_uint
(
c
,
"ngroups"
,
tres
->
ngroups
)
||
/* ncontents */
!
resolve_add_cdb_uint
(
c
,
"ncontents"
,
tres
->
ncontents
)
||
/* current */
!
resolve_add_cdb_uint
(
c
,
"current"
,
tres
->
current
)
||
/* init */
!
resolve_add_cdb_uint
(
c
,
"init"
,
tres
->
init
)
||
/* disen */
!
resolve_add_cdb_uint
(
c
,
"disen"
,
tres
->
disen
))
return
0
;
!
resolve_add_cdb_uint
(
c
,
"disen"
,
tres
->
disen
)
||
/* nenabled */
!
resolve_add_cdb_uint
(
c
,
"nenabled"
,
tres
->
nenabled
))
return
0
;
return
1
;
}
...
...
@@ -146,14 +208,231 @@ int tree_resolve_copy(resolve_tree_t *dst, resolve_tree_t *tres)
dst
->
depends
=
tres
->
depends
;
dst
->
requiredby
=
tres
->
requiredby
;
dst
->
allow
=
tres
->
allow
;
dst
->
groups
=
tres
->
groups
;
dst
->
contents
=
tres
->
contents
;
dst
->
enabled
=
tres
->
enabled
;
dst
->
current
=
tres
->
current
;
dst
->
ndepends
=
tres
->
ndepends
;
dst
->
nrequiredby
=
tres
->
nrequiredby
;
dst
->
nallow
=
tres
->
nallow
;
dst
->
ngroups
=
tres
->
ngroups
;
dst
->
ncontents
=
tres
->
ncontents
;
dst
->
current
=
tres
->
current
;
dst
->
init
=
tres
->
init
;
dst
->
disen
=
tres
->
disen
;
dst
->
nenabled
=
tres
->
nenabled
;
return
1
;
}
int
tree_resolve_create_master
(
char
const
*
base
,
uid_t
owner
)
{
int
e
=
0
;
size_t
baselen
=
strlen
(
base
)
;
struct
passwd
*
pw
=
getpwuid
(
owner
)
;
resolve_tree_t
tres
=
RESOLVE_TREE_ZERO
;
resolve_wrapper_t_ref
wres
=
resolve_set_struct
(
DATA_TREE
,
&
tres
)
;
char
dst
[
baselen
+
SS_SYSTEM_LEN
+
1
]
;
if
(
!
pw
)
{
if
(
!
errno
)
errno
=
ESRCH
;
goto
err
;
}
resolve_init
(
wres
)
;
auto_strings
(
dst
,
base
,
SS_SYSTEM
)
;
tres
.
name
=
resolve_add_string
(
wres
,
SS_MASTER
+
1
)
;
tres
.
allow
=
resolve_add_string
(
wres
,
pw
->
pw_name
)
;
tres
.
groups
=
resolve_add_string
(
wres
,
owner
?
TREE_GROUPS_USER
:
TREE_GROUPS_ADM
)
;
log_trace
(
"write resolve file of inner tree"
)
;
if
(
!
resolve_write
(
wres
,
dst
,
SS_MASTER
+
1
))
goto
err
;
e
=
1
;
err:
resolve_free
(
wres
)
;
return
e
;
}
int
tree_resolve_modify_field
(
resolve_tree_t
*
tres
,
uint8_t
field
,
char
const
*
data
)
{
log_flow
()
;
uint32_t
ifield
;
int
e
=
0
;
resolve_wrapper_t_ref
wres
=
resolve_set_struct
(
DATA_TREE
,
tres
)
;
switch
(
field
)
{
case
TREE_ENUM_NAME
:
tres
->
name
=
resolve_add_string
(
wres
,
data
)
;
break
;
case
TREE_ENUM_DEPENDS
:
tres
->
depends
=
resolve_add_string
(
wres
,
data
)
;
break
;
case
TREE_ENUM_REQUIREDBY
:
tres
->
requiredby
=
resolve_add_string
(
wres
,
data
)
;
break
;
case
TREE_ENUM_ALLOW
:
tres
->
allow
=
resolve_add_string
(
wres
,
data
)
;
break
;
case
TREE_ENUM_GROUPS
:
tres
->
groups
=
resolve_add_string
(
wres
,
data
)
;
break
;
case
TREE_ENUM_CONTENTS
:
tres
->
contents
=
resolve_add_string
(
wres
,
data
)
;
break
;
case
TREE_ENUM_ENABLED
:
tres
->
enabled
=
resolve_add_string
(
wres
,
data
)
;
break
;
case
TREE_ENUM_CURRENT
:
tres
->
current
=
resolve_add_string
(
wres
,
data
)
;
break
;
case
TREE_ENUM_NDEPENDS
:
if
(
!
uint0_scan
(
data
,
&
ifield
))
goto
err
;
tres
->
ndepends
=
ifield
;
break
;
case
TREE_ENUM_NREQUIREDBY
:
if
(
!
uint0_scan
(
data
,
&
ifield
))
goto
err
;
tres
->
nrequiredby
=
ifield
;
break
;
case
TREE_ENUM_NALLOW
:
if
(
!
uint0_scan
(
data
,
&
ifield
))
goto
err
;
tres
->
nallow
=
ifield
;
break
;
case
TREE_ENUM_NGROUPS
:
if
(
!
uint0_scan
(
data
,
&
ifield
))
goto
err
;
tres
->
ngroups
=
ifield
;
break
;
case
TREE_ENUM_NCONTENTS
:
if
(
!
uint0_scan
(
data
,
&
ifield
))
goto
err
;
tres
->
ncontents
=
ifield
;
break
;
case
TREE_ENUM_INIT
:
if
(
!
uint0_scan
(
data
,
&
ifield
))
goto
err
;
tres
->
init
=
ifield
;
break
;
case
TREE_ENUM_DISEN
:
if
(
!
uint0_scan
(
data
,
&
ifield
))
goto
err
;
tres
->
disen
=
ifield
;
break
;
case
TREE_ENUM_NENABLED
:
if
(
!
uint0_scan
(
data
,
&
ifield
))
goto
err
;
tres
->
nenabled
=
ifield
;
break
;
default:
break
;
}
e
=
1
;
err:
free
(
wres
)
;
return
e
;
}
int
tree_resolve_field_tosa
(
stralloc
*
sa
,
resolve_tree_t
*
tres
,
resolve_tree_enum_t
field
)
{
log_flow
()
;
uint32_t
ifield
;
switch
(
field
)
{
case
TREE_ENUM_NAME
:
ifield
=
tres
->
name
;
break
;
case
TREE_ENUM_DEPENDS
:
ifield
=
tres
->
depends
;
break
;
case
TREE_ENUM_REQUIREDBY
:
ifield
=
tres
->
requiredby
;
break
;
case
TREE_ENUM_ALLOW
:
ifield
=
tres
->
allow
;
break
;
case
TREE_ENUM_GROUPS
:
ifield
=
tres
->
groups
;
break
;
case
TREE_ENUM_CONTENTS
:
ifield
=
tres
->
contents
;
break
;
case
TREE_ENUM_ENABLED
:
ifield
=
tres
->
enabled
;
break
;
case
TREE_ENUM_CURRENT
:
ifield
=
tres
->
current
;
break
;
case
TREE_ENUM_NDEPENDS
:
ifield
=
tres
->
ndepends
;
break
;
case
TREE_ENUM_NREQUIREDBY
:
ifield
=
tres
->
nrequiredby
;
break
;
case
TREE_ENUM_NALLOW
:
ifield
=
tres
->
nallow
;
break
;
case
TREE_ENUM_NGROUPS
:
ifield
=
tres
->
ngroups
;
break
;
case
TREE_ENUM_NCONTENTS
:
ifield
=
tres
->
ncontents
;
break
;
case
TREE_ENUM_INIT
:
ifield
=
tres
->
init
;
break
;
case
TREE_ENUM_DISEN
:
ifield
=
tres
->
disen
;
break
;
case
TREE_ENUM_NENABLED
:
ifield
=
tres
->
nenabled
;
break
;
default:
return
0
;
}
if
(
!
auto_stra
(
sa
,
tres
->
sa
.
s
+
ifield
))
return
0
;
return
1
;
}
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment