summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2021-02-23 17:18:38 +0000
committerLaurent Bercot <ska-skaware@skarnet.org>2021-02-23 17:18:38 +0000
commit9358ede0e510fe25cf26fd6cc349395ac8bc8558 (patch)
treee3e7797efce9efc18747aa8eb34b52f701be0c1e /src
parent05024f93d3cd75c86a89ed1ae6fea0c2b1f1c187 (diff)
downloadmdevd-9358ede0e510fe25cf26fd6cc349395ac8bc8558.tar.gz
mdevd-9358ede0e510fe25cf26fd6cc349395ac8bc8558.tar.xz
mdevd-9358ede0e510fe25cf26fd6cc349395ac8bc8558.zip
Prepare for 1.0.4.0; new +,-,& directives for execlineb cmd interp
Diffstat (limited to 'src')
-rw-r--r--src/mdevd/PARSING.txt105
-rw-r--r--src/mdevd/mdevd.c86
2 files changed, 98 insertions, 93 deletions
diff --git a/src/mdevd/PARSING.txt b/src/mdevd/PARSING.txt
index 2d7fc61..8702d6a 100644
--- a/src/mdevd/PARSING.txt
+++ b/src/mdevd/PARSING.txt
@@ -30,106 +30,106 @@ ENDLINE	|								+
  Second pass: we need to fill the envmatches and scriptelems with values.
  The whole mdev.conf semantics must be encoded in here.
 
-class	|	`	a	b	c	d	e	f	g	h	i	j	k	l	m	n	o	p
-st\ev	|	\0	space	;	$	#	-	@	\n	,	=	>	:	*	!	0-7	8-9	other
+class	|	`	a	b	c	d	e	f	g	h	i	j	k	l	m	n	o	p	q	r
+st\ev	|	\0	space	;	$	#	-	@	\n	,	=	>	:	*	!	0-7	8-9	+	&	other
 
-START	|				$		cont	@	+	m|d			m|d	m|d	m|d	m|d	m|d	m|d
-00	|	END	START	X	ENV1	COMMENT	MINUS	TOMAJ	START	DEVNAME	X	X	DEVNAME	DEVNAME	DEVNAME	DEVNAME	DEVNAME	DEVNAME
+START	|				$		cont	@	+	m|d			m|d	m|d	m|d	m|d	m|d	m|d	m|d	m|d
+00	|	END	START	X	ENV1	COMMENT	MINUS	TOMAJ	START	DEVNAME	X	X	DEVNAME	DEVNAME	DEVNAME	DEVNAME	DEVNAME	DEVNAME	DEVNAME	DEVNAME
 
 COMMENT	|								+
-01	|	END	COMMENT	COMMENT	COMMENT	COMMENT	COMMENT	COMMENT	START	COMMENT	COMMENT	COMMENT	COMMENT	COMMENT	COMMENT	COMMENT	COMMENT	COMMENT
+01	|	END	COMMENT	COMMENT	COMMENT	COMMENT	COMMENT	COMMENT	START	COMMENT	COMMENT	COMMENT	COMMENT	COMMENT	COMMENT	COMMENT	COMMENT	COMMENT	COMMENT	COMMENT
 
-MINUS	|				$			@		m|d			m|d	m|d	m|d	m|d	m|d	m|d
-02	|	X	X	X	ENV1	X	X	TOMAJ	X	DEVNAME	X	X	DEVNAME	DEVNAME	DEVNAME	DEVNAME	DEVNAME	DEVNAME
+MINUS	|				$			@		m|d			m|d	m|d	m|d	m|d	m|d	m|d	m|d	m|d
+02	|	X	X	X	ENV1	X	X	TOMAJ	X	DEVNAME	X	X	DEVNAME	DEVNAME	DEVNAME	DEVNAME	DEVNAME	DEVNAME	DEVNAME	DEVNAME
 
-ENV1	|				m|v		m|v	m|v		m|v		m|v	m|v	m|v	m|v	m|v	m|v	m|v													
-03	|	X	X	X	INVAR1	X	INVAR1	INVAR1	X	INVAR1	X	INVAR1	INVAR1	INVAR1	INVAR1	INVAR1	INVAR1	INVAR1
+ENV1	|				m|v		m|v	m|v		m|v		m|v	m|v	m|v	m|v	m|v	m|v	m|v	m|v	m|v
+03	|	X	X	X	INVAR1	X	INVAR1	INVAR1	X	INVAR1	X	INVAR1	INVAR1	INVAR1	INVAR1	INVAR1	INVAR1	INVAR1	INVAR1	INVAR1
 
 INVAR1	|										z
