Skip to content

Commit 00b296c

Browse files
committed
[v1.1] New feature: SRANDOM with upper bound option
This adds SRANDOM, a secure random number generator similar to SRANDOM on bash 5.1+. It uses the OS implementation of arc4random(3) or, absent that, an integrated version that uses Daniel J. Bernstein's ChaCha20 cipher, which I've ported to libast from the OpenSSH distribution, which ported it from OpenBSD.[*1] This cryptographically secure generator is seeded using getentropy(2), getandom(2), /dev/urandom, or /dev/random. A feature the bash version doesn't have is that an upper bound can be set by assigning its value to SRANDOM; subsequent numbers will then be uniformly distributed between 0 and the value of the upper bound minus one, in a way that avoids "modulo bias" if the upper bound is not a power of two.[*2] src/lib/libast/comp/arc4random.c, src/lib/libast/comp/chacha_private.h, src/lib/libast/features/random: - Add arc4random and ChaCha20, ported to libast.[*1] src/lib/libast/Mamfile: - Make it all build. (See README-mamake.md for info) - Copy the result of features/random to the install root (arch/*/) as ast_random.h for ksh to include. src/lib/libast/features/api: - API version bump to 20240121 due to above change. src/cmd/ksh93/include/variables.h src/cmd/ksh93/data/variables.c, - Add SRANDNOD ("SRANDOM") built-in variable node. src/cmd/ksh93/sh/init.c: - sh_reseed_rand(): Now that we have arc4random() we might as well use it to reseed $RANDOM, simplifying this function as well as increasing the quality of the reseeding. Of course this still does not make $RANDOM actually random. (re: af6a32d) - Add discipline for SRANDOM: SRAND_init/SRAND_disc, set up to automatically call put_srand(), nget_srand() and get_srand() for assigning, arithmetic retrieval and text retrieval. - A global static srand_upper_bound variable remembers the upper bound; a value of zero (the default for static vars) deactivates it. When it is non-zero, arc4random_uniform() is called instead of arc4random(), avoiding modulo bias. [*1] https://github.com/openssh/openssh-portable/blob/master/openbsd-compat/arc4random.c https://github.com/openssh/openssh-portable/blob/master/openbsd-compat/arc4random.h https://github.com/openssh/openssh-portable/blob/master/openbsd-compat/arc4random_uniform.c https://github.com/openssh/openssh-portable/blob/master/openbsd-compat/chacha_private.h [*2] https://research.kudelskisecurity.com/2020/07/28/the-definitive-guide-to-modulo-bias-and-how-to-avoid-it/
1 parent 2ada957 commit 00b296c

File tree

14 files changed

+793
-9
lines changed

14 files changed

+793
-9
lines changed

ANNOUNCE

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,11 @@ New features in shell options:
1313
(those with a syntax involving parentheses) from fields resulting from
1414
field splitting (e.g., unquoted variables as command arguments). This
1515
remains disabled by default for compatibility with POSIX and ksh88.
16+
17+
New features in shell variables:
18+
19+
- SRANDOM is a secure random number generator. It uses the OS implementation
20+
of arc4random(3) or, absent that, an integrated OpenBSD-based version that
21+
uses the ChaCha20 cipher. An upper bound can be set by assigning its value
22+
to SRANDOM; subsequent numbers will be uniformly distributed between 0 and
23+
the value of the upper bound minus one, in a way that avoids "modulo bias".

COPYRIGHT

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,3 +141,24 @@ bsd package general copyright notice
141141
# Bill Joy #
142142
# #
143143
########################################################################
144+
145+
OpenBSD License (arc4random.c, arc4random.h):
146+
147+
/*
148+
* Copyright (c) 1996, David Mazieres <dm@uun.org>
149+
* Copyright (c) 2008, Damien Miller <djm@openbsd.org>
150+
* Copyright (c) 2013, Markus Friedl <markus@openbsd.org>
151+
* Copyright (c) 2014, Theo de Raadt <deraadt@openbsd.org>
152+
*
153+
* Permission to use, copy, modify, and distribute this software for any
154+
* purpose with or without fee is hereby granted, provided that the above
155+
* copyright notice and this permission notice appear in all copies.
156+
*
157+
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
158+
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
159+
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
160+
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
161+
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
162+
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
163+
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
164+
*/

