Patchwork initscripts: fix bashism in bootmisc.sh

login
register
mail settings
Submitter Ben Shelton
Date July 23, 2014, 2:49 p.m.
Message ID <1406126945-10647-1-git-send-email-ben.shelton@ni.com>
Download mbox | patch
Permalink /patch/76483/
State New
Headers show

Comments

Ben Shelton - July 23, 2014, 2:49 p.m.
In the commit 'initscripts: save /etc/timestamp with seconds accuracy',
a bashism was introduced in the bootmisc.sh script in the code to set
the current date from the stored value in /etc/timestamp.  This causes
that operation to fail with the following message when /bin/sh is not
bash:

/etc/init.d/rc: /etc/rcS.d/S55bootmisc.sh: line 73: syntax error: bad substitution

Fixed by using 'cut' (standard under POSIX) rather than bash-specific
substring expansion.

[YOCTO #6566]

Signed-off-by: Ben Shelton <ben.shelton@ni.com>
Tested-by: Maxin B. John <maxin.john@enea.com>
---
 meta/recipes-core/initscripts/initscripts-1.0/bootmisc.sh | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)
Richard Purdie - July 23, 2014, 3:41 p.m.
On Wed, 2014-07-23 at 09:49 -0500, Ben Shelton wrote:
> In the commit 'initscripts: save /etc/timestamp with seconds accuracy',
> a bashism was introduced in the bootmisc.sh script in the code to set
> the current date from the stored value in /etc/timestamp.  This causes
> that operation to fail with the following message when /bin/sh is not
> bash:
> 
> /etc/init.d/rc: /etc/rcS.d/S55bootmisc.sh: line 73: syntax error: bad substitution
> 
> Fixed by using 'cut' (standard under POSIX) rather than bash-specific
> substring expansion.
> 
> [YOCTO #6566]
> 
> Signed-off-by: Ben Shelton <ben.shelton@ni.com>
> Tested-by: Maxin B. John <maxin.john@enea.com>
> ---
>  meta/recipes-core/initscripts/initscripts-1.0/bootmisc.sh | 5 ++++-
>  1 file changed, 4 insertions(+), 1 deletion(-)
> 
> diff --git a/meta/recipes-core/initscripts/initscripts-1.0/bootmisc.sh b/meta/recipes-core/initscripts/initscripts-1.0/bootmisc.sh
> index ccc7f9f..923fa88 100755
> --- a/meta/recipes-core/initscripts/initscripts-1.0/bootmisc.sh
> +++ b/meta/recipes-core/initscripts/initscripts-1.0/bootmisc.sh
> @@ -70,7 +70,10 @@ then
>  	read TIMESTAMP < /etc/timestamp
>  	if [ ${TIMESTAMP} -gt $SYSTEMDATE ]; then
>  		# format the timestamp as date expects it (2m2d2H2M4Y.2S)
> -		date -u ${TIMESTAMP:4:8}${TIMESTAMP:0:4}.${TIMESTAMP:(-2)}
> +		TS_YR=$(echo $TIMESTAMP | cut -c 1-4)
> +		TS_SEC=$(echo $TIMESTAMP | cut -c 13-14)
> +		TS_REST=$(echo $TIMESTAMP | cut -c 5-12)
> +		date -u ${TS_REST}${TS_YR}.${TS_SEC}
>  		test -x /etc/init.d/hwclock.sh && /etc/init.d/hwclock.sh stop
>  	fi
>  fi

We have tried hard to remove exec/fork/subshell calls from the init
processes since each one does cost quite some time. The above introduces
more than I'm comfortable with. Can we find some other way to do this
please?

Cheers,

Richard
Chris Larson - July 23, 2014, 4:16 p.m.
On Wed, Jul 23, 2014 at 8:41 AM, Richard Purdie <
richard.purdie@linuxfoundation.org> wrote:

> On Wed, 2014-07-23 at 09:49 -0500, Ben Shelton wrote:
> > In the commit 'initscripts: save /etc/timestamp with seconds accuracy',
> > a bashism was introduced in the bootmisc.sh script in the code to set
> > the current date from the stored value in /etc/timestamp.  This causes
> > that operation to fail with the following message when /bin/sh is not
> > bash:
> >
> > /etc/init.d/rc: /etc/rcS.d/S55bootmisc.sh: line 73: syntax error: bad
> substitution
> >
> > Fixed by using 'cut' (standard under POSIX) rather than bash-specific
> > substring expansion.
> >
> > [YOCTO #6566]
> >
> > Signed-off-by: Ben Shelton <ben.shelton@ni.com>
> > Tested-by: Maxin B. John <maxin.john@enea.com>
> > ---
> >  meta/recipes-core/initscripts/initscripts-1.0/bootmisc.sh | 5 ++++-
> >  1 file changed, 4 insertions(+), 1 deletion(-)
> >
> > diff --git a/meta/recipes-core/initscripts/initscripts-1.0/bootmisc.sh
> b/meta/recipes-core/initscripts/initscripts-1.0/bootmisc.sh
> > index ccc7f9f..923fa88 100755
> > --- a/meta/recipes-core/initscripts/initscripts-1.0/bootmisc.sh
> > +++ b/meta/recipes-core/initscripts/initscripts-1.0/bootmisc.sh
> > @@ -70,7 +70,10 @@ then
> >       read TIMESTAMP < /etc/timestamp
> >       if [ ${TIMESTAMP} -gt $SYSTEMDATE ]; then
> >               # format the timestamp as date expects it (2m2d2H2M4Y.2S)
> > -             date -u ${TIMESTAMP:4:8}${TIMESTAMP:0:4}.${TIMESTAMP:(-2)}
> > +             TS_YR=$(echo $TIMESTAMP | cut -c 1-4)
> > +             TS_SEC=$(echo $TIMESTAMP | cut -c 13-14)
> > +             TS_REST=$(echo $TIMESTAMP | cut -c 5-12)
> > +             date -u ${TS_REST}${TS_YR}.${TS_SEC}
> >               test -x /etc/init.d/hwclock.sh && /etc/init.d/hwclock.sh
> stop
> >       fi
> >  fi
>
> We have tried hard to remove exec/fork/subshell calls from the init
> processes since each one does cost quite some time. The above introduces
> more than I'm comfortable with. Can we find some other way to do this
> please?


Hmm, worst case it looks like a single sed script would do, assuming
there's no way to get date -u to be more flexible.

Patch

diff --git a/meta/recipes-core/initscripts/initscripts-1.0/bootmisc.sh b/meta/recipes-core/initscripts/initscripts-1.0/bootmisc.sh
index ccc7f9f..923fa88 100755
--- a/meta/recipes-core/initscripts/initscripts-1.0/bootmisc.sh
+++ b/meta/recipes-core/initscripts/initscripts-1.0/bootmisc.sh
@@ -70,7 +70,10 @@  then
 	read TIMESTAMP < /etc/timestamp
 	if [ ${TIMESTAMP} -gt $SYSTEMDATE ]; then
 		# format the timestamp as date expects it (2m2d2H2M4Y.2S)
-		date -u ${TIMESTAMP:4:8}${TIMESTAMP:0:4}.${TIMESTAMP:(-2)}
+		TS_YR=$(echo $TIMESTAMP | cut -c 1-4)
+		TS_SEC=$(echo $TIMESTAMP | cut -c 13-14)
+		TS_REST=$(echo $TIMESTAMP | cut -c 5-12)
+		date -u ${TS_REST}${TS_YR}.${TS_SEC}
 		test -x /etc/init.d/hwclock.sh && /etc/init.d/hwclock.sh stop
 	fi
 fi