-04	|	X	X	X	INVAR1	X	INVAR1	INVAR1	X	INVAR1	TOVAL1	INVAR1	INVAR1	INVAR1	INVAR1	INVAR1	INVAR1	INVAR1
+04	|	X	X	X	INVAR1	X	INVAR1	INVAR1	X	INVAR1	TOVAL1	INVAR1	INVAR1	INVAR1	INVAR1	INVAR1	INVAR1	INVAR1	INVAR1	INVAR1
 
-TOVAL1	|						m	m		m		m	m	m	m	m	m	m
-05	|	X	X	X	X	X	INVAL1	INVAL1	X	INVAL1	X	INVAL1	INVAL1	INVAL1	INVAL1	INVAL1	INVAL1	INVAL1
+TOVAL1	|						m	m		m		m	m	m	m	m	m	m	m	m
+05	|	X	X	X	X	X	INVAL1	INVAL1	X	INVAL1	X	INVAL1	INVAL1	INVAL1	INVAL1	INVAL1	INVAL1	INVAL1	INVAL1	INVAL1
 
 INVAL1	|		z|re$
-06	|	X	TOUSER	X	INVAL1	X	INVAL1	INVAL1	X	INVAL1	INVAL1	INVAL1	INVAL1	INVAL1	INVAL1	INVAL1	INVAL1	INVAL1
+06	|	X	TOUSER	X	INVAL1	X	INVAL1	INVAL1	X	INVAL1	INVAL1	INVAL1	INVAL1	INVAL1	INVAL1	INVAL1	INVAL1	INVAL1	INVAL1	INVAL1
 
 TOMAJ	|															m	m
-07	|	X	X	X	X	X	X	X	X	X	X	X	X	X	X	INMAJ	INMAJ	X
+07	|	X	X	X	X	X	X	X	X	X	X	X	X	X	X	INMAJ	INMAJ	X	X	X
 
 INMAJ	|									z|mj
-08	|	X	X	X	X	X	X	X	X	TOMIN	X	X	X	X	X	INMAJ	INMAJ	X
+08	|	X	X	X	X	X	X	X	X	TOMIN	X	X	X	X	X	INMAJ	INMAJ	X	X	X
 
 TOMIN	|															m	m
-09	|	X	X	X	X	X	X	X	X	X	X	X	X	X	X	INMIL	INMIL	X
+09	|	X	X	X	X	X	X	X	X	X	X	X	X	X	X	INMIL	INMIL	X	X	X
 
 INMIL	|		z|ml|h				z|ml
-0a	|	X	TOUSER	X	X	X	TOMIH	X	X	X	X	X	X	X	X	INMIL	INMIL	X
+0a	|	X	TOUSER	X	X	X	TOMIH	X	X	X	X	X	X	X	X	INMIL	INMIL	X	X	X
 
 TOMIH	|															m	m
-0b	|	X	X	X	X	X	X	X	X	X	X	X	X	X	X	INMIH	INMIH	X
+0b	|	X	X	X	X	X	X	X	X	X	X	X	X	X	X	INMIH	INMIH	X	X	X
 
 INMIH	|		z|mh
-0c	|	X	TOUSER	X	X	X	X	X	X	X	X	X	X	X	X	INMIH	INMIH	X
+0c	|	X	TOUSER	X	X	X	X	X	X	X	X	X	X	X	X	INMIH	INMIH	X	X	X
 
 DEVNAME	|		z|re								z|v
-0d	|	X	TOUSER	X	DEVNAME	X	DEVNAME	DEVNAME	X	DEVNAME	TORE	X	DEVNAME	DEVNAME	DEVNAME	DEVNAME	DEVNAME	DEVNAME
+0d	|	X	TOUSER	X	DEVNAME	X	DEVNAME	DEVNAME	X	DEVNAME	TORE	X	DEVNAME	DEVNAME	DEVNAME	DEVNAME	DEVNAME	DEVNAME	DEVNAME	DEVNAME
 
-TORE	|				m		m	m		m	m	m	m	m	m	m	m	m
-0e	|	X	X	X	INRE	X	INRE	INRE	X	INRE	INRE	INRE	INRE	INRE	INRE	INRE	INRE	INRE
+TORE	|				m		m	m		m	m	m	m	m	m	m	m	m	m	m
+0e	|	X	X	X	INRE	X	INRE	INRE	X	INRE	INRE	INRE	INRE	INRE	INRE	INRE	INRE	INRE	INRE	INRE
 
 INRE	|			z|re$
-0f	|	X	X	TODEV	INRE	X	INRE	INRE	X	INRE	INRE	INRE	INRE	INRE	INRE	INRE	INRE	INRE
+0f	|	X	X	TODEV	INRE	X	INRE	INRE	X	INRE	INRE	INRE	INRE	INRE	INRE	INRE	INRE	INRE	INRE	INRE
 