NEWS

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,13 @@ Uppercase BUG_* IDs are shell bug IDs as used by the Modernish shell library.
44

55
2024-01-21:
66

7+
- [v1.1] New feature added: SRANDOM is a secure random number generator.
8+
It uses the native OS implementation of arc4random(3) or, absent that, an
9+
integrated OpenBSD-based version that uses the ChaCha20 cipher. An upper
10+
bound can be set by assigning its value to SRANDOM; subsequent numbers will
11+
be uniformly distributed between 0 and the value of the upper bound minus
12+
one, in a way that avoids "modulo bias". Assigning 0 restores default mode.
13+
714
- A bug was fixed that caused both the 'set' and 'get'/'getn' discipline
815
functions of a variable to be triggered when performing an assignment in
916
an arithmetic expression; only the 'set' discipline is now triggered when

src/cmd/ksh93/Mamfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -779,6 +779,7 @@ make install
779779
prev include/fault.h
780780
prev include/path.h
781781
prev include/variables.h
782+
prev ${PACKAGE_ast_INCLUDE}/ast_random.h
782783
prev ${PACKAGE_ast_INCLUDE}/regex.h
783784
prev ${PACKAGE_ast_INCLUDE}/tmx.h
784785
prev ${PACKAGE_ast_INCLUDE}/ccode.h

src/cmd/ksh93/data/variables.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ const struct shtable2 shtab_variables[] =
102102
".sh.ppid", NV_PID|NV_NOFREE, NULL,
103103
".sh.tilde", 0, NULL,
104104
"SHLVL", NV_INTEGER|NV_NOFREE|NV_EXPORT, NULL,
105+
"SRANDOM", NV_NOFREE|NV_INTEGER|NV_UNSIGN, NULL,
105106
"", 0, NULL
106107
};
107108

src/cmd/ksh93/include/variables.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,5 +111,6 @@ extern void sh_save_rand_seed(struct rand *, int);
111111
#define SH_PPIDNOD (sh.bltin_nodes+63)
112112
#define SH_TILDENOD (sh.bltin_nodes+64)
113113
#define SHLVL (sh.bltin_nodes+65)
114+
#define SRANDNOD (sh.bltin_nodes+66)
114115

115116
#endif /* SH_VALNOD */

src/cmd/ksh93/sh.1

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1950,6 +1950,9 @@ a numeric seed value to
19501950
Each time a new shell or subshell environment is entered (see
19511951
.I Subshells\^
19521952
above), the sequence is automatically reset to a different point.
1953+
If true randomness is required,
1954+
.B SRANDOM
1955+
should be used instead.
19531956
.TP
19541957
.B
19551958
.SM REPLY
@@ -1977,6 +1980,25 @@ If
19771980
.B SHLVL
19781981
is not in the environment when the shell is invoked, it is set
19791982
to 1.
1983+
.TP
1984+
.B
1985+
.SM SRANDOM
1986+
Each time this variable is referenced, a securely random integer
1987+
between 0 and 4294967295 (the 32-bit unsigned integer range) is generated.
1988+
By default, each random number is obtained
1989+
from the native OS implementation of
1990+
.IR arc4random (3)
1991+
or, absent that, an integrated OpenBSD-based version
1992+
that uses the ChaCha20 cipher.
1993+
The sequence of random numbers is not reproducible.
1994+
The generator is automatically initialized using various sources of entropy.
1995+
An upper bound can be set by assigning its value to
1996+
.BR SRANDOM ;
1997+
subsequent numbers will then be obtained using
1998+
.IR arc4random_uniform (3),
1999+
which means that they will be uniformly distributed between 0 and the
2000+
value of the upper bound minus one, in a way that avoids "modulo bias".
2001+
Assigning a value of 0 restores default operation.
19802002
.PD
19812003
.RE
19822004
.PP
@@ -9037,6 +9059,7 @@ Unsetting
90379059
.BR OPTIND ,
90389060
.BR RANDOM ,
90399061
.BR SECONDS ,
9062+
.BR SRANDOM ,
90409063
.BR TMOUT ,
90419064
and
90429065
.SM
@@ -9438,6 +9461,7 @@ The null device.
94389461
.IR strftime (3),
94399462
.IR wctrans (3),
94409463
.IR rand (3),
9464+
.IR arc4random (3),
94419465
.IR a.out (5),
94429466
.IR profile (5),
94439467
.IR environ (7).

