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
2dbdfaac
Commit
2dbdfaac
authored
6 years ago
by
Eric Vidal
Browse files
Options
Downloads
Patches
Plain Diff
remove old function, add ss_resolve_xxx function
parent
87b4580d
Branches
Branches containing commit
Tags
Tags containing commit
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
src/lib66/resolve.c
+572
-229
572 additions, 229 deletions
src/lib66/resolve.c
with
572 additions
and
229 deletions
src/lib66/resolve.c
+
572
−
229
View file @
2dbdfaac
...
...
@@ -32,182 +32,16 @@
#include
<66/constants.h>
#include
<66/utils.h>
#include
<66/enum.h>
#include
<66/parser.h>
//resolve need to find stralloc keep
#include
<66/resolve.h>
#include
<66/ssexec.h>
//#include <stdio.h>
/** @Return -2 on error
* @Return -1 if resolve directory doesn't exist
* @Return 0 is file doesn't exist
* @Return 1 on success */
int
resolve_read
(
stralloc
*
sa
,
char
const
*
src
,
char
const
*
svname
,
char
const
*
file
)
{
int
r
;
size_t
srclen
=
strlen
(
src
)
;
size_t
namelen
=
strlen
(
svname
)
;
size_t
filelen
=
strlen
(
file
)
;
size_t
newlen
;
size_t
max
=
namelen
>
filelen
?
namelen
:
filelen
;
char
solve
[
srclen
+
SS_RESOLVE_LEN
+
1
+
max
+
7
+
1
]
;
memcpy
(
solve
,
src
,
srclen
)
;
memcpy
(
solve
+
srclen
,
SS_RESOLVE
,
SS_RESOLVE_LEN
)
;
solve
[
srclen
+
SS_RESOLVE_LEN
]
=
'/'
;
memcpy
(
solve
+
srclen
+
SS_RESOLVE_LEN
+
1
,
svname
,
namelen
)
;
solve
[
srclen
+
SS_RESOLVE_LEN
+
1
+
namelen
]
=
'/'
;
newlen
=
srclen
+
SS_RESOLVE_LEN
+
1
+
namelen
+
1
;
solve
[
newlen
]
=
0
;
r
=
scan_mode
(
solve
,
S_IFDIR
)
;
if
(
r
<
0
)
{
VERBO3
strerr_warnw2x
(
"invalid directory: "
,
solve
)
;
return
-
2
;
}
if
(
!
r
)
return
-
1
;
memcpy
(
solve
+
newlen
,
file
,
filelen
)
;
solve
[
newlen
+
filelen
]
=
0
;
*
sa
=
stralloc_zero
;
r
=
openslurpclose
(
sa
,
solve
)
;
if
(
!
r
)
return
0
;
//if (!sa->len) return 0 ;
if
(
!
stralloc_0
(
sa
))
return
-
1
;
return
1
;
}
int
resolve_write
(
char
const
*
dst
,
char
const
*
svname
,
char
const
*
file
,
char
const
*
contents
,
unsigned
int
force
)
{
int
r
;
size_t
dstlen
=
strlen
(
dst
)
;
size_t
namelen
=
strlen
(
svname
)
;
size_t
clen
=
strlen
(
contents
)
;
size_t
filen
=
strlen
(
file
)
;
size_t
newlen
;
char
solve
[
dstlen
+
SS_RESOLVE_LEN
+
1
+
namelen
+
2
]
;
memcpy
(
solve
,
dst
,
dstlen
)
;
memcpy
(
solve
+
dstlen
,
SS_RESOLVE
,
SS_RESOLVE_LEN
)
;
solve
[
dstlen
+
SS_RESOLVE_LEN
]
=
'/'
;
newlen
=
dstlen
+
SS_RESOLVE_LEN
+
1
;
memcpy
(
solve
+
newlen
,
svname
,
namelen
)
;
solve
[
newlen
+
namelen
]
=
0
;
r
=
scan_mode
(
solve
,
S_IFDIR
)
;
if
(
r
<
0
)
{
VERBO3
strerr_warnw2sys
(
"invalid directory: "
,
solve
)
;
return
0
;
}
if
(
!
r
)
{
solve
[
newlen
]
=
0
;
if
(
!
dir_create_under
(
solve
,
svname
,
0755
))
{
VERBO3
strerr_warnwu3sys
(
"create directory: "
,
solve
,
svname
)
;
return
0
;
}
memcpy
(
solve
+
newlen
,
svname
,
namelen
)
;
}
solve
[
newlen
+
namelen
]
=
'/'
;
solve
[
newlen
+
namelen
+
1
]
=
0
;
newlen
=
newlen
+
namelen
+
1
;
#include
<s6/s6-supervise.h>
#include
<stdio.h>
char
torm
[
newlen
+
filen
+
1
]
;
memcpy
(
torm
,
solve
,
newlen
)
;
memcpy
(
torm
+
newlen
,
file
,
filen
)
;
torm
[
newlen
+
filen
]
=
0
;
r
=
scan_mode
(
torm
,
S_IFREG
)
;
if
(
r
<
0
||
(
r
&&
force
))
{
if
(
rm_rf
(
torm
)
<
0
)
{
VERBO3
strerr_warnwu2sys
(
"remove: "
,
torm
)
;
return
0
;
}
}
if
(
!
file_write_unsafe
(
solve
,
file
,
contents
,
clen
))
{
VERBO3
strerr_warnwu3sys
(
"write revolve file: "
,
solve
,
file
)
;
return
0
;
}
return
1
;
}
int
resolve_remove
(
char
const
*
dst
,
char
const
*
svname
,
char
const
*
file
)
{
int
r
;
size_t
dstlen
=
strlen
(
dst
)
;
size_t
namelen
=
strlen
(
svname
)
;
size_t
filen
=
strlen
(
file
)
;
size_t
newlen
;
char
solve
[
dstlen
+
SS_RESOLVE_LEN
+
1
+
namelen
+
1
+
filen
+
1
]
;
memcpy
(
solve
,
dst
,
dstlen
)
;
memcpy
(
solve
+
dstlen
,
SS_RESOLVE
,
SS_RESOLVE_LEN
)
;
solve
[
dstlen
+
SS_RESOLVE_LEN
]
=
'/'
;
memcpy
(
solve
+
dstlen
+
SS_RESOLVE_LEN
+
1
,
svname
,
namelen
)
;
newlen
=
dstlen
+
SS_RESOLVE_LEN
+
1
+
namelen
;
solve
[
newlen
]
=
0
;
r
=
scan_mode
(
solve
,
S_IFDIR
)
;
if
(
r
<
0
)
{
VERBO3
strerr_warnw2sys
(
"invalid directory: "
,
solve
)
;
return
0
;
}
if
(
!
r
)
{
VERBO3
strerr_warnwu2sys
(
"find directory: "
,
solve
)
;
return
0
;
}
solve
[
newlen
]
=
'/'
;
memcpy
(
solve
+
newlen
+
1
,
file
,
filen
)
;
solve
[
newlen
+
1
+
filen
]
=
0
;
r
=
scan_mode
(
solve
,
S_IFREG
)
;
if
(
r
<
0
||
r
)
{
if
(
rm_rf
(
solve
)
<
0
)
{
VERBO3
strerr_warnwu2sys
(
"remove: "
,
solve
)
;
return
0
;
}
}
return
1
;
}
int
resolve_remove_service
(
char
const
*
dst
,
char
const
*
svname
)
{
size_t
dstlen
=
strlen
(
dst
)
;
size_t
namelen
=
strlen
(
svname
)
;
char
solve
[
dstlen
+
SS_RESOLVE_LEN
+
1
+
namelen
+
1
]
;
memcpy
(
solve
,
dst
,
dstlen
)
;
memcpy
(
solve
+
dstlen
,
SS_RESOLVE
,
SS_RESOLVE_LEN
)
;
solve
[
dstlen
+
SS_RESOLVE_LEN
]
=
'/'
;
memcpy
(
solve
+
dstlen
+
SS_RESOLVE_LEN
+
1
,
svname
,
namelen
)
;
solve
[
dstlen
+
SS_RESOLVE_LEN
+
1
+
namelen
]
=
0
;
if
(
scan_mode
(
solve
,
S_IFDIR
))
{
if
(
rm_rf
(
solve
)
<
0
)
{
VERBO3
strerr_warnw2sys
(
"remove directory: "
,
solve
)
;
return
0
;
}
}
return
1
;
}
/*
int resolve_symlive(char const *live, char const *tree, char const *treename)
{
int r ;
...
...
@@ -280,75 +114,58 @@ int resolve_symlive(char const *live, char const *tree, char const *treename)
return 1 ;
}
int
resolve_pointo
(
stralloc
*
sa
,
ssexec_t
*
info
,
unsigned
int
type
,
unsigned
int
wh
at
)
*/
int
ss_
resolve_pointo
(
stralloc
*
sa
,
ssexec_t
*
info
,
unsigned
int
type
,
unsigned
int
wh
ere
)
{
size_t
treenamelen
=
strlen
(
info
->
treename
)
;
size_t
livelen
=
info
->
live
.
len
-
1
;
size_t
sourcelen
;
size_t
backlen
;
size_t
psrclen
;
char
*
r
=
NULL
;
stralloc
tmp
=
STRALLOC_ZERO
;
char
ownerstr
[
256
]
;
size_t
ownerlen
=
uid_fmt
(
ownerstr
,
info
->
owner
)
;
ownerstr
[
ownerlen
]
=
0
;
char
resolve
[
livelen
+
SS_RESOLVE_LEN
+
1
+
ownerlen
+
1
+
treenamelen
+
1
]
;
memcpy
(
resolve
,
info
->
live
.
s
,
livelen
)
;
memcpy
(
resolve
+
livelen
,
SS_RESOLVE
,
SS_RESOLVE_LEN
)
;
resolve
[
livelen
+
SS_RESOLVE_LEN
]
=
'/'
;
memcpy
(
resolve
+
livelen
+
SS_RESOLVE_LEN
+
1
,
ownerstr
,
ownerlen
)
;
resolve
[
livelen
+
SS_RESOLVE_LEN
+
1
+
ownerlen
]
=
'/'
;
memcpy
(
resolve
+
livelen
+
SS_RESOLVE_LEN
+
1
+
ownerlen
+
1
,
info
->
treename
,
treenamelen
)
;
resolve
[
livelen
+
SS_RESOLVE_LEN
+
1
+
ownerlen
+
1
+
treenamelen
]
=
0
;
char
source
[
info
->
tree
.
len
+
SS_SVDIRS_LEN
+
SS_SVC_LEN
+
1
]
;
memcpy
(
source
,
info
->
tree
.
s
,
info
->
tree
.
len
)
;
memcpy
(
source
+
info
->
tree
.
len
,
SS_SVDIRS
,
SS_SVDIRS_LEN
)
;
sourcelen
=
info
->
tree
.
len
+
SS_SVDIRS_LEN
;
source
[
sourcelen
]
=
0
;
char
backup
[
info
->
base
.
len
+
SS_SYSTEM_LEN
+
SS_BACKUP_LEN
+
1
+
treenamelen
+
SS_SVC_LEN
+
1
]
;
memcpy
(
backup
,
info
->
base
.
s
,
info
->
base
.
len
)
;
memcpy
(
backup
+
info
->
base
.
len
,
SS_SYSTEM
,
SS_SYSTEM_LEN
)
;
memcpy
(
backup
+
info
->
base
.
len
+
SS_SYSTEM_LEN
,
SS_BACKUP
,
SS_BACKUP_LEN
)
;
backup
[
info
->
base
.
len
+
SS_SYSTEM_LEN
+
SS_BACKUP_LEN
]
=
'/'
;
memcpy
(
backup
+
info
->
base
.
len
+
SS_SYSTEM_LEN
+
SS_BACKUP_LEN
+
1
,
info
->
treename
,
treenamelen
)
;
backlen
=
info
->
base
.
len
+
SS_SYSTEM_LEN
+
SS_BACKUP_LEN
+
1
+
treenamelen
;
backup
[
backlen
]
=
0
;
if
(
type
&&
what
)
{
char
psrc
[
SS_DB_LEN
+
SS_SRC_LEN
+
1
]
;
if
(
where
==
SS_RESOLVE_LIVE
)
{
if
(
!
stralloc_catb
(
&
tmp
,
info
->
live
.
s
,
info
->
live
.
len
-
1
)
||
!
stralloc_cats
(
&
tmp
,
SS_RESOLVE
)
||
!
stralloc_cats
(
&
tmp
,
"/"
)
||
!
stralloc_cats
(
&
tmp
,
ownerstr
)
||
!
stralloc_cats
(
&
tmp
,
"/"
)
||
!
stralloc_cats
(
&
tmp
,
info
->
treename
.
s
))
goto
err
;
}
else
if
(
where
==
SS_RESOLVE_SRC
)
{
if
(
!
stralloc_cats
(
&
tmp
,
info
->
tree
.
s
)
||
!
stralloc_cats
(
&
tmp
,
SS_SVDIRS
))
goto
err
;
}
else
if
(
where
==
SS_RESOLVE_BACK
)
{
if
(
!
stralloc_cats
(
&
tmp
,
info
->
base
.
s
)
||
!
stralloc_cats
(
&
tmp
,
SS_SYSTEM
)
||
!
stralloc_cats
(
&
tmp
,
SS_BACKUP
)
||
!
stralloc_cats
(
&
tmp
,
"/"
)
||
!
stralloc_cats
(
&
tmp
,
info
->
treename
.
s
))
goto
err
;
}
if
(
type
&&
where
)
{
if
(
type
==
CLASSIC
)
{
memcpy
(
psrc
,
SS_SVC
,
SS_SVC_LEN
)
;
psrclen
=
SS_SVC_LEN
;
}
else
{
memcpy
(
psrc
,
SS_DB
,
SS_DB_LEN
)
;
//memcpy(psrc + SS_DB_LEN, SS_SRC, SS_SRC_LEN) ;
//psrclen = SS_DB_LEN + SS_SRC_LEN ;
psrclen
=
SS_DB_LEN
;
if
(
!
stralloc_cats
(
&
tmp
,
SS_SVC
))
goto
err
;
}
memcpy
(
source
+
sourcelen
,
psrc
,
psrclen
)
;
source
[
sourcelen
+
psrclen
]
=
0
;
memcpy
(
backup
+
backlen
,
psrc
,
psrclen
)
;
backup
[
backlen
+
psrclen
]
=
0
;
else
if
(
!
stralloc_cats
(
&
tmp
,
SS_DB
))
goto
err
;
}
if
(
!
stralloc_0
(
&
tmp
)
||
!
stralloc_obreplace
(
sa
,
tmp
.
s
))
goto
err
;
if
(
!
what
)
r
=
resolve
;
if
(
what
==
1
)
r
=
source
;
if
(
what
>
1
)
r
=
backup
;
return
stralloc_obreplace
(
sa
,
r
)
;
stralloc_free
(
&
tmp
)
;
return
1
;
err:
stralloc_free
(
&
tmp
)
;
return
0
;
}
int
resolve_src
(
genalloc
*
ga
,
stralloc
*
sasrc
,
char
const
*
name
,
char
const
*
src
,
unsigned
int
*
found
)
int
ss_
resolve_src
(
genalloc
*
ga
,
stralloc
*
sasrc
,
char
const
*
name
,
char
const
*
src
,
unsigned
int
*
found
)
{
int
fdsrc
,
obr
,
insta
;
...
...
@@ -393,7 +210,7 @@ int resolve_src(genalloc *ga, stralloc *sasrc, char const *name, char const *src
if
(
!
stralloc_cats
(
&
subdir
,
d
->
d_name
))
goto
errdir
;
if
(
!
stralloc_0
(
&
subdir
))
goto
errdir
;
*
found
=
2
;
if
(
!
resolve_src
(
ga
,
sasrc
,
name
,
subdir
.
s
,
found
))
goto
errdir
;
if
(
!
ss_
resolve_src
(
ga
,
sasrc
,
name
,
subdir
.
s
,
found
))
goto
errdir
;
}
obr
=
0
;
insta
=
0
;
...
...
@@ -469,3 +286,529 @@ int resolve_src(genalloc *ga, stralloc *sasrc, char const *name, char const *src
stralloc_free
(
&
sainsta
)
;
return
0
;
}
int
ss_resolve_add_uint32
(
stralloc
*
sa
,
uint32_t
data
)
{
char
pack
[
4
]
;
uint32_pack_big
(
pack
,
data
)
;
return
stralloc_catb
(
sa
,
pack
,
4
)
;
}
int
ss_resolve_add_uint64
(
stralloc
*
sa
,
uint64_t
data
)
{
char
pack
[
8
]
;
uint64_pack_big
(
pack
,
data
)
;
return
stralloc_catb
(
sa
,
pack
,
8
)
;
}
uint32_t
ss_resolve_add_string
(
ss_resolve_t
*
res
,
char
const
*
data
)
{
uint32_t
baselen
=
res
->
sa
.
len
;
if
(
!
data
)
{
if
(
!
stralloc_catb
(
&
res
->
sa
,
""
,
1
))
strerr_diefu1sys
(
111
,
"stralloc:resolve_add_string"
)
;
return
baselen
;
}
size_t
datalen
=
strlen
(
data
)
;
if
(
!
stralloc_catb
(
&
res
->
sa
,
data
,
datalen
+
1
))
strerr_diefu1sys
(
111
,
"stralloc:resolve_add_string"
)
;
return
baselen
;
}
int
ss_resolve_pack
(
stralloc
*
sa
,
ss_resolve_t
*
res
)
{
if
(
!
ss_resolve_add_uint32
(
sa
,
res
->
sa
.
len
))
return
0
;
if
(
!
stralloc_catb
(
sa
,
res
->
sa
.
s
,
res
->
sa
.
len
))
return
0
;
if
(
!
ss_resolve_add_uint32
(
sa
,
res
->
name
)
||
!
ss_resolve_add_uint32
(
sa
,
res
->
description
)
||
!
ss_resolve_add_uint32
(
sa
,
res
->
logger
)
||
!
ss_resolve_add_uint32
(
sa
,
res
->
logreal
)
||
!
ss_resolve_add_uint32
(
sa
,
res
->
dstlog
)
||
!
ss_resolve_add_uint32
(
sa
,
res
->
deps
)
||
!
ss_resolve_add_uint32
(
sa
,
res
->
src
)
||
!
ss_resolve_add_uint32
(
sa
,
res
->
runat
)
||
!
ss_resolve_add_uint32
(
sa
,
res
->
tree
)
||
!
ss_resolve_add_uint32
(
sa
,
res
->
treename
)
||
!
ss_resolve_add_uint32
(
sa
,
res
->
exec_run
)
||
!
ss_resolve_add_uint32
(
sa
,
res
->
exec_finish
)
||
!
ss_resolve_add_uint32
(
sa
,
res
->
type
)
||
!
ss_resolve_add_uint32
(
sa
,
res
->
ndeps
)
||
!
ss_resolve_add_uint32
(
sa
,
res
->
reload
)
||
!
ss_resolve_add_uint32
(
sa
,
res
->
disen
)
||
!
ss_resolve_add_uint32
(
sa
,
res
->
init
)
||
!
ss_resolve_add_uint32
(
sa
,
res
->
unsupervise
)
||
!
ss_resolve_add_uint32
(
sa
,
res
->
down
)
||
!
ss_resolve_add_uint32
(
sa
,
res
->
run
)
||
!
ss_resolve_add_uint64
(
sa
,
res
->
pid
))
return
0
;
return
1
;
}
int
ss_resolve_rmfile
(
ss_resolve_t
*
res
,
char
const
*
src
,
char
const
*
name
)
{
size_t
srclen
=
strlen
(
src
)
;
size_t
namelen
=
strlen
(
name
)
;
size_t
newlen
=
srclen
+
SS_RESOLVE_LEN
+
1
;
char
tmp
[
srclen
+
SS_RESOLVE_LEN
+
1
+
namelen
+
1
]
;
memcpy
(
tmp
,
src
,
srclen
)
;
memcpy
(
tmp
+
srclen
,
SS_RESOLVE
,
SS_RESOLVE_LEN
)
;
tmp
[
srclen
+
SS_RESOLVE_LEN
]
=
'/'
;
memcpy
(
tmp
+
srclen
+
SS_RESOLVE_LEN
+
1
,
name
,
namelen
)
;
tmp
[
srclen
+
SS_RESOLVE_LEN
+
1
+
namelen
]
=
0
;
if
(
unlink
(
tmp
)
<
0
)
return
0
;
if
(
res
->
logger
)
{
size_t
loglen
=
strlen
(
res
->
sa
.
s
+
res
->
logger
)
;
memcpy
(
tmp
+
newlen
,
res
->
sa
.
s
+
res
->
logger
,
loglen
)
;
tmp
[
newlen
+
loglen
]
=
0
;
if
(
unlink
(
tmp
)
<
0
)
return
0
;
}
return
1
;
}
int
ss_resolve_write
(
ss_resolve_t
*
res
,
char
const
*
dst
,
char
const
*
name
)
{
stralloc
sa
=
STRALLOC_ZERO
;
size_t
dstlen
=
strlen
(
dst
)
;
size_t
namelen
=
strlen
(
name
)
;
char
tmp
[
dstlen
+
SS_RESOLVE_LEN
+
1
+
namelen
+
1
]
;
memcpy
(
tmp
,
dst
,
dstlen
)
;
memcpy
(
tmp
+
dstlen
,
SS_RESOLVE
,
SS_RESOLVE_LEN
)
;
tmp
[
dstlen
+
SS_RESOLVE_LEN
]
=
'/'
;
memcpy
(
tmp
+
dstlen
+
SS_RESOLVE_LEN
+
1
,
name
,
namelen
)
;
tmp
[
dstlen
+
SS_RESOLVE_LEN
+
1
+
namelen
]
=
0
;
if
(
!
ss_resolve_pack
(
&
sa
,
res
))
goto
err
;
if
(
dir_search
(
tmp
,
sa
.
s
,
S_IFREG
))
{
if
(
!
ss_resolve_rmfile
(
res
,
dst
,
name
))
goto
err
;
}
if
(
!
openwritenclose_unsafe
(
tmp
,
sa
.
s
,
sa
.
len
))
goto
err
;
stralloc_free
(
&
sa
)
;
return
1
;
err:
stralloc_free
(
&
sa
)
;
return
0
;
}
int
ss_resolve_read
(
ss_resolve_t
*
res
,
char
const
*
src
,
char
const
*
name
)
{
stralloc
sa
=
STRALLOC_ZERO
;
size_t
srclen
=
strlen
(
src
)
;
size_t
namelen
=
strlen
(
name
)
;
char
tmp
[
srclen
+
SS_RESOLVE_LEN
+
1
+
namelen
+
1
]
;
memcpy
(
tmp
,
src
,
srclen
)
;
memcpy
(
tmp
+
srclen
,
SS_RESOLVE
,
SS_RESOLVE_LEN
)
;
tmp
[
srclen
+
SS_RESOLVE_LEN
]
=
'/'
;
memcpy
(
tmp
+
srclen
+
SS_RESOLVE_LEN
+
1
,
name
,
namelen
)
;
tmp
[
srclen
+
SS_RESOLVE_LEN
+
1
+
namelen
]
=
0
;
size_t
global
=
0
;
size_t
filen
=
file_get_size
(
tmp
)
;
int
r
=
openreadfileclose
(
tmp
,
&
sa
,
filen
)
;
if
(
r
<
0
)
goto
end
;
uint32_unpack_big
(
sa
.
s
,
&
res
->
salen
)
;
global
+=
4
;
stralloc_copyb
(
&
res
->
sa
,
sa
.
s
+
global
,
res
->
salen
)
;
global
+=
res
->
sa
.
len
;
uint32_unpack_big
(
sa
.
s
+
global
,
&
res
->
name
)
;
global
+=
4
;
uint32_unpack_big
(
sa
.
s
+
global
,
&
res
->
description
)
;
global
+=
4
;
uint32_unpack_big
(
sa
.
s
+
global
,
&
res
->
logger
)
;
global
+=
4
;
uint32_unpack_big
(
sa
.
s
+
global
,
&
res
->
logreal
)
;
global
+=
4
;
uint32_unpack_big
(
sa
.
s
+
global
,
&
res
->
dstlog
)
;
global
+=
4
;
uint32_unpack_big
(
sa
.
s
+
global
,
&
res
->
deps
)
;
global
+=
4
;
uint32_unpack_big
(
sa
.
s
+
global
,
&
res
->
src
)
;
global
+=
4
;
uint32_unpack_big
(
sa
.
s
+
global
,
&
res
->
runat
)
;
global
+=
4
;
uint32_unpack_big
(
sa
.
s
+
global
,
&
res
->
tree
)
;
global
+=
4
;
uint32_unpack_big
(
sa
.
s
+
global
,
&
res
->
treename
)
;
global
+=
4
;
uint32_unpack_big
(
sa
.
s
+
global
,
&
res
->
exec_run
)
;
global
+=
4
;
uint32_unpack_big
(
sa
.
s
+
global
,
&
res
->
exec_finish
)
;
global
+=
4
;
uint32_unpack_big
(
sa
.
s
+
global
,
&
res
->
type
)
;
global
+=
4
;
uint32_unpack_big
(
sa
.
s
+
global
,
&
res
->
ndeps
)
;
global
+=
4
;
uint32_unpack_big
(
sa
.
s
+
global
,
&
res
->
reload
)
;
global
+=
4
;
uint32_unpack_big
(
sa
.
s
+
global
,
&
res
->
disen
)
;
global
+=
4
;
uint32_unpack_big
(
sa
.
s
+
global
,
&
res
->
init
)
;
global
+=
4
;
uint32_unpack_big
(
sa
.
s
+
global
,
&
res
->
unsupervise
)
;
global
+=
4
;
uint32_unpack_big
(
sa
.
s
+
global
,
&
res
->
down
)
;
global
+=
4
;
uint32_unpack_big
(
sa
.
s
+
global
,
&
res
->
run
)
;
global
+=
4
;
uint64_unpack_big
(
sa
.
s
+
global
,
&
res
->
pid
)
;
/*char *string = res->sa.s ;
printf("res->name::%s\n",string + res->name) ;
printf("res->description::%s\n",string + res->description) ;
printf("res->logger::%s\n",string +res->logger) ;
printf("res->logreal::%s\n",string +res->logreal) ;
printf("res->dstlog::%s\n",string +res->dstlog) ;
printf("res->deps::%s\n",string +res->deps) ;
printf("res->src::%s\n",string + res->src) ;
printf("res->runat::%s\n",string +res->runat) ;
printf("res->tree::%s\n",string +res->tree) ;
printf("res->treename::%s\n",string +res->treename) ;
printf("res->exec_run::%s\n",string +res->exec_run) ;
printf("res->exec_finish::%s\n",string +res->exec_finish) ;
printf("res->ndeps::%i\n",res->ndeps) ;
printf("res->type::%i\n",res->type) ;
printf("res->reload::%i\n",res->reload) ;
printf("res->disen::%i\n",res->disen) ;
printf("res->init::%i\n",res->init) ;
printf("res->down::%i\n",res->down) ;
printf("res->unsupervise::%i\n",res->unsupervise) ;
printf("res->run::%i\n",res->run) ;
printf("res->run::%i\n",res->pid) ;*/
stralloc_0
(
&
res
->
sa
)
;
stralloc_free
(
&
sa
)
;
return
1
;
end
:
stralloc_free
(
&
sa
)
;
return
0
;
}
void
ss_resolve_free
(
ss_resolve_t
*
res
)
{
stralloc_free
(
&
res
->
sa
)
;
}
void
ss_resolve_init
(
ss_resolve_t
*
res
)
{
res
->
sa
.
len
=
0
;
ss_resolve_add_string
(
res
,
""
)
;
}
int
ss_resolve_check
(
ssexec_t
*
info
,
char
const
*
name
,
unsigned
int
where
)
{
int
r
;
stralloc
tmp
=
STRALLOC_ZERO
;
if
(
!
ss_resolve_pointo
(
&
tmp
,
info
,
SS_NOTYPE
,
where
))
goto
err
;
tmp
.
len
--
;
if
(
!
stralloc_cats
(
&
tmp
,
SS_RESOLVE
)
||
!
stralloc_0
(
&
tmp
))
goto
err
;
r
=
dir_search
(
tmp
.
s
,
name
,
S_IFREG
)
;
stralloc_free
(
&
tmp
)
;
if
(
!
r
||
r
<
0
)
return
0
;
else
return
1
;
err:
stralloc_free
(
&
tmp
)
;
return
0
;
}
int
ss_resolve_setlognwrite
(
ss_resolve_t
*
sv
,
char
const
*
dst
)
{
int
r
;
s6_svstatus_t
status
=
S6_SVSTATUS_ZERO
;
ss_resolve_t
res
=
RESOLVE_ZERO
;
ss_resolve_init
(
&
res
)
;
char
*
string
=
sv
->
sa
.
s
;
size_t
svlen
=
strlen
(
string
+
sv
->
name
)
;
char
descrip
[
svlen
+
7
]
;
memcpy
(
descrip
,
string
+
sv
->
name
,
svlen
)
;
memcpy
(
descrip
+
svlen
,
" logger"
,
7
)
;
descrip
[
svlen
+
7
]
=
0
;
size_t
runlen
=
strlen
(
string
+
sv
->
runat
)
;
char
live
[
runlen
+
4
+
1
]
;
memcpy
(
live
,
string
+
sv
->
runat
,
runlen
)
;
if
(
sv
->
type
>=
BUNDLE
)
{
memcpy
(
live
+
runlen
,
"-log"
,
4
)
;
}
else
memcpy
(
live
+
runlen
,
"/log"
,
4
)
;
live
[
runlen
+
4
]
=
0
;
res
.
name
=
ss_resolve_add_string
(
&
res
,
string
+
sv
->
logger
)
;
res
.
description
=
ss_resolve_add_string
(
&
res
,
descrip
)
;
res
.
logreal
=
ss_resolve_add_string
(
&
res
,
string
+
sv
->
logreal
)
;
res
.
dstlog
=
ss_resolve_add_string
(
&
res
,
string
+
sv
->
dstlog
)
;
res
.
deps
=
ss_resolve_add_string
(
&
res
,
string
+
sv
->
name
)
;
res
.
tree
=
ss_resolve_add_string
(
&
res
,
string
+
sv
->
tree
)
;
res
.
treename
=
ss_resolve_add_string
(
&
res
,
string
+
sv
->
treename
)
;
res
.
ndeps
=
1
;
res
.
type
=
sv
->
type
;
res
.
reload
=
sv
->
reload
;
res
.
disen
=
sv
->
disen
;
res
.
down
=
sv
->
down
;
res
.
runat
=
ss_resolve_add_string
(
&
res
,
live
)
;
res
.
init
=
sv
->
init
;
res
.
reload
=
sv
->
reload
;
r
=
s6_svc_ok
(
res
.
sa
.
s
+
res
.
runat
)
;
if
(
r
<
0
)
{
strerr_warnwu2sys
(
"check "
,
res
.
sa
.
s
+
res
.
runat
)
;
goto
err
;
}
if
(
!
r
)
{
res
.
pid
=
0
;
res
.
run
=
0
;
}
else
{
res
.
run
=
1
;
if
(
!
s6_svstatus_read
(
res
.
sa
.
s
+
res
.
runat
,
&
status
))
{
strerr_warnwu2sys
(
"read status of: "
,
res
.
sa
.
s
+
res
.
name
)
;
goto
err
;
}
res
.
pid
=
status
.
pid
;
}
if
(
!
ss_resolve_write
(
&
res
,
dst
,
res
.
sa
.
s
+
res
.
name
))
{
strerr_warnwu5sys
(
"write resolve file: "
,
dst
,
SS_RESOLVE
,
"/"
,
res
.
sa
.
s
+
res
.
name
)
;
goto
err
;
}
ss_resolve_free
(
&
res
)
;
return
1
;
err:
ss_resolve_free
(
&
res
)
;
return
0
;
}
int
ss_resolve_setnwrite
(
ss_resolve_t
*
res
,
sv_alltype
*
services
,
ssexec_t
*
info
,
char
const
*
dst
)
{
int
r
;
char
*
name
=
keep
.
s
+
services
->
cname
.
name
;
size_t
namelen
=
strlen
(
name
)
;
char
logname
[
namelen
+
SS_LOG_SUFFIX_LEN
+
1
]
;
char
logreal
[
namelen
+
SS_LOG_SUFFIX_LEN
+
1
]
;
char
stmp
[
info
->
livetree
.
len
+
1
+
info
->
treename
.
len
+
SS_SVDIRS_LEN
+
1
+
namelen
+
SS_LOG_SUFFIX_LEN
+
1
]
;
s6_svstatus_t
status
=
S6_SVSTATUS_ZERO
;
stralloc
destlog
=
STRALLOC_ZERO
;
stralloc
namedeps
=
STRALLOC_ZERO
;
stralloc
final
=
STRALLOC_ZERO
;
res
->
name
=
ss_resolve_add_string
(
res
,
name
)
;
res
->
description
=
ss_resolve_add_string
(
res
,
keep
.
s
+
services
->
cname
.
description
)
;
res
->
tree
=
ss_resolve_add_string
(
res
,
info
->
tree
.
s
)
;
res
->
treename
=
ss_resolve_add_string
(
res
,
info
->
treename
.
s
)
;
res
->
src
=
ss_resolve_add_string
(
res
,
keep
.
s
+
services
->
src
)
;
if
(
services
->
type
.
classic_longrun
.
run
.
exec
)
res
->
exec_run
=
ss_resolve_add_string
(
res
,
keep
.
s
+
services
->
type
.
classic_longrun
.
run
.
exec
)
;
if
(
services
->
type
.
classic_longrun
.
finish
.
exec
)
res
->
exec_finish
=
ss_resolve_add_string
(
res
,
keep
.
s
+
services
->
type
.
classic_longrun
.
finish
.
exec
)
;
res
->
type
=
services
->
cname
.
itype
;
res
->
ndeps
=
services
->
cname
.
nga
;
res
->
reload
=
1
;
res
->
disen
=
1
;
if
(
services
->
flags
[
0
])
res
->
down
=
1
;
if
(
res
->
type
==
CLASSIC
)
{
memcpy
(
stmp
,
info
->
scandir
.
s
,
info
->
scandir
.
len
)
;
stmp
[
info
->
scandir
.
len
]
=
'/'
;
memcpy
(
stmp
+
info
->
scandir
.
len
+
1
,
name
,
namelen
)
;
stmp
[
info
->
scandir
.
len
+
1
+
namelen
]
=
0
;
res
->
runat
=
ss_resolve_add_string
(
res
,
stmp
)
;
r
=
s6_svc_ok
(
res
->
sa
.
s
+
res
->
runat
)
;
if
(
r
<
0
)
{
strerr_warnwu2sys
(
"check "
,
res
->
sa
.
s
+
res
->
runat
)
;
goto
err
;
}
if
(
!
r
)
{
res
->
init
=
1
;
res
->
reload
=
0
;
res
->
pid
=
0
;
res
->
run
=
0
;
}
else
{
res
->
init
=
0
;
res
->
run
=
1
;
res
->
reload
=
1
;
if
(
!
s6_svstatus_read
(
res
->
sa
.
s
+
res
->
runat
,
&
status
))
{
strerr_warnwu2sys
(
"read status of: "
,
res
->
sa
.
s
+
res
->
name
)
;
goto
err
;
}
res
->
pid
=
status
.
pid
;
}
}
else
if
(
res
->
type
>=
BUNDLE
)
{
memcpy
(
stmp
,
info
->
livetree
.
s
,
info
->
livetree
.
len
)
;
stmp
[
info
->
livetree
.
len
]
=
'/'
;
memcpy
(
stmp
+
info
->
livetree
.
len
+
1
,
info
->
treename
.
s
,
info
->
treename
.
len
)
;
memcpy
(
stmp
+
info
->
livetree
.
len
+
1
+
info
->
treename
.
len
,
SS_SVDIRS
,
SS_SVDIRS_LEN
)
;
stmp
[
info
->
livetree
.
len
+
1
+
info
->
treename
.
len
+
SS_SVDIRS_LEN
]
=
'/'
;
memcpy
(
stmp
+
info
->
livetree
.
len
+
1
+
info
->
treename
.
len
+
SS_SVDIRS_LEN
+
1
,
name
,
namelen
)
;
stmp
[
info
->
livetree
.
len
+
1
+
info
->
treename
.
len
+
SS_SVDIRS_LEN
+
1
+
namelen
]
=
0
;
res
->
runat
=
ss_resolve_add_string
(
res
,
stmp
)
;
r
=
s6_svc_ok
(
res
->
sa
.
s
+
res
->
runat
)
;
if
(
r
<
0
)
{
strerr_warnwu2sys
(
"check "
,
res
->
sa
.
s
+
res
->
runat
)
;
goto
err
;
}
if
(
!
r
)
{
res
->
init
=
1
;
res
->
reload
=
0
;
res
->
pid
=
0
;
res
->
run
=
0
;
}
else
{
res
->
init
=
0
;
res
->
run
=
1
;
res
->
reload
=
1
;
if
(
!
s6_svstatus_read
(
res
->
sa
.
s
+
res
->
runat
,
&
status
))
{
strerr_warnwu2sys
(
"read status of: "
,
res
->
sa
.
s
+
res
->
name
)
;
goto
err
;
}
res
->
pid
=
status
.
pid
;
}
}
if
(
res
->
ndeps
)
{
for
(
unsigned
int
i
=
0
;
i
<
res
->
ndeps
;
i
++
)
{
if
(
!
stralloc_obreplace
(
&
namedeps
,
deps
.
s
+
genalloc_s
(
unsigned
int
,
&
gadeps
)[
services
->
cname
.
idga
+
i
]))
goto
err
;
r
=
insta_check
(
namedeps
.
s
)
;
if
(
!
r
)
{
strerr_warnw2x
(
" invalid instance name: "
,
namedeps
.
s
)
;
goto
err
;
}
if
(
r
>
0
)
{
if
(
!
insta_splitname
(
&
namedeps
,
namedeps
.
s
,
r
,
1
))
{
strerr_warnwu2x
(
"split copy name of instance: "
,
namedeps
.
s
)
;
goto
err
;
}
}
namedeps
.
len
--
;
if
(
!
stralloc_catb
(
&
final
,
namedeps
.
s
,
namedeps
.
len
+
1
))
{
warnstralloc
(
"ss_resolve_fromscratch"
)
;
goto
err
;
}
}
if
(
!
stralloc_0
(
&
final
)){
warnstralloc
(
"ss_resolve_fromscratch"
)
;
goto
err
;
}
res
->
deps
=
ss_resolve_add_string
(
res
,
final
.
s
)
;
}
if
(
services
->
opts
[
0
])
{
memcpy
(
logname
,
name
,
namelen
)
;
memcpy
(
logname
+
namelen
,
SS_LOG_SUFFIX
,
SS_LOG_SUFFIX_LEN
)
;
logname
[
namelen
+
SS_LOG_SUFFIX_LEN
]
=
0
;
memcpy
(
logreal
,
name
,
namelen
)
;
if
(
res
->
type
==
CLASSIC
)
{
memcpy
(
logreal
+
namelen
,
"/log"
,
SS_LOG_SUFFIX_LEN
)
;
}
else
memcpy
(
logreal
+
namelen
,
"-log"
,
SS_LOG_SUFFIX_LEN
)
;
logreal
[
namelen
+
SS_LOG_SUFFIX_LEN
]
=
0
;
res
->
logger
=
ss_resolve_add_string
(
res
,
logname
)
;
res
->
logreal
=
ss_resolve_add_string
(
res
,
logreal
)
;
if
(
res
->
type
==
CLASSIC
)
{
res
->
ndeps
=
1
;
}
// destination of the logger
if
(
!
services
->
type
.
classic_longrun
.
log
.
destination
)
{
if
(
info
->
owner
>
0
)
{
if
(
!
stralloc_cats
(
&
destlog
,
get_userhome
(
info
->
owner
)))
retstralloc
(
0
,
"ss_resolve_fromscratch"
)
;
if
(
!
stralloc_cats
(
&
destlog
,
"/"
))
retstralloc
(
0
,
"ss_resolve_fromscratch"
)
;
if
(
!
stralloc_cats
(
&
destlog
,
SS_LOGGER_USERDIR
))
retstralloc
(
0
,
"ss_resolve_fromscratch"
)
;
if
(
!
stralloc_cats
(
&
destlog
,
name
))
retstralloc
(
0
,
"ss_resolve_fromscratch"
)
;
}
else
{
if
(
!
stralloc_cats
(
&
destlog
,
SS_LOGGER_SYSDIR
))
retstralloc
(
0
,
"ss_resolve_fromscratch"
)
;
if
(
!
stralloc_cats
(
&
destlog
,
name
))
retstralloc
(
0
,
"ss_resolve_fromscratch"
)
;
}
}
else
{
if
(
!
stralloc_cats
(
&
destlog
,
keep
.
s
+
services
->
type
.
classic_longrun
.
log
.
destination
))
retstralloc
(
0
,
"ss_resolve_fromscratch"
)
;
}
if
(
!
stralloc_0
(
&
destlog
))
retstralloc
(
0
,
"ss_resolve_fromscratch"
)
;
res
->
dstlog
=
ss_resolve_add_string
(
res
,
destlog
.
s
)
;
if
(
!
ss_resolve_setlognwrite
(
res
,
dst
))
goto
err
;
}
if
(
!
ss_resolve_write
(
res
,
dst
,
res
->
sa
.
s
+
res
->
name
))
{
strerr_warnwu5sys
(
"write resolve file: "
,
dst
,
SS_RESOLVE
,
"/"
,
res
->
sa
.
s
+
res
->
name
)
;
goto
err
;
}
stralloc_free
(
&
namedeps
)
;
stralloc_free
(
&
final
)
;
stralloc_free
(
&
destlog
)
;
return
1
;
err:
stralloc_free
(
&
namedeps
)
;
stralloc_free
(
&
final
)
;
stralloc_free
(
&
destlog
)
;
return
0
;
}
int
ss_resolve_addlogger
(
ssexec_t
*
info
,
genalloc
*
ga
)
{
stralloc
tmp
=
STRALLOC_ZERO
;
ss_resolve_t
res
=
RESOLVE_ZERO
;
genalloc
gatmp
=
GENALLOC_ZERO
;
if
(
!
ss_resolve_pointo
(
&
tmp
,
info
,
SS_NOTYPE
,
SS_RESOLVE_SRC
))
goto
err
;
for
(
unsigned
int
i
=
0
;
i
<
genalloc_len
(
ss_resolve_t
,
ga
)
;
i
++
)
{
res
=
ss_resolve_zero
;
char
*
string
=
genalloc_s
(
ss_resolve_t
,
ga
)[
i
].
sa
.
s
;
if
(
!
genalloc_append
(
ss_resolve_t
,
&
gatmp
,
&
genalloc_s
(
ss_resolve_t
,
ga
)[
i
]))
goto
err
;
/** logger finish last */
if
(
genalloc_s
(
ss_resolve_t
,
ga
)[
i
].
logger
)
{
if
(
!
ss_resolve_read
(
&
res
,
tmp
.
s
,
string
+
genalloc_s
(
ss_resolve_t
,
ga
)[
i
].
logger
))
goto
err
;
if
(
!
genalloc_append
(
ss_resolve_t
,
&
gatmp
,
&
res
))
goto
err
;
}
}
genalloc_copy
(
ss_resolve_t
,
ga
,
&
gatmp
)
;
genalloc_free
(
ss_resolve_t
,
&
gatmp
)
;
stralloc_free
(
&
tmp
)
;
return
1
;
err:
genalloc_free
(
ss_resolve_t
,
&
gatmp
)
;
stralloc_free
(
&
tmp
)
;
return
0
;
}
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