-TODEV	|				m		m	m		m			m	m	m	m	m	m
-10	|	X	X	X	LASTRE	X	DEVNAME	DEVNAME	X	DEVNAME	X	X	DEVNAME	DEVNAME	DEVNAME	DEVNAME	DEVNAME	DEVNAME
+TODEV	|				m		m	m		m			m	m	m	m	m	m	m	m
+10	|	X	X	X	LASTRE	X	DEVNAME	DEVNAME	X	DEVNAME	X	X	DEVNAME	DEVNAME	DEVNAME	DEVNAME	DEVNAME	DEVNAME	DEVNAME	DEVNAME
 
 LASTRE	|		z|re
-11	|	X	TOUSER	X	LASTRE	X	LASTRE	LASTRE	X	LASTRE	LASTRE	LASTRE	LASTRE	LASTRE	LASTRE	LASTRE	LASTRE	LASTRE
+11	|	X	TOUSER	X	LASTRE	X	LASTRE	LASTRE	X	LASTRE	LASTRE	LASTRE	LASTRE	LASTRE	LASTRE	LASTRE	LASTRE	LASTRE	LASTRE	LASTRE
 
-TOUSER	|						m									m	m	m
-12	|	X	TOUSER	X	X	X	INUSER	X	X	X	X	X	X	X	X	INUSER	INUSER	INUSER
+TOUSER	|						m									m	m	m	m	m
+12	|	X	TOUSER	X	X	X	INUSER	X	X	X	X	X	X	X	X	INUSER	INUSER	INUSER	INUSER	INUSER
 
 INUSER	|												z|u
-13	|	X	X	X	X	X	INUSER	X	X	X	X	X	TOGRP	X	X	INUSER	INUSER	INUSER
+13	|	X	X	X	X	X	INUSER	X	X	X	X	X	TOGRP	X	X	INUSER	INUSER	INUSER	INUSER	INUSER
 
-TOGRP	|						m									m	m	m
-14	|	X	X	X	X	X	INGRP	X	X	X	X	X	X	X	X	INGRP	INGRP	INGRP
+TOGRP	|						m									m	m	m	m	m
+14	|	X	X	X	X	X	INGRP	X	X	X	X	X	X	X	X	INGRP	INGRP	INGRP	INGRP	INGRP
 
 INGRP	|		z|g
-15	|	X	TOMODE	X	X	X	INGRP	X	X	X	X	X	X	X	X	INGRP	INGRP	INGRP
+15	|	X	TOMODE	X	X	X	INGRP	X	X	X	X	X	X	X	X	INGRP	INGRP	INGRP	INGRP	INGRP
 
 TOMODE	|															m
-16	|	X	TOMODE	X	X	X	X	X	X	X	X	X	X	X	X	INMODE	X	X
+16	|	X	TOMODE	X	X	X	X	X	X	X	X	X	X	X	X	INMODE	X	X	X	X
 
 INMODE	|		z|M						z|M|L|+
-17	|	X	TOPATH	X	X	X	X	X	START	X	X	X	X	X	X	INMODE	X	X
+17	|	X	TOPATH	X	X	X	X	X	START	X	X	X	X	X	X	INMODE	X	X	X	X
 
-TOPATH	|	L			r	L		a	L|+		=	>		r|a	!
-18	|	END	TOPATH	X	CMD	COMMENT	X	CMD	START	X	PATH	PATH	X	CMD	TOCMD	X	X	X
+TOPATH	|	L			r	L	r|E	a	L|+		=	>		r|a	!			a|E	r|a|E
+18	|	END	TOPATH	X	CMD	COMMENT	CMD	CMD	START	X	PATH	PATH	X	CMD	TOCMD	X	X	CMD	CMD	X
 
-PATH	|						p	p		p	p		p		p	p	p	p
-19	|	X	X	X	X	X	INPATH	INPATH	X	INPATH	INPATH	X	INPATH	X	INPATH	INPATH	INPATH	INPATH
+PATH	|						p	p		p	p		p		p	p	p	p	p	p
+19	|	X	X	X	X	X	INPATH	INPATH	X	INPATH	INPATH	X	INPATH	X	INPATH	INPATH	INPATH	INPATH	INPATH	INPATH
 
 INPATH	|	L	z			z|L			z|L|+
-1a	|	END	TOCMD	X	X	COMMENT	INPATH	INPATH	START	INPATH	INPATH	X	INPATH	X	INPATH	INPATH	INPATH	INPATH
+1a	|	END	TOCMD	X	X	COMMENT	INPATH	INPATH	START	INPATH	INPATH	X	INPATH	X	INPATH	INPATH	INPATH	INPATH	INPATH	INPATH
 
-TOCMD	|	L			r	L		a	L|+					r|a
-1b	|	END	TOCMD	X	CMD	COMMENT	X	CMD	START	X	X	X	X	CMD	X	X	X	X
+TOCMD	|	L			r	L	r|E	a	L|+					r|a				a|E	r|a|E
+1b	|	END	TOCMD	X	CMD	COMMENT	CMD	CMD	START	X	X	X	X	CMD	X	X	X	CMD	CMD	X
 