src/cmd/ksh93/sh/init.c

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
#include <tmx.h>
3535
#include <regex.h>
3636
#include <math.h>
37+
#include <ast_random.h>
3738
#include "variables.h"
3839
#include "path.h"
3940
#include "fault.h"
@@ -202,6 +203,7 @@ typedef struct _init_
202203
Namfun_t OPTINDEX_init;
203204
Namfun_t SECONDS_init;
204205
struct rand RAND_init;
206+
Namfun_t SRAND_init;
205207
Namfun_t LINENO_init;
206208
Namfun_t L_ARG_init;
207209
Namfun_t SH_VERSION_init;
@@ -716,15 +718,42 @@ static char* get_rand(Namval_t* np, Namfun_t *fp)
716718

717719
void sh_reseed_rand(struct rand *rp)
718720
{
719-
struct tms tp;
720-
unsigned int time;
721-
static unsigned int seq;
722-
timeofday(&tp);
723-
time = (unsigned int)remainder(dtime(&tp) * 10000.0, (double)UINT_MAX);
724-
srand(rp->rand_seed = (unsigned int)sh.current_pid ^ time ^ ++seq);
721+
srand(rp->rand_seed = arc4random());
725722
rp->rand_last = -1;
726723
}
727724

725+
/*
726+
* The following three functions are for SRANDOM
727+
*/
728+
static uint32_t srand_upper_bound;
729+
730+
static void put_srand(Namval_t* np,const char *val,int flags,Namfun_t *fp)
731+
{
732+
if(!val) /* unset */
733+
{
734+
fp = nv_stack(np, NULL);
735+
if(fp && !fp->nofree)
736+
free(fp);
737+
_nv_unset(np,NV_RDONLY);
738+
return;
739+
}
740+
if(flags&NV_INTEGER)
741+
srand_upper_bound = *(Sfdouble_t*)val;
742+
else
743+
srand_upper_bound = sh_arith(val);
744+
}
745+
746+
static Sfdouble_t nget_srand(Namval_t* np, Namfun_t *fp)
747+
{
748+
return (Sfdouble_t)(srand_upper_bound ? arc4random_uniform(srand_upper_bound) : arc4random());
749+
}
750+
751+
static char* get_srand(Namval_t* np, Namfun_t *fp)
752+
{
753+
intmax_t n = (intmax_t)(srand_upper_bound ? arc4random_uniform(srand_upper_bound) : arc4random());
754+
return fmtbase(n, 10, 0);
755+
}
756+
728757
/*
729758
* These three routines are for LINENO
730759
*/
@@ -1025,6 +1054,7 @@ static const Namdisc_t HISTFILE_disc = { sizeof(Namfun_t), put_history };
10251054
static const Namdisc_t OPTINDEX_disc = { sizeof(Namfun_t), put_optindex, 0, nget_optindex, 0, 0, clone_optindex };
10261055
static const Namdisc_t SECONDS_disc = { sizeof(Namfun_t), put_seconds, get_seconds, nget_seconds };
10271056
static const Namdisc_t RAND_disc = { sizeof(struct rand), put_rand, get_rand, nget_rand };
1057+
static const Namdisc_t SRAND_disc = { sizeof(Namfun_t), put_srand, get_srand, nget_srand };
10281058
static const Namdisc_t LINENO_disc = { sizeof(Namfun_t), put_lineno, get_lineno, nget_lineno };
10291059
static const Namdisc_t L_ARG_disc = { sizeof(Namfun_t), put_lastarg, get_lastarg };
10301060

