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
861aa0f7
Commit
861aa0f7
authored
6 years ago
by
Eric Vidal
Browse files
Options
Downloads
Patches
Plain Diff
read all signal receive,write resolve of service
parent
74f12eea
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/ssexec_svctl.c
+91
-50
91 additions, 50 deletions
src/lib66/ssexec_svctl.c
with
91 additions
and
50 deletions
src/lib66/ssexec_svctl.c
+
91
−
50
View file @
861aa0f7
...
...
@@ -83,6 +83,8 @@ int handle_signal_svc(ss_resolve_sig_t *sv_signal)
VERBO3
strerr_warnwu2sys
(
"read status of: "
,
sv
)
;
return
0
;
}
sv_signal
->
pid
=
status
.
pid
;
if
(
WIFSIGNALED
(
status
.
wstat
)
&&
!
WEXITSTATUS
(
status
.
wstat
)
&&
(
WTERMSIG
(
status
.
wstat
)
==
15
))
return
1
;
if
(
!
WIFSIGNALED
(
status
.
wstat
)
&&
!
WEXITSTATUS
(
status
.
wstat
))
return
1
;
else
return
0
;
...
...
@@ -158,48 +160,49 @@ static const uint8_t chtenum[128] =
* @Return 2 on fail
* @Return 3 for PERMANENT failure */
int
handle_case
(
char
c
,
ss_resolve_sig_t
*
sv_signal
)
int
handle_case
(
stralloc
*
sa
,
ss_resolve_sig_t
*
sv_signal
)
{
int
p
,
h
,
err
;
unsigned
int
state
;
unsigned
int
state
,
i
=
0
;
state
=
sv_signal
->
sig
;
err
=
2
;
p
=
chtenum
[(
unsigned
char
)
c
]
;
unsigned
char
action
=
actions
[
state
][
p
]
;
switch
(
action
)
for
(;
i
<
sa
->
len
;
i
++
)
{
case
GOTIT
:
h
=
handle_signal_svc
(
sv_signal
)
;
if
(
!
h
)
{
p
=
chtenum
[(
unsigned
char
)
sa
->
s
[
i
]]
;
unsigned
char
action
=
actions
[
state
][
p
]
;
switch
(
action
)
{
case
GOTIT
:
h
=
handle_signal_svc
(
sv_signal
)
;
if
(
!
h
)
{
err
=
1
;
break
;
}
err
=
0
;
return
err
;
case
WAIT
:
err
=
1
;
break
;
}
err
=
0
;
break
;
case
WAIT
:
err
=
1
;
break
;
case
DEAD
:
err
=
2
;
break
;
case
DONE
:
err
=
0
;
break
;
case
PERM
:
err
=
3
;
break
;
case
UKNOW
:
default:
VERBO3
strerr_warnw1x
(
"invalid state, make a bug report"
);
err
=
2
;
break
;
case
DEAD
:
err
=
2
;
return
err
;
case
DONE
:
err
=
0
;
return
err
;
case
PERM
:
err
=
3
;
return
err
;
default:
VERBO3
strerr_warnw1x
(
"invalid state, make a bug report"
);
err
=
2
;
return
err
;
}
}
return
err
;
}
...
...
@@ -237,6 +240,9 @@ static void announce(ss_resolve_sig_t *sv_signal)
int
svc_listen
(
genalloc
*
gasv
,
ftrigr_t
*
fifo
,
int
spfd
,
ss_resolve_sig_t
*
svc
)
{
int
r
;
stralloc
sa
=
STRALLOC_ZERO
;
iopause_fd
x
[
2
]
=
{
{
.
fd
=
ftrigr_fd
(
fifo
),
.
events
=
IOPAUSE_READ
}
,
{
.
fd
=
spfd
,
.
events
=
IOPAUSE_READ
,
.
revents
=
0
}
}
;
tain_t
t
;
...
...
@@ -247,21 +253,19 @@ int svc_listen(genalloc *gasv, ftrigr_t *fifo,int spfd,ss_resolve_sig_t *svc)
for
(;;)
{
char
receive
;
r
=
ftrigr_check
(
fifo
,
svc
->
ids
,
&
receive
)
;
r
=
ftrigr_checksa
(
fifo
,
svc
->
ids
,
&
sa
)
;
if
(
r
<
0
)
{
VERBO3
strerr_warnwu1sys
(
"ftrigr_check"
)
;
return
0
;
}
if
(
r
)
{
svc
->
state
=
handle_case
(
receive
,
svc
)
;
if
(
svc
->
state
<
0
)
return
0
;
if
(
!
svc
->
state
){
announce
(
svc
)
;
break
;
}
else
if
(
svc
->
state
>
2
){
announce
(
svc
)
;
break
;
}
svc
->
state
=
handle_case
(
&
sa
,
svc
)
;
if
(
!
svc
->
state
){
announce
(
svc
)
;
goto
end
;
}
else
if
(
svc
->
state
>=
2
){
announce
(
svc
)
;
goto
end
;
}
}
if
(
!
(
svc
->
ndeath
))
{
VERBO2
strerr_warnw2x
(
"number of try exceeded for: "
,
svc
->
res
.
sa
.
s
+
svc
->
res
.
runat
)
;
announce
(
svc
)
;
break
;
goto
end
;
}
r
=
iopause_g
(
x
,
2
,
&
t
)
;
...
...
@@ -277,8 +281,9 @@ int svc_listen(genalloc *gasv, ftrigr_t *fifo,int spfd,ss_resolve_sig_t *svc)
svc
->
ndeath
--
;
}
}
return
1
;
end:
stralloc_free
(
&
sa
)
;
return
svc
->
state
;
}
int
ssexec_svctl
(
int
argc
,
char
const
*
const
*
argv
,
char
const
*
const
*
envp
,
ssexec_t
*
info
)
...
...
@@ -289,7 +294,7 @@ int ssexec_svctl(int argc, char const *const *argv,char const *const *envp,ssexe
DEATHSV
=
10
;
tain_t
ttmain
;
int
e
,
isup
;
int
e
,
isup
,
ret
;
unsigned
int
death
,
tsv
;
int
SIGNAL
=
-
1
;
...
...
@@ -300,7 +305,7 @@ int ssexec_svctl(int argc, char const *const *argv,char const *const *envp,ssexe
ftrigr_t
fifo
=
FTRIGR_ZERO
;
s6_svstatus_t
status
=
S6_SVSTATUS_ZERO
;
tsv
=
death
=
0
;
tsv
=
death
=
ret
=
0
;
//PROG = "66-svctl" ;
{
...
...
@@ -316,10 +321,10 @@ int ssexec_svctl(int argc, char const *const *argv,char const *const *envp,ssexe
case
'n'
:
if
(
!
uint0_scan
(
l
.
arg
,
&
death
))
exitusage
(
usage_svctl
)
;
break
;
case
'u'
:
if
(
SIGNAL
>
0
)
exitusage
(
usage_svctl
)
;
SIGNAL
=
SIGUP
;
sig
=
"u"
;
break
;
case
'U'
:
if
(
SIGNAL
>
0
)
exitusage
(
usage_svctl
)
;
SIGNAL
=
SIGRUP
;
sig
=
"uwU"
;
break
;
case
'd'
:
if
(
SIGNAL
>
0
)
;
SIGNAL
=
SIGDOWN
;
sig
=
"d"
;
break
;
case
'D'
:
if
(
SIGNAL
>
0
)
;
SIGNAL
=
SIGRDOWN
;
sig
=
"dwD"
;
break
;
case
'r'
:
if
(
SIGNAL
>
0
)
;
SIGNAL
=
SIGR
;
sig
=
"r"
;
break
;
case
'R'
:
if
(
SIGNAL
>
0
)
;
SIGNAL
=
SIGRR
;
sig
=
"rwR"
;
break
;
case
'd'
:
if
(
SIGNAL
>
0
)
;
SIGNAL
=
SIGDOWN
;
sig
=
"d"
;
break
;
case
'D'
:
if
(
SIGNAL
>
0
)
;
SIGNAL
=
SIGRDOWN
;
sig
=
"dwD"
;
break
;
case
'X'
:
if
(
SIGNAL
>
0
)
;
SIGNAL
=
SIGX
;
sig
=
"xd"
;
break
;
case
'K'
:
if
(
SIGNAL
>
0
)
;
SIGNAL
=
SIGRDOWN
;
sig
=
"kd"
;
break
;
...
...
@@ -482,11 +487,47 @@ int ssexec_svctl(int argc, char const *const *argv,char const *const *envp,ssexe
for
(
unsigned
int
i
=
0
;
i
<
genalloc_len
(
ss_resolve_sig_t
,
&
gakeep
)
;
i
++
)
{
int
nret
=
0
;
ss_resolve_sig_t
*
sv
=
&
genalloc_s
(
ss_resolve_sig_t
,
&
gakeep
)[
i
]
;
if
(
!
svc_listen
(
&
gakeep
,
&
fifo
,
spfd
,
sv
))
strerr_diefu1x
(
111
,
"listen pipe"
)
;
char
*
name
=
sv
->
res
.
sa
.
s
+
sv
->
res
.
name
;
int
logname
=
get_rstrlen_until
(
name
,
SS_LOG_SUFFIX
)
;
nret
=
svc_listen
(
&
gakeep
,
&
fifo
,
spfd
,
sv
)
;
if
(
nret
>
1
)
ret
=
1
;
if
(
sv
->
sig
<=
3
)
{
if
(
nret
<=
1
)
ss_resolve_setflag
(
&
sv
->
res
,
SS_FLAGS_PID
,(
uint32_t
)
sv
->
pid
)
;
else
ss_resolve_setflag
(
&
sv
->
res
,
SS_FLAGS_PID
,
SS_FLAGS_FALSE
)
;
}
else
{
if
(
nret
<=
1
)
ss_resolve_setflag
(
&
sv
->
res
,
SS_FLAGS_PID
,
SS_FLAGS_FALSE
)
;
/** wtf, the system can kill a process?? should never happen */
else
strerr_diefu1x
(
111
,
"kill the process - this should never happen - please, make a bug report"
)
;
}
ss_resolve_setflag
(
&
sv
->
res
,
SS_FLAGS_RUN
,
SS_FLAGS_TRUE
)
;
ss_resolve_setflag
(
&
sv
->
res
,
SS_FLAGS_RELOAD
,
SS_FLAGS_FALSE
)
;
ss_resolve_setflag
(
&
sv
->
res
,
SS_FLAGS_INIT
,
SS_FLAGS_FALSE
)
;
ss_resolve_setflag
(
&
sv
->
res
,
SS_FLAGS_UNSUPERVISE
,
SS_FLAGS_FALSE
)
;
VERBO2
strerr_warni2x
(
"Write resolve file of: "
,
name
)
;
if
(
!
ss_resolve_write
(
&
sv
->
res
,
src
.
s
,
name
))
{
VERBO1
strerr_warnwu2sys
(
"write resolve file of: "
,
name
)
;
ret
=
1
;
}
if
(
sv
->
res
.
logger
)
{
VERBO2
strerr_warni2x
(
"Write logger resolve file of: "
,
name
)
;
if
(
!
ss_resolve_setlognwrite
(
&
sv
->
res
,
src
.
s
))
{
VERBO1
strerr_warnwu2sys
(
"write logger resolve file of: "
,
name
)
;
ret
=
1
;
}
}
ss_resolve_free
(
&
sv
->
res
)
;
}
tain_now_g
()
;
tain_addsec
(
&
ttmain
,
&
STAMP
,
2
)
;
...
...
@@ -496,7 +537,7 @@ int ssexec_svctl(int argc, char const *const *argv,char const *const *envp,ssexe
if
(
!
ftrigr_unsubscribe_g
(
&
fifo
,
sv
->
ids
,
&
ttmain
))
{
VERBO3
strerr_warnwu2sys
(
"unsubscribe to fifo of: "
,
sv
->
res
.
sa
.
s
+
sv
->
res
.
name
)
;
ret
urn
0
;
ret
=
1
;
}
}
...
...
@@ -508,7 +549,7 @@ int ssexec_svctl(int argc, char const *const *argv,char const *const *envp,ssexe
genalloc_deepfree
(
ss_resolve_sig_t
,
&
gakeep
,
ss_resolve_free
)
;
return
0
;
return
ret
;
}
...
...
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