-CMD	|		c		c		c	c		c	c	c	c	c	c	c	c	c
-1c	|	X	INCMD	X	INCMD	X	INCMD	INCMD	X	INCMD	INCMD	INCMD	INCMD	INCMD	INCMD	INCMD	INCMD	INCMD
+CMD	|		c		c		c	c		c	c	c	c	c	c	c	c	c	c	c
+1c	|	X	INCMD	X	INCMD	X	INCMD	INCMD	X	INCMD	INCMD	INCMD	INCMD	INCMD	INCMD	INCMD	INCMD	INCMD	INCMD	INCMD
 
 INCMD	|	L							z|L|+
-1d	|	END	INCMD	INCMD	INCMD	INCMD	INCMD	INCMD	START	INCMD	INCMD	INCMD	INCMD	INCMD	INCMD	INCMD	INCMD	INCMD
+1d	|	END	INCMD	INCMD	INCMD	INCMD	INCMD	INCMD	START	INCMD	INCMD	INCMD	INCMD	INCMD	INCMD	INCMD	INCMD	INCMD	INCMD	INCMD
 
-st/ev	|	\0	space	;	$	#	-	@	\n	,	=	>	:	*	!	0-7	8-9	other
-class	|	`	a	b	c	d	e	f	g	h	i	j	k	l	m	n	o	p
+st/ev	|	\0	space	;	$	#	-	@	\n	,	=	>	:	*	!	0-7	8-9	+	&	other
+class	|	`	a	b	c	d	e	f	g	h	i	j	k	l	m	n	o	p	q	r	
 
 END = 1e, X = 1f
 
  States : 30+2. They fit exactly into 5 bits.
- Actions: 25.
+ Actions: 26.
 
  0x80000000	unused, to avoid having to explicitly write U everywhere
  0x40000000	$: prepare an envmatch, the scriptelem is DEVMATCH_NOTHING
@@ -149,21 +149,21 @@ END = 1e, X = 1f
  0x00010000	g: compute gid
  0x00008000	M: compute mode
  0x00004000	L: finalize/accept scriptelem, move to next one
- 0x00002000	r: elem->cmdtype |= ACTION_REMOVE
- 0x00001000	a: elem->cmdtype |= ACTION_ADD
+ 0x00002000	r: elem->cmdtype |= ACTION_REMOVE, interpreter=sh
+ 0x00001000	a: elem->cmdtype |= ACTION_ADD, interpreter=sh
  0x00000800	=: elem->movetype = MOVEINFO_MOVE
  0x00000400	>: elem->movetype = MOVEINFO_MOVEANDLINK
  0x00000200	!: elem->movetype = MOVEINFO_NOCREATE
  0x00000100	p: set movepath
  0x00000080	c: set command
  0x00000040	+: line++
- 0x00000020	unused.
+ 0x00000020	E: interpreter=execlineb
 
  Actions + states fit in a uint32_t.
 
  To debug script_secondpass: at the start of the loop, add
 
-    LOLDEBUG("state: %02x  char: %c  newstate: %02x  actions: %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s", state, s[pos] == '\n' ? '\\' : s[pos], what & 0x1f,
+    LOLDEBUG("state: %02x  char: %c  newstate: %02x  actions: %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s", state, s[pos] == '\n' ? '\\' : s[pos], what & 0x1f,
     what & 0x40000000 ? "$ " : "",
     what & 0x20000000 ? "@ " : "",
     what & 0x10000000 ? "d " : "",
@@ -188,5 +188,6 @@ END = 1e, X = 1f
     what & 0x00000200 ? "! " : "",
     what & 0x00000100 ? "p " : "",
     what & 0x00000080 ? "c " : "",
-    what & 0x00000040 ? "+ " : "") ;
+    what & 0x00000040 ? "+ " : "",
+    what & 0x00000020 ? "E " : "") ;
 
diff --git a/src/mdevd/mdevd.c b/src/mdevd/mdevd.c
index f77fa60..ba65fe8 100644
--- a/src/mdevd/mdevd.c
+++ b/src/mdevd/mdevd.c
@@ -107,6 +107,7 @@ struct scriptelem_s
   unsigned int movetype : 2 ;
   unsigned int cmdtype : 2 ;
   unsigned int flagcont : 1 ;
+  unsigned int flagexecline : 1 ;
   unsigned short envmatchs ;
 } ;
 
@@ -121,7 +122,9 @@ static scriptelem const scriptelem_catchall =
   .devmatchtype = DEVMATCH_CATCHALL,
   .movetype = MOVEINFO_NOTHING,
   .cmdtype = ACTION_NONE,
-  .flagcont = 0
+  .flagcont = 0,
+  .flagexecline = 0,
+  .envmatchs = 0
 } ;
 
 struct uevent_s