@@ -1837,6 +1867,8 @@ static Init_t *nv_init(void)
18371867
ip->SECONDS_init.nofree = 1;
18381868
ip->RAND_init.hdr.disc = &RAND_disc;
18391869
ip->RAND_init.hdr.nofree = 1;
1870+
ip->SRAND_init.disc = &SRAND_disc;
1871+
ip->SRAND_init.nofree = 1;
18401872
ip->SH_MATCH_init.hdr.disc = &SH_MATCH_disc;
18411873
ip->SH_MATCH_init.hdr.nofree = 1;
18421874
ip->SH_MATH_init.disc = &SH_MATH_disc;
@@ -1880,6 +1912,7 @@ static Init_t *nv_init(void)
18801912
nv_putval(SECONDS, (char*)&d, NV_DOUBLE);
18811913
nv_stack(RANDNOD, &ip->RAND_init.hdr);
18821914
nv_putval(RANDNOD, (char*)&d, NV_DOUBLE);
1915+
nv_stack(SRANDNOD, &ip->SRAND_init);
18831916
sh_invalidate_rand_seed();
18841917
nv_stack(LINENO, &ip->LINENO_init);
18851918
SH_MATCHNOD->nvfun = &ip->SH_MATCH_init.hdr;

src/cmd/ksh93/tests/variables.sh

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1123,7 +1123,7 @@ $SHELL -c '
11231123
PS2=$PS1 PS3=$PS1 PS4=$PS1 OPTARG=$PS1 IFS=$PS1 FPATH=$PS1 FIGNORE=$PS1
11241124
for var
11251125
do case $var in
1126-
RANDOM | HISTCMD | _ | SECONDS | LINENO | JOBMAX | .sh.stats | .sh.match)
1126+
RANDOM | SRANDOM | HISTCMD | _ | SECONDS | LINENO | JOBMAX | .sh.stats | .sh.match)
11271127
# these are expected to fail below as their values change; just test against crashing
11281128
typeset -u "$var"
11291129
typeset -l "$var"
@@ -1615,5 +1615,32 @@ got=$(set +x; { "$SHELL" -c '
16151615
"(expected status 0, $(printf %q "$exp");" \
16161616
"got status $e$( ((e>128)) && print -n /SIG && kill -l "$e"), $(printf %q "$got"))"
16171617
1618+
# ======
1619+
got=${ typeset -p SRANDOM; }
1620+
exp='typeset -u -i SRANDOM='
1621+
[[ $got == "$exp"* ]] || err_exit "SRANDOM is the wrong type" \
1622+
"(expected match of $(printf %q "$exp")*, got $(printf %q "$got"))"
1623+
1624+
case ${SRANDOM+s},${SRANDOM-} in
1625+
, ) err_exit "SRANDOM not set" ;;
1626+
s, | s,*[!0123456789]* )
1627+
err_exit "SRANDOM has an invalid value" ;;
1628+
s,* ) case $SRANDOM,$SRANDOM,$SRANDOM,$SRANDOM in
1629+
"$SRANDOM,$SRANDOM,$SRANDOM,$SRANDOM" )
1630+
err_exit "SRANDOM not working" ;;
1631+
esac ;;
1632+
esac
1633+
1634+
typeset -ui i=0 got=0 bound=100
1635+
SRANDOM=bound
1636+
for ((i=0; i<bound; i++))
1637+
do if let "got = SRANDOM, got >= bound"
1638+
then err_exit "SRANDOM upper bound not working ($got >= $bound)"
1639+
break
1640+
fi
1641+
done
1642+
unset i got bound
1643+
SRANDOM=0
1644+
16181645
# ======
16191646
exit $((Errors<125?Errors:125))