@@ -339,44 +342,44 @@ static inline void script_firstpass (char *s, unsigned short *scriptlen, unsigne
 
 static inline unsigned char secondpass_cclass (char c)
 {
-  static unsigned char const classtable[65] = "`ppppppppagppappppppppppppppppppampdcppppplpheppnnnnnnnnookbpijpf" ;
-  return (unsigned char)c < 65 ? classtable[(unsigned char)c] - '`' : 16 ;
+  static unsigned char const classtable[65] = "`rrrrrrrragrrarrrrrrrrrrrrrrrrrramrdcrqrrrlpherrnnnnnnnnookbrijrf" ;
+  return (unsigned char)c < 65 ? classtable[(unsigned char)c] - '`' : 18 ;
 }
 
 static inline void script_secondpass (char *s, scriptelem *script, struct envmatch_s *envmatch)
 {
-  static uint32_t const table[30][17] =
+  static uint32_t const table[30][19] =
   {
-    { 0x0000001e, 0x00000000, 0x0000001f, 0x40000003, 0x00000001, 0x08000002, 0x20000007, 0x00000040, 0x1400000d, 0x0000001f, 0x0000001f, 0x1400000d, 0x1400000d, 0x1400000d, 0x1400000d, 0x1400000d, 0x1400000d },
-    { 0x0000001e, 0x00000001, 0x00000001, 0x00000001, 0x00000001, 0x00000001, 0x00000001, 0x00000040, 0x00000001, 0x00000001, 0x00000001, 0x00000001, 0x00000001, 0x00000001, 0x00000001, 0x00000001, 0x00000001 },
-    { 0x0000001f, 0x0000001f, 0x0000001f, 0x40000003, 0x0000001f, 0x0000001f, 0x20000007, 0x0000001f, 0x1400000d, 0x0000001f, 0x0000001f, 0x1400000d, 0x1400000d, 0x1400000d, 0x1400000d, 0x1400000d, 0x1400000d },
-    { 0x0000001f, 0x0000001f, 0x0000001f, 0x04040004, 0x0000001f, 0x04040004, 0x04040004, 0x0000001f, 0x04040004, 0x0000001f, 0x04040004, 0x04040004, 0x04040004, 0x04040004, 0x04040004, 0x04040004, 0x04040004 },
-    { 0x0000001f, 0x0000001f, 0x0000001f, 0x00000004, 0x0000001f, 0x00000004, 0x00000004, 0x0000001f, 0x00000004, 0x02000005, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004 },
-    { 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x04000006, 0x04000006, 0x0000001f, 0x04000006, 0x0000001f, 0x04000006, 0x04000006, 0x04000006, 0x04000006, 0x04000006, 0x04000006, 0x04000006 },
-    { 0x0000001f, 0x03000012, 0x0000001f, 0x00000006, 0x0000001f, 0x00000006, 0x00000006, 0x0000001f, 0x00000006, 0x00000006, 0x00000006, 0x00000006, 0x00000006, 0x00000006, 0x00000006, 0x00000006, 0x00000006 },
-    { 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x04000008, 0x04000008, 0x0000001f },
-    { 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x02800009, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x00000008, 0x00000008, 0x0000001f },
-    { 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0400000a, 0x0400000a, 0x0000001f },
-    { 0x0000001f, 0x02600012, 0x0000001f, 0x0000001f, 0x0000001f, 0x0240000b, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000000a, 0x0000000a, 0x0000001f },
-    { 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0400000c, 0x0400000c, 0x0000001f },
-    { 0x0000001f, 0x02100012, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000000c, 0x0000000c, 0x0000001f },
-    { 0x0000001f, 0x02080012, 0x0000001f, 0x0000000d, 0x0000001f, 0x0000000d, 0x0000000d, 0x0000001f, 0x0000000d, 0x0204000e, 0x0000001f, 0x0000000d, 0x0000000d, 0x0000000d, 0x0000000d, 0x0000000d, 0x0000000d },
-    { 0x0000001f, 0x0000001f, 0x0000001f, 0x0400000f, 0x0000001f, 0x0400000f, 0x0400000f, 0x0000001f, 0x0400000f, 0x0400000f, 0x0400000f, 0x0400000f, 0x0400000f, 0x0400000f, 0x0400000f, 0x0400000f, 0x0400000f },
-    { 0x0000001f, 0x0000001f, 0x03000010, 0x0000000f, 0x0000001f, 0x0000000f, 0x0000000f, 0x0000001f, 0x0000000f, 0x0000000f, 0x0000000f, 0x0000000f, 0x0000000f, 0x0000000f, 0x0000000f, 0x0000000f, 0x0000000f },
-    { 0x0000001f, 0x0000001f, 0x0000001f, 0x04000011, 0x0000001f, 0x0400000d, 0x0400000d, 0x0000001f, 0x0400000d, 0x0000001f, 0x0000001f, 0x0400000d, 0x0400000d, 0x0400000d, 0x0400000d, 0x0400000d, 0x0400000d },
-    { 0x0000001f, 0x02080012, 0x0000001f, 0x00000011, 0x0000001f, 0x00000011, 0x00000011, 0x0000001f, 0x00000011, 0x00000011, 0x00000011, 0x00000011, 0x00000011, 0x00000011, 0x00000011, 0x00000011, 0x00000011 },
-    { 0x0000001f, 0x00000012, 0x0000001f, 0x0000001f, 0x0000001f, 0x04000013, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x04000013, 0x04000013, 0x04000013 },
-    { 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x00000013, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x02020014, 0x0000001f, 0x0000001f, 0x00000013, 0x00000013, 0x00000013 },
-    { 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x04000015, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x04000015, 0x04000015, 0x04000015 },
-    { 0x0000001f, 0x02010016, 0x0000001f, 0x0000001f, 0x0000001f, 0x00000015, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x00000015, 0x00000015, 0x00000015 },
-    { 0x0000001f, 0x00000016, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x04000017, 0x0000001f, 0x0000001f },
-    { 0x0000001f, 0x02008018, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0200c040, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x00000017, 0x0000001f, 0x0000001f },
-    { 0x0000401e, 0x00000018, 0x0000001f, 0x0000201c, 0x00004001, 0x0000001f, 0x0000101c, 0x00004040, 0x0000001f, 0x00000819, 0x00000419, 0x0000001f, 0x0000301c, 0x0000021b, 0x0000001f, 0x0000001f, 0x0000001f },
-    { 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000011a, 0x0000011a, 0x0000001f, 0x0000011a, 0x0000011a, 0x0000001f, 0x0000011a, 0x0000001f, 0x0000011a, 0x0000011a, 0x0000011a, 0x0000011a },
-    { 0x0000401e, 0x0200001b, 0x0000001f, 0x0000001f, 0x02004001, 0x0000001a, 0x0000001a, 0x02004040, 0x0000001a, 0x0000001a, 0x0000001f, 0x0000001a, 0x0000001f, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a },
-    { 0x0000401e, 0x0000001b, 0x0000001f, 0x0000201c, 0x00004001, 0x0000001f, 0x0000101c, 0x00004040, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000301c, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f },
-    { 0x0000001f, 0x0000009d, 0x0000001f, 0x0000009d, 0x0000001f, 0x0000009d, 0x0000009d, 0x0000001f, 0x0000009d, 0x0000009d, 0x0000009d, 0x0000009d, 0x0000009d, 0x0000009d, 0x0000009d, 0x0000009d, 0x0000009d },
-    { 0x0000401e, 0x0000001d, 0x0000001d, 0x0000001d, 0x0000001d, 0x0000001d, 0x0000001d, 0x02004040, 0x0000001d, 0x0000001d, 0x0000001d, 0x0000001d, 0x0000001d, 0x0000001d, 0x0000001d, 0x0000001d, 0x0000001d }
+    { 0x0000001e, 0x00000000, 0x0000001f, 0x40000003, 0x00000001, 0x08000002, 0x20000007, 0x00000040, 0x1400000d, 0x0000001f, 0x0000001f, 0x1400000d, 0x1400000d, 0x1400000d, 0x1400000d, 0x1400000d, 0x1400000d, 0x1400000d, 0x1400000d },
+    { 0x0000001e, 0x00000001, 0x00000001, 0x00000001, 0x00000001, 0x00000001, 0x00000001, 0x00000040, 0x00000001, 0x00000001, 0x00000001, 0x00000001, 0x00000001, 0x00000001, 0x00000001, 0x00000001, 0x00000001, 0x00000001, 0x00000001 },
+    { 0x0000001f, 0x0000001f, 0x0000001f, 0x40000003, 0x0000001f, 0x0000001f, 0x20000007, 0x0000001f, 0x1400000d, 0x0000001f, 0x0000001f, 0x1400000d, 0x1400000d, 0x1400000d, 0x1400000d, 0x1400000d, 0x1400000d, 0x1400000d, 0x1400000d },
+    { 0x0000001f, 0x0000001f, 0x0000001f, 0x04040004, 0x0000001f, 0x04040004, 0x04040004, 0x0000001f, 0x04040004, 0x0000001f, 0x04040004, 0x04040004, 0x04040004, 0x04040004, 0x04040004, 0x04040004, 0x04040004, 0x04040004, 0x04040004 },
+    { 0x0000001f, 0x0000001f, 0x0000001f, 0x00000004, 0x0000001f, 0x00000004, 0x00000004, 0x0000001f, 0x00000004, 0x02000005, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004 },
+    { 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x04000006, 0x04000006, 0x0000001f, 0x04000006, 0x0000001f, 0x04000006, 0x04000006, 0x04000006, 0x04000006, 0x04000006, 0x04000006, 0x04000006, 0x04000006, 0x04000006 },
+    { 0x0000001f, 0x03000012, 0x0000001f, 0x00000006, 0x0000001f, 0x00000006, 0x00000006, 0x0000001f, 0x00000006, 0x00000006, 0x00000006, 0x00000006, 0x00000006, 0x00000006, 0x00000006, 0x00000006, 0x00000006, 0x00000006, 0x00000006 },
+    { 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x04000008, 0x04000008, 0x0000001f, 0x0000001f, 0x0000001f },
+    { 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x02800009, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x00000008, 0x00000008, 0x0000001f, 0x0000001f, 0x0000001f },
+    { 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0400000a, 0x0400000a, 0x0000001f, 0x0000001f, 0x0000001f },
+    { 0x0000001f, 0x02600012, 0x0000001f, 0x0000001f, 0x0000001f, 0x0240000b, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000000a, 0x0000000a, 0x0000001f, 0x0000001f, 0x0000001f },
+    { 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0400000c, 0x0400000c, 0x0000001f, 0x0000001f, 0x0000001f },
+    { 0x0000001f, 0x02100012, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000000c, 0x0000000c, 0x0000001f, 0x0000001f, 0x0000001f },
+    { 0x0000001f, 0x02080012, 0x0000001f, 0x0000000d, 0x0000001f, 0x0000000d, 0x0000000d, 0x0000001f, 0x0000000d, 0x0204000e, 0x0000001f, 0x0000000d, 0x0000000d, 0x0000000d, 0x0000000d, 0x0000000d, 0x0000000d, 0x0000000d, 0x0000000d },
+    { 0x0000001f, 0x0000001f, 0x0000001f, 0x0400000f, 0x0000001f, 0x0400000f, 0x0400000f, 0x0000001f, 0x0400000f, 0x0400000f, 0x0400000f, 0x0400000f, 0x0400000f, 0x0400000f, 0x0400000f, 0x0400000f, 0x0400000f, 0x0400000f, 0x0400000f },
+    { 0x0000001f, 0x0000001f, 0x03000010, 0x0000000f, 0x0000001f, 0x0000000f, 0x0000000f, 0x0000001f, 0x0000000f, 0x0000000f, 0x0000000f, 0x0000000f, 0x0000000f, 0x0000000f, 0x0000000f, 0x0000000f, 0x0000000f, 0x0000000f, 0x0000000f },
+    { 0x0000001f, 0x0000001f, 0x0000001f, 0x04000011, 0x0000001f, 0x0400000d, 0x0400000d, 0x0000001f, 0x0400000d, 0x0000001f, 0x0000001f, 0x0400000d, 0x0400000d, 0x0400000d, 0x0400000d, 0x0400000d, 0x0400000d, 0x0400000d, 0x0400000d },
+    { 0x0000001f, 0x02080012, 0x0000001f, 0x00000011, 0x0000001f, 0x00000011, 0x00000011, 0x0000001f, 0x00000011, 0x00000011, 0x00000011, 0x00000011, 0x00000011, 0x00000011, 0x00000011, 0x00000011, 0x00000011, 0x00000011, 0x00000011 },
+    { 0x0000001f, 0x00000012, 0x0000001f, 0x0000001f, 0x0000001f, 0x04000013, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x04000013, 0x04000013, 0x04000013, 0x04000013, 0x04000013 },
+    { 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x00000013, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x02020014, 0x0000001f, 0x0000001f, 0x00000013, 0x00000013, 0x00000013, 0x00000013, 0x00000013 },
+    { 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x04000015, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x04000015, 0x04000015, 0x04000015, 0x04000015, 0x04000015 },
+    { 0x0000001f, 0x02010016, 0x0000001f, 0x0000001f, 0x0000001f, 0x00000015, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x00000015, 0x00000015, 0x00000015, 0x00000015, 0x00000015 },
+    { 0x0000001f, 0x00000016, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x04000017, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f },
+    { 0x0000001f, 0x02008018, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0200c040, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x00000017, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f },
+    { 0x0000401e, 0x00000018, 0x0000001f, 0x0000201c, 0x00004001, 0x0000203c, 0x0000101c, 0x00004040, 0x0000001f, 0x00000819, 0x00000419, 0x0000001f, 0x0000301c, 0x0000021b, 0x0000001f, 0x0000001f, 0x0000103c, 0x0000303c, 0x0000001f },
+    { 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000011a, 0x0000011a, 0x0000001f, 0x0000011a, 0x0000011a, 0x0000001f, 0x0000011a, 0x0000001f, 0x0000011a, 0x0000011a, 0x0000011a, 0x0000011a, 0x0000011a, 0x0000011a },
+    { 0x0000401e, 0x0200001b, 0x0000001f, 0x0000001f, 0x02004001, 0x0000001a, 0x0000001a, 0x02004040, 0x0000001a, 0x0000001a, 0x0000001f, 0x0000001a, 0x0000001f, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a },
+    { 0x0000401e, 0x0000001b, 0x0000001f, 0x0000201c, 0x00004001, 0x0000203c, 0x0000101c, 0x00004040, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000301c, 0x0000001f, 0x0000001f, 0x0000001f, 0x0000103c, 0x0000303c, 0x0000001f },
+    { 0x0000001f, 0x0000009d, 0x0000001f, 0x0000009d, 0x0000001f, 0x0000009d, 0x0000009d, 0x0000001f, 0x0000009d, 0x0000009d, 0x0000009d, 0x0000009d, 0x0000009d, 0x0000009d, 0x0000009d, 0x0000009d, 0x0000009d, 0x0000009d, 0x0000009d },
+    { 0x0000401e, 0x0000001d, 0x0000001d, 0x0000001d, 0x0000001d, 0x0000001d, 0x0000001d, 0x02004040, 0x0000001d, 0x0000001d, 0x0000001d, 0x0000001d, 0x0000001d, 0x0000001d, 0x0000001d, 0x0000001d, 0x0000001d, 0x0000001d, 0x0000001d }
   } ;
   size_t mark = 0 ;
   size_t col0 = 0 ;
@@ -491,13 +494,14 @@ static inline void script_secondpass (char *s, scriptelem *script, struct envmat
       }
       script[i].mode = m ;
     }
-    if (what & 0x00002000) script[i].cmdtype |= ACTION_REMOVE ;
-    if (what & 0x00001000) script[i].cmdtype |= ACTION_ADD ;
+    if (what & 0x00002000) { script[i].cmdtype |= ACTION_REMOVE ; script[i].flagexecline = 0 ; }
+    if (what & 0x00001000) { script[i].cmdtype |= ACTION_ADD ; script[i].flagexecline = 0 ; }
     if (what & 0x00000800) script[i].movetype = MOVEINFO_MOVE ;
     if (what & 0x00000400) script[i].movetype = MOVEINFO_MOVEANDLINK ;
     if (what & 0x00000200) script[i].movetype = MOVEINFO_NOCREATE ;
     if (what & 0x00000100) script[i].movepath = pos ;
     if (what & 0x00000080) script[i].command = pos ;
+    if (what & 0x00000020) script[i].flagexecline = 1 ;
     if (what & 0x00000040) { line++ ; col0 = pos ; }
     if (what & 0x00004000) i++ ;
     pos++ ;
@@ -655,9 +659,9 @@ static inline ssize_t alias_format (char *out, size_t outmax, char const *in, ch
   return w ;
 }
 
-static inline void spawn_command (char const *command, struct uevent_s const *event)
+static inline void spawn_command (char const *command, struct uevent_s const *event, int isel)
 {
-  char const *argv[4] = { "/bin/sh", "-c", command, 0 } ;
+  char const *argv[4] = { isel ? "execlineb" : "/bin/sh", isel ? "-Pc" : "-c", command, 0 } ;
   size_t envlen = env_len((char const **)environ) ;
   char const *envp[envlen + event->varn + 1] ;
   if (!env_merge(envp, envlen + event->varn + 1, (char const **)environ, envlen, event->buf + event->vars[1], event->len - event->vars[1]))
@@ -668,7 +672,7 @@ static inline void spawn_command (char const *command, struct uevent_s const *ev
   pid = child_spawn0(argv[0], argv, envp) ;
   if (!pid)
   {
-    if (verbosity) strerr_warnwu1sys("spawn command") ;
+    if (verbosity) strerr_warnwu2sys("spawn ", argv[0]) ;
   }
 }
 
@@ -817,7 +821,7 @@ static inline int run_scriptelem (struct uevent_s *event, scriptelem const *elem
     }
     if (dryrun)
     {
-      strerr_warni2x("dry run: spawn ", storage + elem->command) ;
+      strerr_warni4x("dry run: spawn ", elem->flagexecline ? "execlineb" : "/bin/sh", " for: ", storage + elem->command) ;
       if (verbosity >= 2)
       {
         char buf[UEVENT_MAX_SIZE + PATH_MAX + 5] ;
@@ -834,7 +838,7 @@ static inline int run_scriptelem (struct uevent_s *event, scriptelem const *elem
         strerr_warni2x("dry run: added variables: ", buf) ;
       }
     }
-    else spawn_command(storage + elem->command, event) ;
+    else spawn_command(storage + elem->command, event, elem->flagexecline) ;
   }
 
   if (elem->movetype != MOVEINFO_NOCREATE && action == ACTION_REMOVE && mmaj >= 0)