src/lib/libast/Mamfile

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2464,6 +2464,19 @@ make install
24642464
done comp/open.c
24652465
exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Icomp -Iinclude -Istd -c comp/open.c
24662466
done open.o generated
2467+
make arc4random.o
2468+
make comp/arc4random.c
2469+
prev comp/chacha_private.h
2470+
prev FEATURE/mmap
2471+
prev include/error.h
2472+
make FEATURE/random implicit
2473+
prev features/random
2474+
exec - iffe ${IFFEFLAGS} -v -X ast -X std -c "${CC} ${mam_cc_FLAGS} ${CCFLAGS} ${LDFLAGS}" run features/random
2475+
done FEATURE/random generated
2476+
prev include/ast.h
2477+
done comp/arc4random.c
2478+
exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Icomp -Iinclude -Istd -c comp/arc4random.c
2479+
done arc4random.o generated
24672480
make getdents.o
24682481
make dir/getdents.c
24692482
prev dir/dirlib.h
@@ -4310,7 +4323,7 @@ make install
43104323
exec - ${AR} rc libast.a state.o opendir.o readdir.o rewinddir.o seekdir.o telldir.o getcwd.o fastfind.o hashalloc.o hashdump.o hashfree.o hashlast.o hashlook.o hashscan.o hashsize.o hashview.o hashwalk.o memhash.o memsum.o strhash.o strkey.o strsum.o stracmp.o strnacmp.o ccmap.o ccmapid.o ccnative.o chresc.o chrtoi.o
43114324
exec - ${AR} rc libast.a streval.o strexpr.o strmatch.o strcopy.o modei.o modex.o strmode.o strlcat.o strlcpy.o strlook.o strncopy.o strsearch.o strpsearch.o stresc.o stropt.o strtape.o strpcmp.o strnpcmp.o strvcmp.o strnvcmp.o tok.o tokline.o tokscan.o pathaccess.o pathcat.o pathcanon.o pathcheck.o pathpath.o pathexists.o pathfind.o pathicase.o pathkey.o pathprobe.o pathrepl.o pathnative.o pathposix.o pathtemp.o pathtmp.o pathstat.o pathgetlink.o pathsetlink.o pathbin.o pathshell.o pathcd.o pathprog.o ftwalk.o ftwflags.o fts.o astintercept.o conformance.o getenv.o setenviron.o optget.o optjoin.o optesc.o optctx.o strsort.o struniq.o magic.o mime.o mimetype.o signal.o sigflag.o systrace.o error.o errorf.o errormsg.o errorx.o localeconv.o setlocale.o translate.o catopen.o iconv.o lc.o lctab.o mc.o base64.o recfmt.o recstr.o reclen.o fmtrec.o fmtbase.o fmtbuf.o fmtclock.o fmtdev.o fmtelapsed.o fmterror.o fmtesc.o fmtfmt.o fmtfs.o fmtident.o fmtint.o fmtip4.o fmtip6.o fmtls.o fmtmatch.o fmtmode.o fmtnum.o fmtperm.o fmtre.o fmttime.o
43124325
exec - ${AR} rc libast.a fmtuid.o fmtgid.o fmtsignal.o fmtscale.o fmttmx.o fmttv.o fmtversion.o strelapsed.o strperm.o struid.o strgid.o strtoip4.o strtoip6.o stk.o swapget.o swapmem.o swapop.o swapput.o sigdata.o sigcrit.o sigunblock.o procopen.o procclose.o procrun.o procfree.o tmdate.o tmequiv.o tmfix.o tmfmt.o tmform.o tmgoff.o tminit.o tmleap.o tmlex.o tmlocale.o tmmake.o tmpoff.o tmscan.o tmsleep.o tmtime.o tmtype.o tmweek.o tmword.o tmzone.o tmxdate.o tmxduration.o tmxfmt.o tmxgettime.o tmxleap.o tmxmake.o tmxscan.o tmxsettime.o tmxsleep.o tmxtime.o tmxtouch.o tvcmp.o tvgettime.o tvsettime.o tvsleep.o tvtouch.o cmdarg.o vecargs.o vecfile.o vecfree.o vecload.o vecstring.o univdata.o touch.o mnt.o debug.o memccpy.o memchr.o memcmp.o memcpy.o memdup.o memmove.o memset.o mkdir.o mkfifo.o mknod.o rmdir.o remove.o rename.o link.o unlink.o strdup.o strtod.o strtold.o strtol.o strtoll.o strtoul.o strtoull.o strton.o strtonll.o strntod.o strntold.o strnton.o
4313-
exec - ${AR} rc libast.a strntonll.o strntol.o strntoll.o strntoul.o strntoull.o strcasecmp.o strncasecmp.o strerror.o mktemp.o tmpnam.o fsync.o execlp.o execve.o execvp.o execvpe.o spawnveg.o killpg.o getlogin.o putenv.o setenv.o unsetenv.o lstat.o statvfs.o eaccess.o gross.o omitted.o readlink.o symlink.o getpgrp.o setpgid.o setsid.o fcntl.o open.o getdents.o getwd.o dup2.o errno.o getgroups.o mount.o system.o iblocks.o modedata.o tmdata.o memfatal.o sfkeyprintf.o sfdcdio.o sfdcdos.o sfdcfilter.o sfdcseekable.o sfdcslow.o sfdcsubstr.o sfdctee.o sfdcunion.o sfdcmore.o sfdcprefix.o wc.o wc2utf8.o dirname.o fmtmsglib.o fnmatch.o ftw.o getdate.o getsubopt.o glob.o nftw.o re_comp.o resolvepath.o realpath.o regcmp.o regexp.o strftime.o strptime.o swab.o tempnam.o wordexp.o mktime.o regalloc.o regclass.o regcoll.o regcomp.o regcache.o regdecomp.o regerror.o regexec.o regfatal.o reginit.o
4326+
exec - ${AR} rc libast.a strntonll.o strntol.o strntoll.o strntoul.o strntoull.o strcasecmp.o strncasecmp.o strerror.o mktemp.o tmpnam.o fsync.o execlp.o execve.o execvp.o execvpe.o spawnveg.o killpg.o getlogin.o putenv.o setenv.o unsetenv.o lstat.o statvfs.o eaccess.o gross.o omitted.o readlink.o symlink.o getpgrp.o setpgid.o setsid.o fcntl.o open.o arc4random.o getdents.o getwd.o dup2.o errno.o getgroups.o mount.o system.o iblocks.o modedata.o tmdata.o memfatal.o sfkeyprintf.o sfdcdio.o sfdcdos.o sfdcfilter.o sfdcseekable.o sfdcslow.o sfdcsubstr.o sfdctee.o sfdcunion.o sfdcmore.o sfdcprefix.o wc.o wc2utf8.o dirname.o fmtmsglib.o fnmatch.o ftw.o getdate.o getsubopt.o glob.o nftw.o re_comp.o resolvepath.o realpath.o regcmp.o regexp.o strftime.o strptime.o swab.o tempnam.o wordexp.o mktime.o regalloc.o regclass.o regcoll.o regcomp.o regcache.o regdecomp.o regerror.o regexec.o regfatal.o reginit.o
43144327
exec - ${AR} rc libast.a regnexec.o regsubcomp.o regsubexec.o regsub.o regrecord.o regrexec.o regstat.o dtclose.o dtdisc.o dthash.o dtlist.o dtmethod.o dtopen.o dtstat.o dtstrhash.o dttree.o dtuser.o dtview.o dtwalk.o dtnew.o dtcomp.o sfclose.o sfclrlock.o sfdisc.o sfdlen.o sfexcept.o sfgetl.o sfgetu.o sfcvt.o sfecvt.o sffcvt.o sfextern.o sffilbuf.o sfflsbuf.o sfprints.o sfgetd.o sfgetr.o sfllen.o sfmode.o sfmove.o sfnew.o sfpkrd.o sfnotify.o sfnputc.o sfopen.o sfpeek.o sfpoll.o sfpool.o sfpopen.o sfprintf.o sfputd.o sfputl.o sfputr.o sfputu.o sfrd.o sfread.o sfreserve.o sfscanf.o sfseek.o sfset.o sfsetbuf.o sfsetfd.o sfsize.o sfsk.o sfstack.o sfstrtod.o sfsync.o sfswap.o sftable.o sftell.o sftmp.o sfungetc.o sfvprintf.o sfvscanf.o sfwr.o sfwrite.o sfpurge.o sfraise.o sfwalk.o sfgetm.o sfputm.o sfresize.o _sfclrerr.o _sfeof.o _sferror.o _sffileno.o _sfopen.o _sfstacked.o _sfvalue.o _sfgetc.o _sfgetl.o _sfgetl2.o _sfgetu.o _sfgetu2.o _sfdlen.o _sfllen.o _sfslen.o _sfulen.o _sfputc.o _sfputd.o _sfputl.o _sfputm.o
43154328
exec - ${AR} rc libast.a _sfputu.o clearerr.o fclose.o fdopen.o fflush.o fgetc.o fgetpos.o fgets.o fopen.o fprintf.o fpurge.o fputs.o fread.o freopen.o fscanf.o fseek.o fseeko.o fsetpos.o ftell.o ftello.o fwrite.o getw.o pclose.o popen.o printf.o putchar.o puts.o putw.o rewind.o scanf.o setbuf.o setbuffer.o setlinebuf.o setvbuf.o snprintf.o sprintf.o sscanf.o asprintf.o vasprintf.o tmpfile.o ungetc.o vfprintf.o vfscanf.o vprintf.o vscanf.o vsnprintf.o vsprintf.o vsscanf.o _doprnt.o _doscan.o _filbuf.o _flsbuf.o _stdopen.o _stdprintf.o _stdscanf.o _stdsprnt.o _stdvbuf.o _stdvsnprnt.o _stdvsprnt.o _stdvsscn.o fgetwc.o fwprintf.o putwchar.o vfwscanf.o wprintf.o fgetws.o fwscanf.o swprintf.o vswprintf.o wscanf.o fputwc.o getwc.o swscanf.o vswscanf.o fputws.o getwchar.o ungetwc.o vwprintf.o fwide.o putwc.o vfwprintf.o vwscanf.o stdio_c99.o fcloseall.o fmemopen.o getdelim.o getline.o frexp.o frexpl.o astcopy.o
43164329
exec - ${AR} rc libast.a astconf.o astdynamic.o astquery.o astwinsize.o conftab.o aststatic.o getopt.o getoptl.o aso.o asolock.o asometh.o asorelax.o aso-sem.o aso-fcntl.o vmbest.o vmclear.o vmclose.o vmdcheap.o vmdebug.o vmdisc.o vmlast.o vmopen.o vmpool.o vmprivate.o vmprofile.o vmregion.o vmsegment.o vmset.o vmstat.o vmstrdup.o vmtrace.o vmwalk.o vmmopen.o malloc.o vmgetmem.o
@@ -4900,6 +4913,10 @@ make install
49004913
prev ast_param.h
49014914
exec - ${STDCP} -f ast_param.h ${INSTALLROOT}/include/ast/ast_param.h
49024915
done ${INSTALLROOT}/include/ast/ast_param.h generated
4916+
make ${INSTALLROOT}/include/ast/ast_random.h
4917+
prev FEATURE/random
4918+
exec - ${STDCP} -f FEATURE/random ${INSTALLROOT}/include/ast/ast_random.h
4919+
done ${INSTALLROOT}/include/ast/ast_random.h generated
49034920
make ${INSTALLROOT}/include/ast/ast_sys.h
49044921
prev ast_sys.h
49054922
exec - ${STDCP} -f ast_sys.h ${INSTALLROOT}/include/ast/ast_sys.h

0 commit comments

Comments
 (0)