Merge ^/head r337646 through r338014.
This commit is contained in:
commit
3611ec6048
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/projects/clang700-import/; revision=338015
@ -833,7 +833,7 @@ IMAKEENV+= PATH=${TMPPATH}:${INSTALLTMP}
|
|||||||
|
|
||||||
# When generating install media, do not allow user and group information from
|
# When generating install media, do not allow user and group information from
|
||||||
# the build host to affect the contents of the distribution.
|
# the build host to affect the contents of the distribution.
|
||||||
.if make(distributeworld)
|
.if make(distributeworld) || make(distrib-dirs) || make(distribution)
|
||||||
DB_FROM_SRC= yes
|
DB_FROM_SRC= yes
|
||||||
.endif
|
.endif
|
||||||
|
|
||||||
@ -1765,7 +1765,7 @@ create-packages: .PHONY create-packages-world create-packages-kernel
|
|||||||
create-world-packages: _pkgbootstrap .PHONY
|
create-world-packages: _pkgbootstrap .PHONY
|
||||||
@rm -f ${WSTAGEDIR}/*.plist 2>/dev/null || :
|
@rm -f ${WSTAGEDIR}/*.plist 2>/dev/null || :
|
||||||
@cd ${WSTAGEDIR} ; \
|
@cd ${WSTAGEDIR} ; \
|
||||||
env -i LC_COLLATE=C sort ${WSTAGEDIR}/METALOG | \
|
env -i LC_COLLATE=C sort ${WSTAGEDIR}/${DISTDIR}/METALOG | \
|
||||||
awk -f ${SRCDIR}/release/scripts/mtree-to-plist.awk
|
awk -f ${SRCDIR}/release/scripts/mtree-to-plist.awk
|
||||||
@for plist in ${WSTAGEDIR}/*.plist; do \
|
@for plist in ${WSTAGEDIR}/*.plist; do \
|
||||||
plist=$${plist##*/} ; \
|
plist=$${plist##*/} ; \
|
||||||
@ -2524,7 +2524,7 @@ _prebuild_libs= ${_kerberos5_lib_libasn1} \
|
|||||||
${_cddl_lib_libumem} ${_cddl_lib_libnvpair} \
|
${_cddl_lib_libumem} ${_cddl_lib_libnvpair} \
|
||||||
${_cddl_lib_libuutil} \
|
${_cddl_lib_libuutil} \
|
||||||
${_cddl_lib_libavl} \
|
${_cddl_lib_libavl} \
|
||||||
${_cddl_lib_libzfs_core} \
|
${_cddl_lib_libzfs_core} ${_cddl_lib_libzfs} \
|
||||||
${_cddl_lib_libctf} \
|
${_cddl_lib_libctf} \
|
||||||
lib/libufs \
|
lib/libufs \
|
||||||
lib/libutil lib/libpjdlog ${_lib_libypclnt} lib/libz lib/msun \
|
lib/libutil lib/libpjdlog ${_lib_libypclnt} lib/libz lib/msun \
|
||||||
@ -2597,7 +2597,15 @@ _cddl_lib_libavl= cddl/lib/libavl
|
|||||||
_cddl_lib_libuutil= cddl/lib/libuutil
|
_cddl_lib_libuutil= cddl/lib/libuutil
|
||||||
.if ${MK_ZFS} != "no"
|
.if ${MK_ZFS} != "no"
|
||||||
_cddl_lib_libzfs_core= cddl/lib/libzfs_core
|
_cddl_lib_libzfs_core= cddl/lib/libzfs_core
|
||||||
|
_cddl_lib_libzfs= cddl/lib/libzfs
|
||||||
|
|
||||||
cddl/lib/libzfs_core__L: cddl/lib/libnvpair__L
|
cddl/lib/libzfs_core__L: cddl/lib/libnvpair__L
|
||||||
|
|
||||||
|
cddl/lib/libzfs__L: cddl/lib/libzfs_core__L lib/msun__L lib/libutil__L
|
||||||
|
cddl/lib/libzfs__L: lib/libthr__L lib/libmd__L lib/libz__L cddl/lib/libumem__L
|
||||||
|
cddl/lib/libzfs__L: cddl/lib/libuutil__L cddl/lib/libavl__L lib/libgeom__L
|
||||||
|
|
||||||
|
lib/libbe__L: cddl/lib/libzfs__L
|
||||||
.endif
|
.endif
|
||||||
_cddl_lib_libctf= cddl/lib/libctf
|
_cddl_lib_libctf= cddl/lib/libctf
|
||||||
_cddl_lib= cddl/lib
|
_cddl_lib= cddl/lib
|
||||||
|
8
UPDATING
8
UPDATING
@ -31,6 +31,14 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 12.x IS SLOW:
|
|||||||
disable the most expensive debugging functionality run
|
disable the most expensive debugging functionality run
|
||||||
"ln -s 'abort:false,junk:false' /etc/malloc.conf".)
|
"ln -s 'abort:false,junk:false' /etc/malloc.conf".)
|
||||||
|
|
||||||
|
20180815:
|
||||||
|
ls(1) now respects the COLORTERM environment variable used in other
|
||||||
|
systems and software to indicate that a colored terminal is both
|
||||||
|
supported and desired. If ls(1) is suddenly emitting colors, they may
|
||||||
|
be disabled again by either removing the unwanted COLORTERM from your
|
||||||
|
environment, or using `ls --color=never`. The ls(1) specific CLICOLOR
|
||||||
|
may not be observed in a future release.
|
||||||
|
|
||||||
20180808:
|
20180808:
|
||||||
The default pager for most commands has been changed to "less". To
|
The default pager for most commands has been changed to "less". To
|
||||||
restore the old behavior, set PAGER="more" and MANPAGER="more -s" in
|
restore the old behavior, set PAGER="more" and MANPAGER="more -s" in
|
||||||
|
@ -8,6 +8,8 @@
|
|||||||
|
|
||||||
.include <src.opts.mk>
|
.include <src.opts.mk>
|
||||||
|
|
||||||
|
CONFGROUPS= ETC
|
||||||
|
ETC= csh.cshrc csh.login csh.logout
|
||||||
PACKAGE=runtime
|
PACKAGE=runtime
|
||||||
TCSHDIR= ${SRCTOP}/contrib/tcsh
|
TCSHDIR= ${SRCTOP}/contrib/tcsh
|
||||||
.PATH: ${TCSHDIR}
|
.PATH: ${TCSHDIR}
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
PACKAGE=runtime
|
PACKAGE=runtime
|
||||||
PROG= dd
|
PROG= dd
|
||||||
SRCS= args.c conv.c conv_tab.c dd.c misc.c position.c
|
SRCS= args.c conv.c conv_tab.c dd.c misc.c position.c
|
||||||
|
LIBADD= util
|
||||||
|
|
||||||
#
|
#
|
||||||
# Test the character conversion functions. We have to be explicit about
|
# Test the character conversion functions. We have to be explicit about
|
||||||
|
21
bin/dd/dd.c
21
bin/dd/dd.c
@ -95,6 +95,8 @@ volatile sig_atomic_t need_progress;
|
|||||||
int
|
int
|
||||||
main(int argc __unused, char *argv[])
|
main(int argc __unused, char *argv[])
|
||||||
{
|
{
|
||||||
|
struct itimerval itv = { { 1, 0 }, { 1, 0 } }; /* SIGALARM every second, if needed */
|
||||||
|
|
||||||
(void)setlocale(LC_CTYPE, "");
|
(void)setlocale(LC_CTYPE, "");
|
||||||
jcl(argv);
|
jcl(argv);
|
||||||
setup();
|
setup();
|
||||||
@ -104,7 +106,10 @@ main(int argc __unused, char *argv[])
|
|||||||
err(1, "unable to enter capability mode");
|
err(1, "unable to enter capability mode");
|
||||||
|
|
||||||
(void)signal(SIGINFO, siginfo_handler);
|
(void)signal(SIGINFO, siginfo_handler);
|
||||||
(void)signal(SIGALRM, sigalrm_handler);
|
if (ddflags & C_PROGRESS) {
|
||||||
|
(void)signal(SIGALRM, sigalarm_handler);
|
||||||
|
setitimer(ITIMER_REAL, &itv, NULL);
|
||||||
|
}
|
||||||
(void)signal(SIGINT, terminate);
|
(void)signal(SIGINT, terminate);
|
||||||
|
|
||||||
atexit(summary);
|
atexit(summary);
|
||||||
@ -284,14 +289,6 @@ setup(void)
|
|||||||
ctab = casetab;
|
ctab = casetab;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((ddflags & C_PROGRESS)) {
|
|
||||||
struct itimerval timer = {
|
|
||||||
.it_interval = { .tv_sec = 1, .tv_usec = 0 },
|
|
||||||
.it_value = { .tv_sec = 1, .tv_usec = 0 },
|
|
||||||
};
|
|
||||||
setitimer(ITIMER_REAL, &timer, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (clock_gettime(CLOCK_MONOTONIC, &st.start))
|
if (clock_gettime(CLOCK_MONOTONIC, &st.start))
|
||||||
err(1, "clock_gettime");
|
err(1, "clock_gettime");
|
||||||
}
|
}
|
||||||
@ -469,12 +466,10 @@ dd_in(void)
|
|||||||
|
|
||||||
in.dbp += in.dbrcnt;
|
in.dbp += in.dbrcnt;
|
||||||
(*cfunc)();
|
(*cfunc)();
|
||||||
if (need_summary) {
|
if (need_summary)
|
||||||
summary();
|
summary();
|
||||||
}
|
if (need_progress)
|
||||||
if (need_progress) {
|
|
||||||
progress();
|
progress();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -45,10 +45,10 @@ void jcl(char **);
|
|||||||
void pos_in(void);
|
void pos_in(void);
|
||||||
void pos_out(void);
|
void pos_out(void);
|
||||||
double secs_elapsed(void);
|
double secs_elapsed(void);
|
||||||
void summary(void);
|
|
||||||
void progress(void);
|
void progress(void);
|
||||||
|
void summary(void);
|
||||||
|
void sigalarm_handler(int);
|
||||||
void siginfo_handler(int);
|
void siginfo_handler(int);
|
||||||
void sigalrm_handler(int);
|
|
||||||
void terminate(int);
|
void terminate(int);
|
||||||
void unblock(void);
|
void unblock(void);
|
||||||
void unblock_close(void);
|
void unblock_close(void);
|
||||||
|
@ -46,6 +46,7 @@ __FBSDID("$FreeBSD$");
|
|||||||
#include <err.h>
|
#include <err.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
|
#include <libutil.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@ -56,8 +57,6 @@ __FBSDID("$FreeBSD$");
|
|||||||
#include "dd.h"
|
#include "dd.h"
|
||||||
#include "extern.h"
|
#include "extern.h"
|
||||||
|
|
||||||
static int need_newline;
|
|
||||||
|
|
||||||
double
|
double
|
||||||
secs_elapsed(void)
|
secs_elapsed(void)
|
||||||
{
|
{
|
||||||
@ -85,7 +84,7 @@ summary(void)
|
|||||||
if (ddflags & C_NOINFO)
|
if (ddflags & C_NOINFO)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (need_newline && !need_summary)
|
if (ddflags & C_PROGRESS)
|
||||||
fprintf(stderr, "\n");
|
fprintf(stderr, "\n");
|
||||||
|
|
||||||
secs = secs_elapsed();
|
secs = secs_elapsed();
|
||||||
@ -110,22 +109,25 @@ summary(void)
|
|||||||
void
|
void
|
||||||
progress(void)
|
progress(void)
|
||||||
{
|
{
|
||||||
|
static int outlen;
|
||||||
|
char si[4 + 1 + 2 + 1]; /* 123 <space> <suffix> NUL */
|
||||||
|
char iec[4 + 1 + 2 + 1]; /* 123 <space> <suffix> NUL */
|
||||||
|
char persec[4 + 1 + 2 + 1]; /* 123 <space> <suffix> NUL */
|
||||||
|
char *buf;
|
||||||
double secs;
|
double secs;
|
||||||
static int lastlen;
|
|
||||||
int len;
|
|
||||||
|
|
||||||
secs = secs_elapsed();
|
secs = secs_elapsed();
|
||||||
len = fprintf(stderr,
|
humanize_number(si, sizeof(si), (int64_t)st.bytes, "B", HN_AUTOSCALE,
|
||||||
"\r%ju bytes transferred in %.0f secs (%.0f bytes/sec)",
|
HN_DECIMAL | HN_DIVISOR_1000);
|
||||||
st.bytes, secs, st.bytes / secs);
|
humanize_number(iec, sizeof(iec), (int64_t)st.bytes, "B", HN_AUTOSCALE,
|
||||||
|
HN_DECIMAL | HN_IEC_PREFIXES);
|
||||||
if (len > 0) {
|
humanize_number(persec, sizeof(iec), (int64_t)(st.bytes / secs), "B",
|
||||||
if (len < lastlen)
|
HN_AUTOSCALE, HN_DECIMAL | HN_DIVISOR_1000);
|
||||||
(void)fprintf(stderr, "%*s", len - lastlen, "");
|
asprintf(&buf, " %'ju bytes (%s, %s) transferred %.3fs, %s/s",
|
||||||
lastlen = len;
|
(uintmax_t)st.bytes, si, iec, secs, persec);
|
||||||
}
|
outlen = fprintf(stderr, "%-*s\r", outlen, buf);
|
||||||
|
fflush(stderr);
|
||||||
need_newline = 1;
|
free(buf);
|
||||||
need_progress = 0;
|
need_progress = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -139,7 +141,7 @@ siginfo_handler(int signo __unused)
|
|||||||
|
|
||||||
/* ARGSUSED */
|
/* ARGSUSED */
|
||||||
void
|
void
|
||||||
sigalrm_handler(int signo __unused)
|
sigalarm_handler(int signo __unused)
|
||||||
{
|
{
|
||||||
|
|
||||||
need_progress = 1;
|
need_progress = 1;
|
||||||
|
@ -125,6 +125,8 @@ pos_in(void)
|
|||||||
--cnt;
|
--cnt;
|
||||||
if (need_summary)
|
if (need_summary)
|
||||||
summary();
|
summary();
|
||||||
|
if (need_progress)
|
||||||
|
progress();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -32,6 +32,8 @@
|
|||||||
* $FreeBSD$
|
* $FreeBSD$
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
int acccmp(const FTSENT *, const FTSENT *);
|
int acccmp(const FTSENT *, const FTSENT *);
|
||||||
int revacccmp(const FTSENT *, const FTSENT *);
|
int revacccmp(const FTSENT *, const FTSENT *);
|
||||||
int birthcmp(const FTSENT *, const FTSENT *);
|
int birthcmp(const FTSENT *, const FTSENT *);
|
||||||
@ -64,5 +66,12 @@ extern char *ansi_bgcol;
|
|||||||
extern char *ansi_coloff;
|
extern char *ansi_coloff;
|
||||||
extern char *attrs_off;
|
extern char *attrs_off;
|
||||||
extern char *enter_bold;
|
extern char *enter_bold;
|
||||||
|
|
||||||
|
extern int colorflag;
|
||||||
|
extern bool explicitansi;
|
||||||
|
|
||||||
|
#define COLORFLAG_NEVER 0
|
||||||
|
#define COLORFLAG_AUTO 1
|
||||||
|
#define COLORFLAG_ALWAYS 2
|
||||||
#endif
|
#endif
|
||||||
extern int termwidth;
|
extern int termwidth;
|
||||||
|
49
bin/ls/ls.1
49
bin/ls/ls.1
@ -32,7 +32,7 @@
|
|||||||
.\" @(#)ls.1 8.7 (Berkeley) 7/29/94
|
.\" @(#)ls.1 8.7 (Berkeley) 7/29/94
|
||||||
.\" $FreeBSD$
|
.\" $FreeBSD$
|
||||||
.\"
|
.\"
|
||||||
.Dd August 8, 2018
|
.Dd August 16, 2018
|
||||||
.Dt LS 1
|
.Dt LS 1
|
||||||
.Os
|
.Os
|
||||||
.Sh NAME
|
.Sh NAME
|
||||||
@ -41,6 +41,7 @@
|
|||||||
.Sh SYNOPSIS
|
.Sh SYNOPSIS
|
||||||
.Nm
|
.Nm
|
||||||
.Op Fl ABCFGHILPRSTUWZabcdfghiklmnopqrstuwxy1,
|
.Op Fl ABCFGHILPRSTUWZabcdfghiklmnopqrstuwxy1,
|
||||||
|
.Op Fl -color Ns = Ns Ar when
|
||||||
.Op Fl D Ar format
|
.Op Fl D Ar format
|
||||||
.Op Ar
|
.Op Ar
|
||||||
.Sh DESCRIPTION
|
.Sh DESCRIPTION
|
||||||
@ -210,6 +211,47 @@ This option is not defined in
|
|||||||
.St -p1003.1-2001 .
|
.St -p1003.1-2001 .
|
||||||
.It Fl c
|
.It Fl c
|
||||||
Use time when file status was last changed for sorting or printing.
|
Use time when file status was last changed for sorting or printing.
|
||||||
|
.It Fl -color Ns = Ns Ar when
|
||||||
|
Output colored escape sequences based on
|
||||||
|
.Ar when ,
|
||||||
|
which may be set to either
|
||||||
|
.Cm always ,
|
||||||
|
.Cm auto
|
||||||
|
(default), or
|
||||||
|
.Cm never .
|
||||||
|
.Pp
|
||||||
|
.Cm always
|
||||||
|
will make
|
||||||
|
.Nm
|
||||||
|
always output color.
|
||||||
|
If
|
||||||
|
.Ev TERM
|
||||||
|
is unset or set to an invalid terminal, then
|
||||||
|
.Nm
|
||||||
|
will fall back to explicit
|
||||||
|
.Tn ANSI
|
||||||
|
escape sequences without the help of
|
||||||
|
.Xr termcap 5 .
|
||||||
|
.Cm always
|
||||||
|
is the default if
|
||||||
|
.Fl -color
|
||||||
|
is specified without an argument.
|
||||||
|
.Pp
|
||||||
|
.Cm auto
|
||||||
|
will make
|
||||||
|
.Nm
|
||||||
|
output escape sequences based on
|
||||||
|
.Xr termcap 5 ,
|
||||||
|
but only if
|
||||||
|
.Dv stdout
|
||||||
|
is a tty and either the
|
||||||
|
.Fl G
|
||||||
|
flag is specified or the
|
||||||
|
.Ev COLORTERM
|
||||||
|
environment variable is set and not empty.
|
||||||
|
.Pp
|
||||||
|
.Cm never
|
||||||
|
will disable color regardless of environment variables.
|
||||||
.It Fl d
|
.It Fl d
|
||||||
Directories are listed as plain files (not searched recursively).
|
Directories are listed as plain files (not searched recursively).
|
||||||
.It Fl f
|
.It Fl f
|
||||||
@ -620,7 +662,10 @@ Colorization
|
|||||||
is silently disabled if the output is not directed to a terminal
|
is silently disabled if the output is not directed to a terminal
|
||||||
unless the
|
unless the
|
||||||
.Ev CLICOLOR_FORCE
|
.Ev CLICOLOR_FORCE
|
||||||
variable is defined.
|
variable is defined or
|
||||||
|
.Fl -color
|
||||||
|
is set to
|
||||||
|
.Dq always .
|
||||||
.It Ev CLICOLOR_FORCE
|
.It Ev CLICOLOR_FORCE
|
||||||
Color sequences are normally disabled if the output is not directed to
|
Color sequences are normally disabled if the output is not directed to
|
||||||
a terminal.
|
a terminal.
|
||||||
|
92
bin/ls/ls.c
92
bin/ls/ls.c
@ -55,11 +55,13 @@ __FBSDID("$FreeBSD$");
|
|||||||
#include <err.h>
|
#include <err.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <fts.h>
|
#include <fts.h>
|
||||||
|
#include <getopt.h>
|
||||||
#include <grp.h>
|
#include <grp.h>
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <locale.h>
|
#include <locale.h>
|
||||||
#include <pwd.h>
|
#include <pwd.h>
|
||||||
|
#include <stdbool.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@ -98,6 +100,16 @@ static void display(const FTSENT *, FTSENT *, int);
|
|||||||
static int mastercmp(const FTSENT * const *, const FTSENT * const *);
|
static int mastercmp(const FTSENT * const *, const FTSENT * const *);
|
||||||
static void traverse(int, char **, int);
|
static void traverse(int, char **, int);
|
||||||
|
|
||||||
|
#define COLOR_OPT (CHAR_MAX + 1)
|
||||||
|
|
||||||
|
static const struct option long_opts[] =
|
||||||
|
{
|
||||||
|
#ifdef COLORLS
|
||||||
|
{"color", optional_argument, NULL, COLOR_OPT},
|
||||||
|
#endif
|
||||||
|
{NULL, no_argument, NULL, 0}
|
||||||
|
};
|
||||||
|
|
||||||
static void (*printfcn)(const DISPLAY *);
|
static void (*printfcn)(const DISPLAY *);
|
||||||
static int (*sortfcn)(const FTSENT *, const FTSENT *);
|
static int (*sortfcn)(const FTSENT *, const FTSENT *);
|
||||||
|
|
||||||
@ -139,10 +151,10 @@ static int f_stream; /* stream the output, separate with commas */
|
|||||||
static int f_timesort; /* sort by time vice name */
|
static int f_timesort; /* sort by time vice name */
|
||||||
int f_type; /* add type character for non-regular files */
|
int f_type; /* add type character for non-regular files */
|
||||||
static int f_whiteout; /* show whiteout entries */
|
static int f_whiteout; /* show whiteout entries */
|
||||||
|
|
||||||
#ifdef COLORLS
|
#ifdef COLORLS
|
||||||
|
int colorflag = COLORFLAG_AUTO; /* passed in colorflag */
|
||||||
int f_color; /* add type in color for non-regular files */
|
int f_color; /* add type in color for non-regular files */
|
||||||
|
bool explicitansi; /* Explicit ANSI sequences, no termcap(5) */
|
||||||
char *ansi_bgcol; /* ANSI sequence to set background colour */
|
char *ansi_bgcol; /* ANSI sequence to set background colour */
|
||||||
char *ansi_fgcol; /* ANSI sequence to set foreground colour */
|
char *ansi_fgcol; /* ANSI sequence to set foreground colour */
|
||||||
char *ansi_coloff; /* ANSI sequence to reset colours */
|
char *ansi_coloff; /* ANSI sequence to reset colours */
|
||||||
@ -152,6 +164,42 @@ char *enter_bold; /* ANSI sequence to set color to bold mode */
|
|||||||
|
|
||||||
static int rval;
|
static int rval;
|
||||||
|
|
||||||
|
static bool
|
||||||
|
do_color_from_env(void)
|
||||||
|
{
|
||||||
|
const char *p;
|
||||||
|
bool doit;
|
||||||
|
|
||||||
|
doit = false;
|
||||||
|
p = getenv("CLICOLOR");
|
||||||
|
if (p == NULL) {
|
||||||
|
/*
|
||||||
|
* COLORTERM is the more standard name for this variable. We'll
|
||||||
|
* honor it as long as it's both set and not empty.
|
||||||
|
*/
|
||||||
|
p = getenv("COLORTERM");
|
||||||
|
if (p != NULL && *p != '\0')
|
||||||
|
doit = true;
|
||||||
|
} else
|
||||||
|
doit = true;
|
||||||
|
|
||||||
|
return (doit &&
|
||||||
|
(isatty(STDOUT_FILENO) || getenv("CLICOLOR_FORCE")));
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
do_color(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
#ifdef COLORLS
|
||||||
|
if (colorflag == COLORFLAG_NEVER)
|
||||||
|
return (false);
|
||||||
|
else if (colorflag == COLORFLAG_ALWAYS)
|
||||||
|
return (true);
|
||||||
|
#endif
|
||||||
|
return (do_color_from_env());
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
main(int argc, char *argv[])
|
main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
@ -163,7 +211,7 @@ main(int argc, char *argv[])
|
|||||||
#ifdef COLORLS
|
#ifdef COLORLS
|
||||||
char termcapbuf[1024]; /* termcap definition buffer */
|
char termcapbuf[1024]; /* termcap definition buffer */
|
||||||
char tcapbuf[512]; /* capability buffer */
|
char tcapbuf[512]; /* capability buffer */
|
||||||
char *bp = tcapbuf;
|
char *bp = tcapbuf, *term;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
(void)setlocale(LC_ALL, "");
|
(void)setlocale(LC_ALL, "");
|
||||||
@ -191,8 +239,9 @@ main(int argc, char *argv[])
|
|||||||
fts_options = FTS_PHYSICAL;
|
fts_options = FTS_PHYSICAL;
|
||||||
if (getenv("LS_SAMESORT"))
|
if (getenv("LS_SAMESORT"))
|
||||||
f_samesort = 1;
|
f_samesort = 1;
|
||||||
while ((ch = getopt(argc, argv,
|
while ((ch = getopt_long(argc, argv,
|
||||||
"1ABCD:FGHILPRSTUWXZabcdfghiklmnopqrstuwxy,")) != -1) {
|
"+1ABCD:FGHILPRSTUWXZabcdfghiklmnopqrstuwxy,", long_opts,
|
||||||
|
NULL)) != -1) {
|
||||||
switch (ch) {
|
switch (ch) {
|
||||||
/*
|
/*
|
||||||
* The -1, -C, -x and -l options all override each other so
|
* The -1, -C, -x and -l options all override each other so
|
||||||
@ -355,6 +404,19 @@ main(int argc, char *argv[])
|
|||||||
case 'y':
|
case 'y':
|
||||||
f_samesort = 1;
|
f_samesort = 1;
|
||||||
break;
|
break;
|
||||||
|
#ifdef COLORLS
|
||||||
|
case COLOR_OPT:
|
||||||
|
if (optarg == NULL || strcmp(optarg, "always") == 0)
|
||||||
|
colorflag = COLORFLAG_ALWAYS;
|
||||||
|
else if (strcmp(optarg, "auto") == 0)
|
||||||
|
colorflag = COLORFLAG_AUTO;
|
||||||
|
else if (strcmp(optarg, "never") == 0)
|
||||||
|
colorflag = COLORFLAG_NEVER;
|
||||||
|
else
|
||||||
|
errx(2, "unsupported --color value '%s' (must be always, auto, or never)",
|
||||||
|
optarg);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
default:
|
default:
|
||||||
case '?':
|
case '?':
|
||||||
usage();
|
usage();
|
||||||
@ -367,11 +429,14 @@ main(int argc, char *argv[])
|
|||||||
if (!f_listdot && getuid() == (uid_t)0 && !f_noautodot)
|
if (!f_listdot && getuid() == (uid_t)0 && !f_noautodot)
|
||||||
f_listdot = 1;
|
f_listdot = 1;
|
||||||
|
|
||||||
/* Enabling of colours is conditional on the environment. */
|
/*
|
||||||
if ((getenv("CLICOLOR") || getenv("COLORTERM")) &&
|
* Enabling of colours is conditional on the environment in conjunction
|
||||||
(isatty(STDOUT_FILENO) || getenv("CLICOLOR_FORCE")))
|
* with the --color and -G arguments, if supplied.
|
||||||
|
*/
|
||||||
|
if (do_color()) {
|
||||||
#ifdef COLORLS
|
#ifdef COLORLS
|
||||||
if (tgetent(termcapbuf, getenv("TERM")) == 1) {
|
if ((term = getenv("TERM")) != NULL &&
|
||||||
|
tgetent(termcapbuf, term) == 1) {
|
||||||
ansi_fgcol = tgetstr("AF", &bp);
|
ansi_fgcol = tgetstr("AF", &bp);
|
||||||
ansi_bgcol = tgetstr("AB", &bp);
|
ansi_bgcol = tgetstr("AB", &bp);
|
||||||
attrs_off = tgetstr("me", &bp);
|
attrs_off = tgetstr("me", &bp);
|
||||||
@ -385,10 +450,19 @@ main(int argc, char *argv[])
|
|||||||
ansi_coloff = tgetstr("oc", &bp);
|
ansi_coloff = tgetstr("oc", &bp);
|
||||||
if (ansi_fgcol && ansi_bgcol && ansi_coloff)
|
if (ansi_fgcol && ansi_bgcol && ansi_coloff)
|
||||||
f_color = 1;
|
f_color = 1;
|
||||||
|
} else if (colorflag == COLORFLAG_ALWAYS) {
|
||||||
|
/*
|
||||||
|
* If we're *always* doing color but we don't have
|
||||||
|
* a functional TERM supplied, we'll fallback to
|
||||||
|
* outputting raw ANSI sequences.
|
||||||
|
*/
|
||||||
|
f_color = 1;
|
||||||
|
explicitansi = true;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
warnx("color support not compiled in");
|
warnx("color support not compiled in");
|
||||||
#endif /*COLORLS*/
|
#endif /*COLORLS*/
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef COLORLS
|
#ifdef COLORLS
|
||||||
if (f_color) {
|
if (f_color) {
|
||||||
|
@ -73,6 +73,8 @@ static void printtime(time_t);
|
|||||||
static int printtype(u_int);
|
static int printtype(u_int);
|
||||||
static void printsize(size_t, off_t);
|
static void printsize(size_t, off_t);
|
||||||
#ifdef COLORLS
|
#ifdef COLORLS
|
||||||
|
static void endcolor_termcap(int);
|
||||||
|
static void endcolor_ansi(void);
|
||||||
static void endcolor(int);
|
static void endcolor(int);
|
||||||
static int colortype(mode_t);
|
static int colortype(mode_t);
|
||||||
#endif
|
#endif
|
||||||
@ -540,7 +542,7 @@ writech(int c)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
printcolor(Colors c)
|
printcolor_termcap(Colors c)
|
||||||
{
|
{
|
||||||
char *ansiseq;
|
char *ansiseq;
|
||||||
|
|
||||||
@ -560,12 +562,55 @@ printcolor(Colors c)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
endcolor(int sig)
|
printcolor_ansi(Colors c)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
printf("\033[");
|
||||||
|
|
||||||
|
if (colors[c].bold)
|
||||||
|
printf("1");
|
||||||
|
if (colors[c].num[0] != -1)
|
||||||
|
printf(";3%d", colors[c].num[0]);
|
||||||
|
if (colors[c].num[1] != -1)
|
||||||
|
printf(";4%d", colors[c].num[1]);
|
||||||
|
printf("m");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
printcolor(Colors c)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (explicitansi)
|
||||||
|
printcolor_ansi(c);
|
||||||
|
else
|
||||||
|
printcolor_termcap(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
endcolor_termcap(int sig)
|
||||||
|
{
|
||||||
|
|
||||||
tputs(ansi_coloff, 1, sig ? writech : putch);
|
tputs(ansi_coloff, 1, sig ? writech : putch);
|
||||||
tputs(attrs_off, 1, sig ? writech : putch);
|
tputs(attrs_off, 1, sig ? writech : putch);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
endcolor_ansi(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
printf("\33[m");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
endcolor(int sig)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (explicitansi)
|
||||||
|
endcolor_ansi();
|
||||||
|
else
|
||||||
|
endcolor_termcap(sig);
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
colortype(mode_t mode)
|
colortype(mode_t mode)
|
||||||
{
|
{
|
||||||
|
@ -227,7 +227,7 @@ usage(void)
|
|||||||
{
|
{
|
||||||
(void)fprintf(stderr,
|
(void)fprintf(stderr,
|
||||||
#ifdef COLORLS
|
#ifdef COLORLS
|
||||||
"usage: ls [-ABCFGHILPRSTUWZabcdfghiklmnopqrstuwxy1,] [-D format]"
|
"usage: ls [-ABCFGHILPRSTUWZabcdfghiklmnopqrstuwxy1,] [--color=when] [-D format]"
|
||||||
#else
|
#else
|
||||||
"usage: ls [-ABCFHILPRSTUWZabcdfghiklmnopqrstuwxy1,] [-D format]"
|
"usage: ls [-ABCFHILPRSTUWZabcdfghiklmnopqrstuwxy1,] [-D format]"
|
||||||
#endif
|
#endif
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
.include <src.opts.mk>
|
.include <src.opts.mk>
|
||||||
|
|
||||||
|
CONFS= profile
|
||||||
PACKAGE=runtime
|
PACKAGE=runtime
|
||||||
PROG= sh
|
PROG= sh
|
||||||
INSTALLFLAGS= -S
|
INSTALLFLAGS= -S
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
'\" te
|
|
||||||
.\" CDDL HEADER START
|
.\" CDDL HEADER START
|
||||||
.\"
|
.\"
|
||||||
.\" The contents of this file are subject to the terms of the
|
.\" The contents of this file are subject to the terms of the
|
||||||
@ -21,7 +20,7 @@
|
|||||||
.\"
|
.\"
|
||||||
.\" $FreeBSD$
|
.\" $FreeBSD$
|
||||||
.\"
|
.\"
|
||||||
.Dd April 18, 2015
|
.Dd August 16, 2018
|
||||||
.Dt DTRACE 1
|
.Dt DTRACE 1
|
||||||
.Os
|
.Os
|
||||||
.Sh NAME
|
.Sh NAME
|
||||||
@ -523,6 +522,116 @@ Enable or modify a DTrace runtime option or D compiler option.
|
|||||||
Boolean options are enabled by specifying their name.
|
Boolean options are enabled by specifying their name.
|
||||||
Options with values are set by separating the option name and value with an
|
Options with values are set by separating the option name and value with an
|
||||||
equals sign (=).
|
equals sign (=).
|
||||||
|
.Pp
|
||||||
|
A
|
||||||
|
.Ar size
|
||||||
|
argument may be suffixed with one of
|
||||||
|
.Cm K ,
|
||||||
|
.Cm M ,
|
||||||
|
.Cm G
|
||||||
|
or
|
||||||
|
.Cm T
|
||||||
|
(either upper or lower case) to indicate a multiple of
|
||||||
|
Kilobytes, Megabytes, Gigabytes or Terabytes
|
||||||
|
respectively.
|
||||||
|
.Pp
|
||||||
|
A
|
||||||
|
.Ar time
|
||||||
|
argument may be suffixed with one of
|
||||||
|
.Cm ns ,
|
||||||
|
.Cm nsec ,
|
||||||
|
.Cm us ,
|
||||||
|
.Cm usec ,
|
||||||
|
.Cm ms ,
|
||||||
|
.Cm msec ,
|
||||||
|
.Cm s ,
|
||||||
|
.Cm sec ,
|
||||||
|
.Cm m ,
|
||||||
|
.Cm min ,
|
||||||
|
.Cm h ,
|
||||||
|
.Cm hour ,
|
||||||
|
.Cm d ,
|
||||||
|
.Cm day ,
|
||||||
|
.Cm hz .
|
||||||
|
If no suffix is specified
|
||||||
|
.Cm hz
|
||||||
|
will be used as the unit.
|
||||||
|
.Bl -tag -width indent
|
||||||
|
.It Sy aggrate Ns = Ns Ar time
|
||||||
|
Rate of aggregation reading.
|
||||||
|
.It Sy aggsize Ns = Ns Ar size
|
||||||
|
Size of the aggregation buffer.
|
||||||
|
.It Sy bufpolicy Ns = Ns Cm fill Ns | Ns Cm switch Ns | Ns Cm ring
|
||||||
|
Specifies the buffer policy for the principal buffer.
|
||||||
|
.It Sy bufresize Ns = Ns Cm auto Ns | Ns Cm manual
|
||||||
|
Buffer resizing policy.
|
||||||
|
.It Sy bufsize Ns = Ns Ar size
|
||||||
|
Size of the per-CPU principal buffer.
|
||||||
|
Same as the
|
||||||
|
.Fl b
|
||||||
|
flag.
|
||||||
|
.It Sy cleanrate Ns = Ns Ar time
|
||||||
|
Cleaning rate.
|
||||||
|
Must be specified in number-per-second with the
|
||||||
|
.Dq Li hz
|
||||||
|
suffix.
|
||||||
|
.It Sy cpu Ns = Ns Ar scalar
|
||||||
|
Specifies the CPU on which to enable tracing.
|
||||||
|
.It Sy defaultargs
|
||||||
|
Allow references to unspecified macro arguments.
|
||||||
|
.It Sy destructive
|
||||||
|
Allow destructive actions.
|
||||||
|
Same as the
|
||||||
|
.Fl w
|
||||||
|
flag.
|
||||||
|
.It Sy dynvarsize Ns = Ns Ar size
|
||||||
|
Size of the dynamic variable space.
|
||||||
|
.It Sy flowindent
|
||||||
|
Turn on flow indentation.
|
||||||
|
Same as the
|
||||||
|
.Fl F
|
||||||
|
flag.
|
||||||
|
.It Sy grabanon
|
||||||
|
Claim anonymous state.
|
||||||
|
Same as the
|
||||||
|
.Fl a
|
||||||
|
flag.
|
||||||
|
.It Sy jstackframes Ns = Ns Ar scalar
|
||||||
|
Number of default stack frames for
|
||||||
|
.Fn jstack .
|
||||||
|
.It Sy jstackstrsize Ns = Ns Ar scalar
|
||||||
|
Default string space size for
|
||||||
|
.Fn jstack .
|
||||||
|
.It Sy nspec Ns = Ns Ar scalar
|
||||||
|
Number of speculations.
|
||||||
|
.It Sy quiet
|
||||||
|
Set quiet mode.
|
||||||
|
Same as the
|
||||||
|
.Fl q
|
||||||
|
flag.
|
||||||
|
.It Sy specsize Ns = Ns Ar size
|
||||||
|
Size of the speculation buffer.
|
||||||
|
.It Sy strsize Ns = Ns Ar size
|
||||||
|
Maximum size of strings.
|
||||||
|
.It Sy stackframes Ns = Ns Ar scalar
|
||||||
|
Maximum number of kernelspace stack frames to unwind when executing the
|
||||||
|
.Fn stack
|
||||||
|
action.
|
||||||
|
.It Sy stackindent Ns = Ns Ar scalar
|
||||||
|
Number of whitespace characters to use when indenting
|
||||||
|
.Fn stack
|
||||||
|
and
|
||||||
|
.Fn ustack
|
||||||
|
output.
|
||||||
|
.It Sy statusrate Ns = Ns Ar time
|
||||||
|
Rate of status checking.
|
||||||
|
.It Sy switchrate Ns = Ns Ar time
|
||||||
|
Rate of buffer switching.
|
||||||
|
.It Sy ustackframes Ns = Ns Ar scalar
|
||||||
|
Maximum number of userspace stack frames to unwind when executing the
|
||||||
|
.Fn ustack
|
||||||
|
action.
|
||||||
|
.El
|
||||||
.It Fl X Cm a | c | s | t
|
.It Fl X Cm a | c | s | t
|
||||||
Specify the degree of conformance to the ISO C standard that should be selected
|
Specify the degree of conformance to the ISO C standard that should be selected
|
||||||
when invoking
|
when invoking
|
||||||
|
@ -2096,7 +2096,7 @@ dump_object(objset_t *os, uint64_t object, int verbosity, int *print_header)
|
|||||||
dnode_t *dn;
|
dnode_t *dn;
|
||||||
void *bonus = NULL;
|
void *bonus = NULL;
|
||||||
size_t bsize = 0;
|
size_t bsize = 0;
|
||||||
char iblk[32], dblk[32], lsize[32], asize[32], fill[32];
|
char iblk[32], dblk[32], lsize[32], asize[32], fill[32], dnsize[32];
|
||||||
char bonus_size[32];
|
char bonus_size[32];
|
||||||
char aux[50];
|
char aux[50];
|
||||||
int error;
|
int error;
|
||||||
@ -2109,9 +2109,9 @@ dump_object(objset_t *os, uint64_t object, int verbosity, int *print_header)
|
|||||||
CTASSERT(sizeof (bonus_size) >= NN_NUMBUF_SZ);
|
CTASSERT(sizeof (bonus_size) >= NN_NUMBUF_SZ);
|
||||||
|
|
||||||
if (*print_header) {
|
if (*print_header) {
|
||||||
(void) printf("\n%10s %3s %5s %5s %5s %5s %6s %s\n",
|
(void) printf("\n%10s %3s %5s %5s %5s %6s %5s %6s %s\n",
|
||||||
"Object", "lvl", "iblk", "dblk", "dsize", "lsize",
|
"Object", "lvl", "iblk", "dblk", "dsize", "dnsize",
|
||||||
"%full", "type");
|
"lsize", "%full", "type");
|
||||||
*print_header = 0;
|
*print_header = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2133,6 +2133,7 @@ dump_object(objset_t *os, uint64_t object, int verbosity, int *print_header)
|
|||||||
zdb_nicenum(doi.doi_max_offset, lsize, sizeof (lsize));
|
zdb_nicenum(doi.doi_max_offset, lsize, sizeof (lsize));
|
||||||
zdb_nicenum(doi.doi_physical_blocks_512 << 9, asize, sizeof (asize));
|
zdb_nicenum(doi.doi_physical_blocks_512 << 9, asize, sizeof (asize));
|
||||||
zdb_nicenum(doi.doi_bonus_size, bonus_size, sizeof (bonus_size));
|
zdb_nicenum(doi.doi_bonus_size, bonus_size, sizeof (bonus_size));
|
||||||
|
zdb_nicenum(doi.doi_dnodesize, dnsize, sizeof (dnsize));
|
||||||
(void) sprintf(fill, "%6.2f", 100.0 * doi.doi_fill_count *
|
(void) sprintf(fill, "%6.2f", 100.0 * doi.doi_fill_count *
|
||||||
doi.doi_data_block_size / (object == 0 ? DNODES_PER_BLOCK : 1) /
|
doi.doi_data_block_size / (object == 0 ? DNODES_PER_BLOCK : 1) /
|
||||||
doi.doi_max_offset);
|
doi.doi_max_offset);
|
||||||
@ -2149,13 +2150,13 @@ dump_object(objset_t *os, uint64_t object, int verbosity, int *print_header)
|
|||||||
ZDB_COMPRESS_NAME(doi.doi_compress));
|
ZDB_COMPRESS_NAME(doi.doi_compress));
|
||||||
}
|
}
|
||||||
|
|
||||||
(void) printf("%10lld %3u %5s %5s %5s %5s %6s %s%s\n",
|
(void) printf("%10lld %3u %5s %5s %5s %6s %5s %6s %s%s\n",
|
||||||
(u_longlong_t)object, doi.doi_indirection, iblk, dblk,
|
(u_longlong_t)object, doi.doi_indirection, iblk, dblk,
|
||||||
asize, lsize, fill, ZDB_OT_NAME(doi.doi_type), aux);
|
asize, dnsize, lsize, fill, ZDB_OT_NAME(doi.doi_type), aux);
|
||||||
|
|
||||||
if (doi.doi_bonus_type != DMU_OT_NONE && verbosity > 3) {
|
if (doi.doi_bonus_type != DMU_OT_NONE && verbosity > 3) {
|
||||||
(void) printf("%10s %3s %5s %5s %5s %5s %6s %s\n",
|
(void) printf("%10s %3s %5s %5s %5s %5s %5s %6s %s\n",
|
||||||
"", "", "", "", "", bonus_size, "bonus",
|
"", "", "", "", "", "", bonus_size, "bonus",
|
||||||
ZDB_OT_NAME(doi.doi_bonus_type));
|
ZDB_OT_NAME(doi.doi_bonus_type));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -84,8 +84,10 @@ zil_prt_rec_create(zilog_t *zilog, int txtype, void *arg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
(void) printf("%s%s", tab_prefix, ctime(&crtime));
|
(void) printf("%s%s", tab_prefix, ctime(&crtime));
|
||||||
(void) printf("%sdoid %llu, foid %llu, mode %llo\n", tab_prefix,
|
(void) printf("%sdoid %llu, foid %llu, slots %llu, mode %llo\n", tab_prefix,
|
||||||
(u_longlong_t)lr->lr_doid, (u_longlong_t)lr->lr_foid,
|
(u_longlong_t)lr->lr_doid,
|
||||||
|
(u_longlong_t)LR_FOID_GET_OBJ(lr->lr_foid),
|
||||||
|
(u_longlong_t)LR_FOID_GET_SLOTS(lr->lr_foid),
|
||||||
(longlong_t)lr->lr_mode);
|
(longlong_t)lr->lr_mode);
|
||||||
(void) printf("%suid %llu, gid %llu, gen %llu, rdev 0x%llx\n",
|
(void) printf("%suid %llu, gid %llu, gen %llu, rdev 0x%llx\n",
|
||||||
tab_prefix,
|
tab_prefix,
|
||||||
|
@ -32,7 +32,7 @@
|
|||||||
.\"
|
.\"
|
||||||
.\" $FreeBSD$
|
.\" $FreeBSD$
|
||||||
.\"
|
.\"
|
||||||
.Dd December 6, 2017
|
.Dd August 11, 2018
|
||||||
.Dt ZFS 8
|
.Dt ZFS 8
|
||||||
.Os
|
.Os
|
||||||
.Sh NAME
|
.Sh NAME
|
||||||
@ -462,8 +462,11 @@ responsible for mounting and unmounting the file system.
|
|||||||
dataset can be attached to a jail by using the
|
dataset can be attached to a jail by using the
|
||||||
.Qq Nm Cm jail
|
.Qq Nm Cm jail
|
||||||
subcommand. You cannot attach a dataset to one jail and the children of the
|
subcommand. You cannot attach a dataset to one jail and the children of the
|
||||||
same dataset to another jails. To allow management of the dataset from within
|
same dataset to another jail. You can also not attach the root file system
|
||||||
a jail, the
|
of the jail or any dataset which needs to be mounted before the zfs rc script
|
||||||
|
is run inside the jail, as it would be attached unmounted until it is
|
||||||
|
mounted from the rc script inside the jail. To allow management of the
|
||||||
|
dataset from within a jail, the
|
||||||
.Sy jailed
|
.Sy jailed
|
||||||
property has to be set and the jail needs access to the
|
property has to be set and the jail needs access to the
|
||||||
.Pa /dev/zfs
|
.Pa /dev/zfs
|
||||||
|
@ -226,6 +226,7 @@ typedef struct ztest_block_tag {
|
|||||||
uint64_t bt_magic;
|
uint64_t bt_magic;
|
||||||
uint64_t bt_objset;
|
uint64_t bt_objset;
|
||||||
uint64_t bt_object;
|
uint64_t bt_object;
|
||||||
|
uint64_t bt_dnodesize;
|
||||||
uint64_t bt_offset;
|
uint64_t bt_offset;
|
||||||
uint64_t bt_gen;
|
uint64_t bt_gen;
|
||||||
uint64_t bt_txg;
|
uint64_t bt_txg;
|
||||||
@ -274,6 +275,7 @@ typedef struct ztest_od {
|
|||||||
dmu_object_type_t od_crtype;
|
dmu_object_type_t od_crtype;
|
||||||
uint64_t od_blocksize;
|
uint64_t od_blocksize;
|
||||||
uint64_t od_crblocksize;
|
uint64_t od_crblocksize;
|
||||||
|
uint64_t od_crdnodesize;
|
||||||
uint64_t od_gen;
|
uint64_t od_gen;
|
||||||
uint64_t od_crgen;
|
uint64_t od_crgen;
|
||||||
char od_name[ZFS_MAX_DATASET_NAME_LEN];
|
char od_name[ZFS_MAX_DATASET_NAME_LEN];
|
||||||
@ -350,6 +352,7 @@ ztest_func_t ztest_device_removal;
|
|||||||
ztest_func_t ztest_remap_blocks;
|
ztest_func_t ztest_remap_blocks;
|
||||||
ztest_func_t ztest_spa_checkpoint_create_discard;
|
ztest_func_t ztest_spa_checkpoint_create_discard;
|
||||||
ztest_func_t ztest_initialize;
|
ztest_func_t ztest_initialize;
|
||||||
|
ztest_func_t ztest_verify_dnode_bt;
|
||||||
|
|
||||||
uint64_t zopt_always = 0ULL * NANOSEC; /* all the time */
|
uint64_t zopt_always = 0ULL * NANOSEC; /* all the time */
|
||||||
uint64_t zopt_incessant = 1ULL * NANOSEC / 10; /* every 1/10 second */
|
uint64_t zopt_incessant = 1ULL * NANOSEC / 10; /* every 1/10 second */
|
||||||
@ -394,7 +397,8 @@ ztest_info_t ztest_info[] = {
|
|||||||
{ ztest_device_removal, 1, &zopt_sometimes },
|
{ ztest_device_removal, 1, &zopt_sometimes },
|
||||||
{ ztest_remap_blocks, 1, &zopt_sometimes },
|
{ ztest_remap_blocks, 1, &zopt_sometimes },
|
||||||
{ ztest_spa_checkpoint_create_discard, 1, &zopt_rarely },
|
{ ztest_spa_checkpoint_create_discard, 1, &zopt_rarely },
|
||||||
{ ztest_initialize, 1, &zopt_sometimes }
|
{ ztest_initialize, 1, &zopt_sometimes },
|
||||||
|
{ ztest_verify_dnode_bt, 1, &zopt_sometimes }
|
||||||
};
|
};
|
||||||
|
|
||||||
#define ZTEST_FUNCS (sizeof (ztest_info) / sizeof (ztest_info_t))
|
#define ZTEST_FUNCS (sizeof (ztest_info) / sizeof (ztest_info_t))
|
||||||
@ -440,8 +444,8 @@ static spa_t *ztest_spa = NULL;
|
|||||||
static ztest_ds_t *ztest_ds;
|
static ztest_ds_t *ztest_ds;
|
||||||
|
|
||||||
static kmutex_t ztest_vdev_lock;
|
static kmutex_t ztest_vdev_lock;
|
||||||
static kmutex_t ztest_checkpoint_lock;
|
|
||||||
static boolean_t ztest_device_removal_active = B_FALSE;
|
static boolean_t ztest_device_removal_active = B_FALSE;
|
||||||
|
static kmutex_t ztest_checkpoint_lock;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The ztest_name_lock protects the pool and dataset namespace used by
|
* The ztest_name_lock protects the pool and dataset namespace used by
|
||||||
@ -1010,6 +1014,36 @@ ztest_random_blocksize(void)
|
|||||||
return (1 << (SPA_MINBLOCKSHIFT + block_shift));
|
return (1 << (SPA_MINBLOCKSHIFT + block_shift));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
ztest_random_dnodesize(void)
|
||||||
|
{
|
||||||
|
int slots;
|
||||||
|
int max_slots = spa_maxdnodesize(ztest_spa) >> DNODE_SHIFT;
|
||||||
|
|
||||||
|
if (max_slots == DNODE_MIN_SLOTS)
|
||||||
|
return (DNODE_MIN_SIZE);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Weight the random distribution more heavily toward smaller
|
||||||
|
* dnode sizes since that is more likely to reflect real-world
|
||||||
|
* usage.
|
||||||
|
*/
|
||||||
|
ASSERT3U(max_slots, >, 4);
|
||||||
|
switch (ztest_random(10)) {
|
||||||
|
case 0:
|
||||||
|
slots = 5 + ztest_random(max_slots - 4);
|
||||||
|
break;
|
||||||
|
case 1 ... 4:
|
||||||
|
slots = 2 + ztest_random(3);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
slots = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (slots << DNODE_SHIFT);
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
ztest_random_ibshift(void)
|
ztest_random_ibshift(void)
|
||||||
{
|
{
|
||||||
@ -1287,11 +1321,13 @@ ztest_pattern_match(void *buf, uint64_t size, uint64_t value)
|
|||||||
|
|
||||||
static void
|
static void
|
||||||
ztest_bt_generate(ztest_block_tag_t *bt, objset_t *os, uint64_t object,
|
ztest_bt_generate(ztest_block_tag_t *bt, objset_t *os, uint64_t object,
|
||||||
uint64_t offset, uint64_t gen, uint64_t txg, uint64_t crtxg)
|
uint64_t dnodesize, uint64_t offset, uint64_t gen, uint64_t txg,
|
||||||
|
uint64_t crtxg)
|
||||||
{
|
{
|
||||||
bt->bt_magic = BT_MAGIC;
|
bt->bt_magic = BT_MAGIC;
|
||||||
bt->bt_objset = dmu_objset_id(os);
|
bt->bt_objset = dmu_objset_id(os);
|
||||||
bt->bt_object = object;
|
bt->bt_object = object;
|
||||||
|
bt->bt_dnodesize = dnodesize;
|
||||||
bt->bt_offset = offset;
|
bt->bt_offset = offset;
|
||||||
bt->bt_gen = gen;
|
bt->bt_gen = gen;
|
||||||
bt->bt_txg = txg;
|
bt->bt_txg = txg;
|
||||||
@ -1300,11 +1336,13 @@ ztest_bt_generate(ztest_block_tag_t *bt, objset_t *os, uint64_t object,
|
|||||||
|
|
||||||
static void
|
static void
|
||||||
ztest_bt_verify(ztest_block_tag_t *bt, objset_t *os, uint64_t object,
|
ztest_bt_verify(ztest_block_tag_t *bt, objset_t *os, uint64_t object,
|
||||||
uint64_t offset, uint64_t gen, uint64_t txg, uint64_t crtxg)
|
uint64_t dnodesize, uint64_t offset, uint64_t gen, uint64_t txg,
|
||||||
|
uint64_t crtxg)
|
||||||
{
|
{
|
||||||
ASSERT3U(bt->bt_magic, ==, BT_MAGIC);
|
ASSERT3U(bt->bt_magic, ==, BT_MAGIC);
|
||||||
ASSERT3U(bt->bt_objset, ==, dmu_objset_id(os));
|
ASSERT3U(bt->bt_objset, ==, dmu_objset_id(os));
|
||||||
ASSERT3U(bt->bt_object, ==, object);
|
ASSERT3U(bt->bt_object, ==, object);
|
||||||
|
ASSERT3U(bt->bt_dnodesize, ==, dnodesize);
|
||||||
ASSERT3U(bt->bt_offset, ==, offset);
|
ASSERT3U(bt->bt_offset, ==, offset);
|
||||||
ASSERT3U(bt->bt_gen, <=, gen);
|
ASSERT3U(bt->bt_gen, <=, gen);
|
||||||
ASSERT3U(bt->bt_txg, <=, txg);
|
ASSERT3U(bt->bt_txg, <=, txg);
|
||||||
@ -1325,6 +1363,52 @@ ztest_bt_bonus(dmu_buf_t *db)
|
|||||||
return (bt);
|
return (bt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Generate a token to fill up unused bonus buffer space. Try to make
|
||||||
|
* it unique to the object, generation, and offset to verify that data
|
||||||
|
* is not getting overwritten by data from other dnodes.
|
||||||
|
*/
|
||||||
|
#define ZTEST_BONUS_FILL_TOKEN(obj, ds, gen, offset) \
|
||||||
|
(((ds) << 48) | ((gen) << 32) | ((obj) << 8) | (offset))
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Fill up the unused bonus buffer region before the block tag with a
|
||||||
|
* verifiable pattern. Filling the whole bonus area with non-zero data
|
||||||
|
* helps ensure that all dnode traversal code properly skips the
|
||||||
|
* interior regions of large dnodes.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
ztest_fill_unused_bonus(dmu_buf_t *db, void *end, uint64_t obj,
|
||||||
|
objset_t *os, uint64_t gen)
|
||||||
|
{
|
||||||
|
uint64_t *bonusp;
|
||||||
|
|
||||||
|
ASSERT(IS_P2ALIGNED((char *)end - (char *)db->db_data, 8));
|
||||||
|
|
||||||
|
for (bonusp = db->db_data; bonusp < (uint64_t *)end; bonusp++) {
|
||||||
|
uint64_t token = ZTEST_BONUS_FILL_TOKEN(obj, dmu_objset_id(os),
|
||||||
|
gen, bonusp - (uint64_t *)db->db_data);
|
||||||
|
*bonusp = token;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Verify that the unused area of a bonus buffer is filled with the
|
||||||
|
* expected tokens.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
ztest_verify_unused_bonus(dmu_buf_t *db, void *end, uint64_t obj,
|
||||||
|
objset_t *os, uint64_t gen)
|
||||||
|
{
|
||||||
|
uint64_t *bonusp;
|
||||||
|
|
||||||
|
for (bonusp = db->db_data; bonusp < (uint64_t *)end; bonusp++) {
|
||||||
|
uint64_t token = ZTEST_BONUS_FILL_TOKEN(obj, dmu_objset_id(os),
|
||||||
|
gen, bonusp - (uint64_t *)db->db_data);
|
||||||
|
VERIFY3U(*bonusp, ==, token);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ZIL logging ops
|
* ZIL logging ops
|
||||||
*/
|
*/
|
||||||
@ -1333,7 +1417,7 @@ ztest_bt_bonus(dmu_buf_t *db)
|
|||||||
#define lrz_blocksize lr_uid
|
#define lrz_blocksize lr_uid
|
||||||
#define lrz_ibshift lr_gid
|
#define lrz_ibshift lr_gid
|
||||||
#define lrz_bonustype lr_rdev
|
#define lrz_bonustype lr_rdev
|
||||||
#define lrz_bonuslen lr_crtime[1]
|
#define lrz_dnodesize lr_crtime[1]
|
||||||
|
|
||||||
static void
|
static void
|
||||||
ztest_log_create(ztest_ds_t *zd, dmu_tx_t *tx, lr_create_t *lr)
|
ztest_log_create(ztest_ds_t *zd, dmu_tx_t *tx, lr_create_t *lr)
|
||||||
@ -1449,6 +1533,7 @@ ztest_replay_create(void *arg1, void *arg2, boolean_t byteswap)
|
|||||||
dmu_tx_t *tx;
|
dmu_tx_t *tx;
|
||||||
uint64_t txg;
|
uint64_t txg;
|
||||||
int error = 0;
|
int error = 0;
|
||||||
|
int bonuslen;
|
||||||
|
|
||||||
if (byteswap)
|
if (byteswap)
|
||||||
byteswap_uint64_array(lr, sizeof (*lr));
|
byteswap_uint64_array(lr, sizeof (*lr));
|
||||||
@ -1471,26 +1556,27 @@ ztest_replay_create(void *arg1, void *arg2, boolean_t byteswap)
|
|||||||
return (ENOSPC);
|
return (ENOSPC);
|
||||||
|
|
||||||
ASSERT(dmu_objset_zil(os)->zl_replay == !!lr->lr_foid);
|
ASSERT(dmu_objset_zil(os)->zl_replay == !!lr->lr_foid);
|
||||||
|
bonuslen = DN_BONUS_SIZE(lr->lrz_dnodesize);
|
||||||
|
|
||||||
if (lr->lrz_type == DMU_OT_ZAP_OTHER) {
|
if (lr->lrz_type == DMU_OT_ZAP_OTHER) {
|
||||||
if (lr->lr_foid == 0) {
|
if (lr->lr_foid == 0) {
|
||||||
lr->lr_foid = zap_create(os,
|
lr->lr_foid = zap_create_dnsize(os,
|
||||||
lr->lrz_type, lr->lrz_bonustype,
|
lr->lrz_type, lr->lrz_bonustype,
|
||||||
lr->lrz_bonuslen, tx);
|
bonuslen, lr->lrz_dnodesize, tx);
|
||||||
} else {
|
} else {
|
||||||
error = zap_create_claim(os, lr->lr_foid,
|
error = zap_create_claim_dnsize(os, lr->lr_foid,
|
||||||
lr->lrz_type, lr->lrz_bonustype,
|
lr->lrz_type, lr->lrz_bonustype,
|
||||||
lr->lrz_bonuslen, tx);
|
bonuslen, lr->lrz_dnodesize, tx);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (lr->lr_foid == 0) {
|
if (lr->lr_foid == 0) {
|
||||||
lr->lr_foid = dmu_object_alloc(os,
|
lr->lr_foid = dmu_object_alloc_dnsize(os,
|
||||||
lr->lrz_type, 0, lr->lrz_bonustype,
|
lr->lrz_type, 0, lr->lrz_bonustype,
|
||||||
lr->lrz_bonuslen, tx);
|
bonuslen, lr->lrz_dnodesize, tx);
|
||||||
} else {
|
} else {
|
||||||
error = dmu_object_claim(os, lr->lr_foid,
|
error = dmu_object_claim_dnsize(os, lr->lr_foid,
|
||||||
lr->lrz_type, 0, lr->lrz_bonustype,
|
lr->lrz_type, 0, lr->lrz_bonustype,
|
||||||
lr->lrz_bonuslen, tx);
|
bonuslen, lr->lrz_dnodesize, tx);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1510,7 +1596,9 @@ ztest_replay_create(void *arg1, void *arg2, boolean_t byteswap)
|
|||||||
VERIFY3U(0, ==, dmu_bonus_hold(os, lr->lr_foid, FTAG, &db));
|
VERIFY3U(0, ==, dmu_bonus_hold(os, lr->lr_foid, FTAG, &db));
|
||||||
bbt = ztest_bt_bonus(db);
|
bbt = ztest_bt_bonus(db);
|
||||||
dmu_buf_will_dirty(db, tx);
|
dmu_buf_will_dirty(db, tx);
|
||||||
ztest_bt_generate(bbt, os, lr->lr_foid, -1ULL, lr->lr_gen, txg, txg);
|
ztest_bt_generate(bbt, os, lr->lr_foid, lr->lrz_dnodesize, -1ULL,
|
||||||
|
lr->lr_gen, txg, txg);
|
||||||
|
ztest_fill_unused_bonus(db, bbt, lr->lr_foid, os, lr->lr_gen);
|
||||||
dmu_buf_rele(db, FTAG);
|
dmu_buf_rele(db, FTAG);
|
||||||
|
|
||||||
VERIFY3U(0, ==, zap_add(os, lr->lr_doid, name, sizeof (uint64_t), 1,
|
VERIFY3U(0, ==, zap_add(os, lr->lr_doid, name, sizeof (uint64_t), 1,
|
||||||
@ -1660,7 +1748,7 @@ ztest_replay_write(void *arg1, void *arg2, boolean_t byteswap)
|
|||||||
VERIFY(dmu_read(os, lr->lr_foid, offset,
|
VERIFY(dmu_read(os, lr->lr_foid, offset,
|
||||||
sizeof (rbt), &rbt, prefetch) == 0);
|
sizeof (rbt), &rbt, prefetch) == 0);
|
||||||
if (rbt.bt_magic == BT_MAGIC) {
|
if (rbt.bt_magic == BT_MAGIC) {
|
||||||
ztest_bt_verify(&rbt, os, lr->lr_foid,
|
ztest_bt_verify(&rbt, os, lr->lr_foid, 0,
|
||||||
offset, gen, txg, crtxg);
|
offset, gen, txg, crtxg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1672,7 +1760,7 @@ ztest_replay_write(void *arg1, void *arg2, boolean_t byteswap)
|
|||||||
* as it was when the write was generated.
|
* as it was when the write was generated.
|
||||||
*/
|
*/
|
||||||
if (zd->zd_zilog->zl_replay) {
|
if (zd->zd_zilog->zl_replay) {
|
||||||
ztest_bt_verify(bt, os, lr->lr_foid, offset,
|
ztest_bt_verify(bt, os, lr->lr_foid, 0, offset,
|
||||||
MAX(gen, bt->bt_gen), MAX(txg, lrtxg),
|
MAX(gen, bt->bt_gen), MAX(txg, lrtxg),
|
||||||
bt->bt_crtxg);
|
bt->bt_crtxg);
|
||||||
}
|
}
|
||||||
@ -1681,7 +1769,8 @@ ztest_replay_write(void *arg1, void *arg2, boolean_t byteswap)
|
|||||||
* Set the bt's gen/txg to the bonus buffer's gen/txg
|
* Set the bt's gen/txg to the bonus buffer's gen/txg
|
||||||
* so that all of the usual ASSERTs will work.
|
* so that all of the usual ASSERTs will work.
|
||||||
*/
|
*/
|
||||||
ztest_bt_generate(bt, os, lr->lr_foid, offset, gen, txg, crtxg);
|
ztest_bt_generate(bt, os, lr->lr_foid, 0, offset, gen, txg,
|
||||||
|
crtxg);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (abuf == NULL) {
|
if (abuf == NULL) {
|
||||||
@ -1753,7 +1842,7 @@ ztest_replay_setattr(void *arg1, void *arg2, boolean_t byteswap)
|
|||||||
dmu_tx_t *tx;
|
dmu_tx_t *tx;
|
||||||
dmu_buf_t *db;
|
dmu_buf_t *db;
|
||||||
ztest_block_tag_t *bbt;
|
ztest_block_tag_t *bbt;
|
||||||
uint64_t txg, lrtxg, crtxg;
|
uint64_t txg, lrtxg, crtxg, dnodesize;
|
||||||
|
|
||||||
if (byteswap)
|
if (byteswap)
|
||||||
byteswap_uint64_array(lr, sizeof (*lr));
|
byteswap_uint64_array(lr, sizeof (*lr));
|
||||||
@ -1776,6 +1865,7 @@ ztest_replay_setattr(void *arg1, void *arg2, boolean_t byteswap)
|
|||||||
ASSERT3U(bbt->bt_magic, ==, BT_MAGIC);
|
ASSERT3U(bbt->bt_magic, ==, BT_MAGIC);
|
||||||
crtxg = bbt->bt_crtxg;
|
crtxg = bbt->bt_crtxg;
|
||||||
lrtxg = lr->lr_common.lrc_txg;
|
lrtxg = lr->lr_common.lrc_txg;
|
||||||
|
dnodesize = bbt->bt_dnodesize;
|
||||||
|
|
||||||
if (zd->zd_zilog->zl_replay) {
|
if (zd->zd_zilog->zl_replay) {
|
||||||
ASSERT(lr->lr_size != 0);
|
ASSERT(lr->lr_size != 0);
|
||||||
@ -1794,7 +1884,7 @@ ztest_replay_setattr(void *arg1, void *arg2, boolean_t byteswap)
|
|||||||
/*
|
/*
|
||||||
* Verify that the current bonus buffer is not newer than our txg.
|
* Verify that the current bonus buffer is not newer than our txg.
|
||||||
*/
|
*/
|
||||||
ztest_bt_verify(bbt, os, lr->lr_foid, -1ULL, lr->lr_mode,
|
ztest_bt_verify(bbt, os, lr->lr_foid, dnodesize, -1ULL, lr->lr_mode,
|
||||||
MAX(txg, lrtxg), crtxg);
|
MAX(txg, lrtxg), crtxg);
|
||||||
|
|
||||||
dmu_buf_will_dirty(db, tx);
|
dmu_buf_will_dirty(db, tx);
|
||||||
@ -1804,8 +1894,9 @@ ztest_replay_setattr(void *arg1, void *arg2, boolean_t byteswap)
|
|||||||
VERIFY0(dmu_set_bonus(db, lr->lr_size, tx));
|
VERIFY0(dmu_set_bonus(db, lr->lr_size, tx));
|
||||||
bbt = ztest_bt_bonus(db);
|
bbt = ztest_bt_bonus(db);
|
||||||
|
|
||||||
ztest_bt_generate(bbt, os, lr->lr_foid, -1ULL, lr->lr_mode, txg, crtxg);
|
ztest_bt_generate(bbt, os, lr->lr_foid, dnodesize, -1ULL, lr->lr_mode,
|
||||||
|
txg, crtxg);
|
||||||
|
ztest_fill_unused_bonus(db, bbt, lr->lr_foid, os, bbt->bt_gen);
|
||||||
dmu_buf_rele(db, FTAG);
|
dmu_buf_rele(db, FTAG);
|
||||||
|
|
||||||
(void) ztest_log_setattr(zd, tx, lr);
|
(void) ztest_log_setattr(zd, tx, lr);
|
||||||
@ -2037,7 +2128,7 @@ ztest_create(ztest_ds_t *zd, ztest_od_t *od, int count)
|
|||||||
lr->lrz_blocksize = od->od_crblocksize;
|
lr->lrz_blocksize = od->od_crblocksize;
|
||||||
lr->lrz_ibshift = ztest_random_ibshift();
|
lr->lrz_ibshift = ztest_random_ibshift();
|
||||||
lr->lrz_bonustype = DMU_OT_UINT64_OTHER;
|
lr->lrz_bonustype = DMU_OT_UINT64_OTHER;
|
||||||
lr->lrz_bonuslen = dmu_bonus_max();
|
lr->lrz_dnodesize = od->od_crdnodesize;
|
||||||
lr->lr_gen = od->od_crgen;
|
lr->lr_gen = od->od_crgen;
|
||||||
lr->lr_crtime[0] = time(NULL);
|
lr->lr_crtime[0] = time(NULL);
|
||||||
|
|
||||||
@ -2216,7 +2307,8 @@ ztest_io(ztest_ds_t *zd, uint64_t object, uint64_t offset)
|
|||||||
switch (io_type) {
|
switch (io_type) {
|
||||||
|
|
||||||
case ZTEST_IO_WRITE_TAG:
|
case ZTEST_IO_WRITE_TAG:
|
||||||
ztest_bt_generate(&wbt, zd->zd_os, object, offset, 0, 0, 0);
|
ztest_bt_generate(&wbt, zd->zd_os, object, doi.doi_dnodesize,
|
||||||
|
offset, 0, 0, 0);
|
||||||
(void) ztest_write(zd, object, offset, sizeof (wbt), &wbt);
|
(void) ztest_write(zd, object, offset, sizeof (wbt), &wbt);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -2277,13 +2369,15 @@ ztest_io(ztest_ds_t *zd, uint64_t object, uint64_t offset)
|
|||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
ztest_od_init(ztest_od_t *od, uint64_t id, char *tag, uint64_t index,
|
ztest_od_init(ztest_od_t *od, uint64_t id, char *tag, uint64_t index,
|
||||||
dmu_object_type_t type, uint64_t blocksize, uint64_t gen)
|
dmu_object_type_t type, uint64_t blocksize, uint64_t dnodesize,
|
||||||
|
uint64_t gen)
|
||||||
{
|
{
|
||||||
od->od_dir = ZTEST_DIROBJ;
|
od->od_dir = ZTEST_DIROBJ;
|
||||||
od->od_object = 0;
|
od->od_object = 0;
|
||||||
|
|
||||||
od->od_crtype = type;
|
od->od_crtype = type;
|
||||||
od->od_crblocksize = blocksize ? blocksize : ztest_random_blocksize();
|
od->od_crblocksize = blocksize ? blocksize : ztest_random_blocksize();
|
||||||
|
od->od_crdnodesize = dnodesize ? dnodesize : ztest_random_dnodesize();
|
||||||
od->od_crgen = gen;
|
od->od_crgen = gen;
|
||||||
|
|
||||||
od->od_type = DMU_OT_NONE;
|
od->od_type = DMU_OT_NONE;
|
||||||
@ -3726,7 +3820,7 @@ ztest_dmu_object_alloc_free(ztest_ds_t *zd, uint64_t id)
|
|||||||
int batchsize = sizeof (od) / sizeof (od[0]);
|
int batchsize = sizeof (od) / sizeof (od[0]);
|
||||||
|
|
||||||
for (int b = 0; b < batchsize; b++)
|
for (int b = 0; b < batchsize; b++)
|
||||||
ztest_od_init(&od[b], id, FTAG, b, DMU_OT_UINT64_OTHER, 0, 0);
|
ztest_od_init(&od[b], id, FTAG, b, DMU_OT_UINT64_OTHER, 0, 0, 0);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Destroy the previous batch of objects, create a new batch,
|
* Destroy the previous batch of objects, create a new batch,
|
||||||
@ -3786,8 +3880,8 @@ ztest_dmu_read_write(ztest_ds_t *zd, uint64_t id)
|
|||||||
/*
|
/*
|
||||||
* Read the directory info. If it's the first time, set things up.
|
* Read the directory info. If it's the first time, set things up.
|
||||||
*/
|
*/
|
||||||
ztest_od_init(&od[0], id, FTAG, 0, DMU_OT_UINT64_OTHER, 0, chunksize);
|
ztest_od_init(&od[0], id, FTAG, 0, DMU_OT_UINT64_OTHER, 0, 0, chunksize);
|
||||||
ztest_od_init(&od[1], id, FTAG, 1, DMU_OT_UINT64_OTHER, 0, chunksize);
|
ztest_od_init(&od[1], id, FTAG, 1, DMU_OT_UINT64_OTHER, 0, 0, chunksize);
|
||||||
|
|
||||||
if (ztest_object_init(zd, od, sizeof (od), B_FALSE) != 0)
|
if (ztest_object_init(zd, od, sizeof (od), B_FALSE) != 0)
|
||||||
return;
|
return;
|
||||||
@ -4056,8 +4150,8 @@ ztest_dmu_read_write_zcopy(ztest_ds_t *zd, uint64_t id)
|
|||||||
/*
|
/*
|
||||||
* Read the directory info. If it's the first time, set things up.
|
* Read the directory info. If it's the first time, set things up.
|
||||||
*/
|
*/
|
||||||
ztest_od_init(&od[0], id, FTAG, 0, DMU_OT_UINT64_OTHER, blocksize, 0);
|
ztest_od_init(&od[0], id, FTAG, 0, DMU_OT_UINT64_OTHER, blocksize, 0, 0);
|
||||||
ztest_od_init(&od[1], id, FTAG, 1, DMU_OT_UINT64_OTHER, 0, chunksize);
|
ztest_od_init(&od[1], id, FTAG, 1, DMU_OT_UINT64_OTHER, 0, 0, chunksize);
|
||||||
|
|
||||||
if (ztest_object_init(zd, od, sizeof (od), B_FALSE) != 0)
|
if (ztest_object_init(zd, od, sizeof (od), B_FALSE) != 0)
|
||||||
return;
|
return;
|
||||||
@ -4257,7 +4351,7 @@ ztest_dmu_write_parallel(ztest_ds_t *zd, uint64_t id)
|
|||||||
* to verify that parallel writes to an object -- even to the
|
* to verify that parallel writes to an object -- even to the
|
||||||
* same blocks within the object -- doesn't cause any trouble.
|
* same blocks within the object -- doesn't cause any trouble.
|
||||||
*/
|
*/
|
||||||
ztest_od_init(&od[0], ID_PARALLEL, FTAG, 0, DMU_OT_UINT64_OTHER, 0, 0);
|
ztest_od_init(&od[0], ID_PARALLEL, FTAG, 0, DMU_OT_UINT64_OTHER, 0, 0, 0);
|
||||||
|
|
||||||
if (ztest_object_init(zd, od, sizeof (od), B_FALSE) != 0)
|
if (ztest_object_init(zd, od, sizeof (od), B_FALSE) != 0)
|
||||||
return;
|
return;
|
||||||
@ -4276,7 +4370,7 @@ ztest_dmu_prealloc(ztest_ds_t *zd, uint64_t id)
|
|||||||
uint64_t blocksize = ztest_random_blocksize();
|
uint64_t blocksize = ztest_random_blocksize();
|
||||||
void *data;
|
void *data;
|
||||||
|
|
||||||
ztest_od_init(&od[0], id, FTAG, 0, DMU_OT_UINT64_OTHER, blocksize, 0);
|
ztest_od_init(&od[0], id, FTAG, 0, DMU_OT_UINT64_OTHER, blocksize, 0, 0);
|
||||||
|
|
||||||
if (ztest_object_init(zd, od, sizeof (od), !ztest_random(2)) != 0)
|
if (ztest_object_init(zd, od, sizeof (od), !ztest_random(2)) != 0)
|
||||||
return;
|
return;
|
||||||
@ -4322,7 +4416,7 @@ ztest_zap(ztest_ds_t *zd, uint64_t id)
|
|||||||
int error;
|
int error;
|
||||||
char *hc[2] = { "s.acl.h", ".s.open.h.hyLZlg" };
|
char *hc[2] = { "s.acl.h", ".s.open.h.hyLZlg" };
|
||||||
|
|
||||||
ztest_od_init(&od[0], id, FTAG, 0, DMU_OT_ZAP_OTHER, 0, 0);
|
ztest_od_init(&od[0], id, FTAG, 0, DMU_OT_ZAP_OTHER, 0, 0, 0);
|
||||||
|
|
||||||
if (ztest_object_init(zd, od, sizeof (od), !ztest_random(2)) != 0)
|
if (ztest_object_init(zd, od, sizeof (od), !ztest_random(2)) != 0)
|
||||||
return;
|
return;
|
||||||
@ -4454,7 +4548,7 @@ ztest_fzap(ztest_ds_t *zd, uint64_t id)
|
|||||||
ztest_od_t od[1];
|
ztest_od_t od[1];
|
||||||
uint64_t object, txg;
|
uint64_t object, txg;
|
||||||
|
|
||||||
ztest_od_init(&od[0], id, FTAG, 0, DMU_OT_ZAP_OTHER, 0, 0);
|
ztest_od_init(&od[0], id, FTAG, 0, DMU_OT_ZAP_OTHER, 0, 0, 0);
|
||||||
|
|
||||||
if (ztest_object_init(zd, od, sizeof (od), !ztest_random(2)) != 0)
|
if (ztest_object_init(zd, od, sizeof (od), !ztest_random(2)) != 0)
|
||||||
return;
|
return;
|
||||||
@ -4500,7 +4594,7 @@ ztest_zap_parallel(ztest_ds_t *zd, uint64_t id)
|
|||||||
char name[20], string_value[20];
|
char name[20], string_value[20];
|
||||||
void *data;
|
void *data;
|
||||||
|
|
||||||
ztest_od_init(&od[0], ID_PARALLEL, FTAG, micro, DMU_OT_ZAP_OTHER, 0, 0);
|
ztest_od_init(&od[0], ID_PARALLEL, FTAG, micro, DMU_OT_ZAP_OTHER, 0, 0, 0);
|
||||||
|
|
||||||
if (ztest_object_init(zd, od, sizeof (od), B_FALSE) != 0)
|
if (ztest_object_init(zd, od, sizeof (od), B_FALSE) != 0)
|
||||||
return;
|
return;
|
||||||
@ -4688,7 +4782,7 @@ ztest_dmu_commit_callbacks(ztest_ds_t *zd, uint64_t id)
|
|||||||
uint64_t old_txg, txg;
|
uint64_t old_txg, txg;
|
||||||
int i, error;
|
int i, error;
|
||||||
|
|
||||||
ztest_od_init(&od[0], id, FTAG, 0, DMU_OT_UINT64_OTHER, 0, 0);
|
ztest_od_init(&od[0], id, FTAG, 0, DMU_OT_UINT64_OTHER, 0, 0, 0);
|
||||||
|
|
||||||
if (ztest_object_init(zd, od, sizeof (od), B_FALSE) != 0)
|
if (ztest_object_init(zd, od, sizeof (od), B_FALSE) != 0)
|
||||||
return;
|
return;
|
||||||
@ -4802,6 +4896,41 @@ ztest_dmu_commit_callbacks(ztest_ds_t *zd, uint64_t id)
|
|||||||
dmu_tx_commit(tx);
|
dmu_tx_commit(tx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Visit each object in the dataset. Verify that its properties
|
||||||
|
* are consistent what was stored in the block tag when it was created,
|
||||||
|
* and that its unused bonus buffer space has not been overwritten.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
ztest_verify_dnode_bt(ztest_ds_t *zd, uint64_t id)
|
||||||
|
{
|
||||||
|
objset_t *os = zd->zd_os;
|
||||||
|
uint64_t obj;
|
||||||
|
int err = 0;
|
||||||
|
|
||||||
|
for (obj = 0; err == 0; err = dmu_object_next(os, &obj, FALSE, 0)) {
|
||||||
|
ztest_block_tag_t *bt = NULL;
|
||||||
|
dmu_object_info_t doi;
|
||||||
|
dmu_buf_t *db;
|
||||||
|
|
||||||
|
if (dmu_bonus_hold(os, obj, FTAG, &db) != 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
dmu_object_info_from_db(db, &doi);
|
||||||
|
if (doi.doi_bonus_size >= sizeof (*bt))
|
||||||
|
bt = ztest_bt_bonus(db);
|
||||||
|
|
||||||
|
if (bt && bt->bt_magic == BT_MAGIC) {
|
||||||
|
ztest_bt_verify(bt, os, obj, doi.doi_dnodesize,
|
||||||
|
bt->bt_offset, bt->bt_gen, bt->bt_txg,
|
||||||
|
bt->bt_crtxg);
|
||||||
|
ztest_verify_unused_bonus(db, bt, obj, os, bt->bt_gen);
|
||||||
|
}
|
||||||
|
|
||||||
|
dmu_buf_rele(db, FTAG);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* ARGSUSED */
|
/* ARGSUSED */
|
||||||
void
|
void
|
||||||
ztest_dsl_prop_get_set(ztest_ds_t *zd, uint64_t id)
|
ztest_dsl_prop_get_set(ztest_ds_t *zd, uint64_t id)
|
||||||
@ -5286,7 +5415,7 @@ ztest_ddt_repair(ztest_ds_t *zd, uint64_t id)
|
|||||||
blocksize = ztest_random_blocksize();
|
blocksize = ztest_random_blocksize();
|
||||||
blocksize = MIN(blocksize, 2048); /* because we write so many */
|
blocksize = MIN(blocksize, 2048); /* because we write so many */
|
||||||
|
|
||||||
ztest_od_init(&od[0], id, FTAG, 0, DMU_OT_UINT64_OTHER, blocksize, 0);
|
ztest_od_init(&od[0], id, FTAG, 0, DMU_OT_UINT64_OTHER, blocksize, 0, 0);
|
||||||
|
|
||||||
if (ztest_object_init(zd, od, sizeof (od), B_FALSE) != 0)
|
if (ztest_object_init(zd, od, sizeof (od), B_FALSE) != 0)
|
||||||
return;
|
return;
|
||||||
@ -6212,7 +6341,7 @@ ztest_freeze(void)
|
|||||||
numloops++ < ztest_opts.zo_maxloops &&
|
numloops++ < ztest_opts.zo_maxloops &&
|
||||||
metaslab_class_get_alloc(spa_normal_class(spa)) < capacity) {
|
metaslab_class_get_alloc(spa_normal_class(spa)) < capacity) {
|
||||||
ztest_od_t od;
|
ztest_od_t od;
|
||||||
ztest_od_init(&od, 0, FTAG, 0, DMU_OT_UINT64_OTHER, 0, 0);
|
ztest_od_init(&od, 0, FTAG, 0, DMU_OT_UINT64_OTHER, 0, 0, 0);
|
||||||
VERIFY0(ztest_object_init(zd, &od, sizeof (od), B_FALSE));
|
VERIFY0(ztest_object_init(zd, &od, sizeof (od), B_FALSE));
|
||||||
ztest_io(zd, od.od_object,
|
ztest_io(zd, od.od_object,
|
||||||
ztest_random(ZTEST_RANGE_LOCKS) << SPA_MAXBLOCKSHIFT);
|
ztest_random(ZTEST_RANGE_LOCKS) << SPA_MAXBLOCKSHIFT);
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
LIB= nvpair
|
LIB= nvpair
|
||||||
|
|
||||||
|
INCS= libnvpair.h
|
||||||
SRCS= libnvpair.c \
|
SRCS= libnvpair.c \
|
||||||
nvpair_alloc_system.c \
|
nvpair_alloc_system.c \
|
||||||
nvpair_json.c \
|
nvpair_json.c \
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
LIB= zfs_core
|
LIB= zfs_core
|
||||||
LIBADD= nvpair
|
LIBADD= nvpair
|
||||||
|
|
||||||
|
INCS= libzfs_core.h
|
||||||
SRCS= libzfs_core.c \
|
SRCS= libzfs_core.c \
|
||||||
libzfs_core_compat.c \
|
libzfs_core_compat.c \
|
||||||
zfs_ioctl_compat.c
|
zfs_ioctl_compat.c
|
||||||
|
@ -23,6 +23,9 @@ CSTD= c99
|
|||||||
|
|
||||||
# Since there are many asserts in this program, it makes no sense to compile
|
# Since there are many asserts in this program, it makes no sense to compile
|
||||||
# it without debugging.
|
# it without debugging.
|
||||||
CFLAGS+= -g -DDEBUG=1
|
CFLAGS+= -g -DDEBUG=1 -Wno-format
|
||||||
|
|
||||||
|
HAS_TESTS=
|
||||||
|
SUBDIR.${MK_TESTS}+= tests
|
||||||
|
|
||||||
.include <bsd.prog.mk>
|
.include <bsd.prog.mk>
|
||||||
|
7
cddl/usr.bin/ztest/tests/Makefile
Normal file
7
cddl/usr.bin/ztest/tests/Makefile
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
# $FreeBSD$
|
||||||
|
|
||||||
|
.include <bsd.own.mk>
|
||||||
|
|
||||||
|
ATF_TESTS_SH+= ztest
|
||||||
|
|
||||||
|
.include <bsd.test.mk>
|
52
cddl/usr.bin/ztest/tests/ztest.sh
Executable file
52
cddl/usr.bin/ztest/tests/ztest.sh
Executable file
@ -0,0 +1,52 @@
|
|||||||
|
#
|
||||||
|
# Test Case: ztest
|
||||||
|
# $FreeBSD$
|
||||||
|
#
|
||||||
|
atf_test_case ztest
|
||||||
|
ztest_head()
|
||||||
|
{
|
||||||
|
atf_set "descr" "Run ztest"
|
||||||
|
atf_set "timeout" 900
|
||||||
|
atf_set "require.config" "rt_long"
|
||||||
|
}
|
||||||
|
|
||||||
|
ztest_body()
|
||||||
|
{
|
||||||
|
ARGS="-VVVVV -f ${TMPDIR:-/tmp}"
|
||||||
|
if atf_config_has ztest_extra_args; then
|
||||||
|
ARGS="${ARGS} $(atf_config_get ztest_extra_args)"
|
||||||
|
fi
|
||||||
|
ztest ${ARGS}
|
||||||
|
if [ $? != 0 ]; then
|
||||||
|
echo "failing"
|
||||||
|
save_ztest_artifacts
|
||||||
|
atf_fail "Testcase failed"
|
||||||
|
else
|
||||||
|
echo "passing"
|
||||||
|
atf_pass
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# ATF Test Program Init Function
|
||||||
|
#
|
||||||
|
atf_init_test_cases()
|
||||||
|
{
|
||||||
|
atf_add_test_case ztest
|
||||||
|
}
|
||||||
|
|
||||||
|
save_ztest_artifacts()
|
||||||
|
{
|
||||||
|
# If artifacts_dir is defined, save test artifacts for
|
||||||
|
# post-mortem analysis
|
||||||
|
if atf_config_has artifacts_dir; then
|
||||||
|
TC_ARTIFACTS_DIR=`atf_config_get artifacts_dir`/cddl/usr.bin/ztest/$(atf_get ident)
|
||||||
|
mkdir -p $TC_ARTIFACTS_DIR
|
||||||
|
TC_CORE_DIR=/var/crash
|
||||||
|
if atf_config_has core_dir; then
|
||||||
|
TC_CORE_DIR=`atf_config_get core_dir`
|
||||||
|
fi
|
||||||
|
mv *ztest*.core* $TC_ARTIFACTS_DIR || true
|
||||||
|
mv ${TC_CORE_DIR}/*ztest*.core* $TC_ARTIFACTS_DIR || true
|
||||||
|
fi
|
||||||
|
}
|
@ -78,6 +78,8 @@ Local changes:
|
|||||||
r1.5 mdoc(7)NG
|
r1.5 mdoc(7)NG
|
||||||
r1.3 describe all of the command line options
|
r1.3 describe all of the command line options
|
||||||
r1.2 un-mandocafied, un4.4BSD'ed
|
r1.2 un-mandocafied, un4.4BSD'ed
|
||||||
|
hlfsd/hlfsd.8
|
||||||
|
- Fix a broken SEE ALSO section and some mdoc issues
|
||||||
mk-amd-map/mk-amd-map.8
|
mk-amd-map/mk-amd-map.8
|
||||||
r1.4 removed HISTORY info from the .Os call.
|
r1.4 removed HISTORY info from the .Os call.
|
||||||
r1.2 un-mandocafied, un4.4BSD'ed
|
r1.2 un-mandocafied, un4.4BSD'ed
|
||||||
|
@ -80,9 +80,7 @@ anywhere.
|
|||||||
The
|
The
|
||||||
.Nm
|
.Nm
|
||||||
utility
|
utility
|
||||||
operates by mounting itself as an
|
operates by mounting itself as an NFS server for the directory containing
|
||||||
.Tn NFS
|
|
||||||
server for the directory containing
|
|
||||||
.Ar linkname ,
|
.Ar linkname ,
|
||||||
which defaults to
|
which defaults to
|
||||||
.Pa /hlfs/home .
|
.Pa /hlfs/home .
|
||||||
@ -334,8 +332,8 @@ symbolic link returned by
|
|||||||
points if it is unable to verify the that
|
points if it is unable to verify the that
|
||||||
user's home directory is accessible.
|
user's home directory is accessible.
|
||||||
.El
|
.El
|
||||||
.SH "SEE ALSO"
|
.Sh "SEE ALSO"
|
||||||
.Xr mail1 ,
|
.Xr mail 1 ,
|
||||||
.Xr getgrent 3 ,
|
.Xr getgrent 3 ,
|
||||||
.Xr getpwent 3 ,
|
.Xr getpwent 3 ,
|
||||||
.Xr mnttab 4 ,
|
.Xr mnttab 4 ,
|
||||||
@ -343,7 +341,7 @@ user's home directory is accessible.
|
|||||||
.Xr mtab 5 ,
|
.Xr mtab 5 ,
|
||||||
.Xr amd 8 ,
|
.Xr amd 8 ,
|
||||||
.Xr automount 8 ,
|
.Xr automount 8 ,
|
||||||
.Xr cron8 ,
|
.Xr cron 8 ,
|
||||||
.Xr mount 8 ,
|
.Xr mount 8 ,
|
||||||
.Xr sendmail 8 ,
|
.Xr sendmail 8 ,
|
||||||
.Xr umount 8
|
.Xr umount 8
|
||||||
|
@ -439,11 +439,15 @@ mibif_restart_mibII_poll_timer(void)
|
|||||||
int
|
int
|
||||||
mib_fetch_ifmib(struct mibif *ifp)
|
mib_fetch_ifmib(struct mibif *ifp)
|
||||||
{
|
{
|
||||||
|
static int kmib[2] = { -1, 0 }; /* for sysctl net.ifdescr_maxlen */
|
||||||
|
|
||||||
int name[6];
|
int name[6];
|
||||||
|
size_t kmiblen = nitems(kmib);
|
||||||
size_t len;
|
size_t len;
|
||||||
void *newmib;
|
void *newmib;
|
||||||
struct ifmibdata oldmib = ifp->mib;
|
struct ifmibdata oldmib = ifp->mib;
|
||||||
struct ifreq irr;
|
struct ifreq irr;
|
||||||
|
unsigned int alias_maxlen = MIBIF_ALIAS_SIZE_MAX;
|
||||||
|
|
||||||
if (fetch_generic_mib(ifp, &oldmib) == -1)
|
if (fetch_generic_mib(ifp, &oldmib) == -1)
|
||||||
return (-1);
|
return (-1);
|
||||||
@ -515,18 +519,69 @@ mib_fetch_ifmib(struct mibif *ifp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Find sysctl mib for net.ifdescr_maxlen (one time).
|
||||||
|
* kmib[0] == -1 at first call to mib_fetch_ifmib().
|
||||||
|
* Then kmib[0] > 0 if we found sysctl mib for net.ifdescr_maxlen.
|
||||||
|
* Else, kmib[0] == 0 (unexpected error from a kernel).
|
||||||
|
*/
|
||||||
|
if (kmib[0] < 0 &&
|
||||||
|
sysctlnametomib("net.ifdescr_maxlen", kmib, &kmiblen) < 0) {
|
||||||
|
kmib[0] = 0;
|
||||||
|
syslog(LOG_WARNING, "sysctlnametomib net.ifdescr_maxlen: %m");
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Fetch net.ifdescr_maxlen value every time to catch up with changes.
|
||||||
|
*/
|
||||||
|
len = sizeof(alias_maxlen);
|
||||||
|
if (kmib[0] > 0 && sysctl(kmib, 2, &alias_maxlen, &len, NULL, 0) < 0) {
|
||||||
|
/* unexpected error from the kernel, use default value */
|
||||||
|
alias_maxlen = MIBIF_ALIAS_SIZE_MAX;
|
||||||
|
syslog(LOG_WARNING, "sysctl net.ifdescr_maxlen: %m");
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Kernel limit might be decreased after interfaces got
|
||||||
|
* their descriptions assigned. Try to obtain them anyway.
|
||||||
|
*/
|
||||||
|
if (alias_maxlen == 0)
|
||||||
|
alias_maxlen = MIBIF_ALIAS_SIZE_MAX;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Allocate maximum memory for a buffer and later reallocate
|
||||||
|
* to free extra memory.
|
||||||
|
*/
|
||||||
|
if ((ifp->alias = malloc(alias_maxlen)) == NULL) {
|
||||||
|
syslog(LOG_WARNING, "malloc(%d) failed: %m", (int)alias_maxlen);
|
||||||
|
goto fin;
|
||||||
|
}
|
||||||
|
|
||||||
strlcpy(irr.ifr_name, ifp->name, sizeof(irr.ifr_name));
|
strlcpy(irr.ifr_name, ifp->name, sizeof(irr.ifr_name));
|
||||||
irr.ifr_buffer.buffer = MIBIF_PRIV(ifp)->alias;
|
irr.ifr_buffer.buffer = ifp->alias;
|
||||||
irr.ifr_buffer.length = sizeof(MIBIF_PRIV(ifp)->alias);
|
irr.ifr_buffer.length = alias_maxlen;
|
||||||
if (ioctl(mib_netsock, SIOCGIFDESCR, &irr) == -1) {
|
if (ioctl(mib_netsock, SIOCGIFDESCR, &irr) == -1) {
|
||||||
MIBIF_PRIV(ifp)->alias[0] = 0;
|
free(ifp->alias);
|
||||||
|
ifp->alias = NULL;
|
||||||
if (errno != ENOMSG)
|
if (errno != ENOMSG)
|
||||||
syslog(LOG_WARNING, "SIOCGIFDESCR (%s): %m", ifp->name);
|
syslog(LOG_WARNING, "SIOCGIFDESCR (%s): %m", ifp->name);
|
||||||
} else if (irr.ifr_buffer.buffer == NULL) {
|
} else if (irr.ifr_buffer.buffer == NULL) {
|
||||||
MIBIF_PRIV(ifp)->alias[0] = 0;
|
free(ifp->alias);
|
||||||
|
ifp->alias = NULL;
|
||||||
syslog(LOG_WARNING, "SIOCGIFDESCR (%s): too long (%zu)",
|
syslog(LOG_WARNING, "SIOCGIFDESCR (%s): too long (%zu)",
|
||||||
ifp->name, irr.ifr_buffer.length);
|
ifp->name, irr.ifr_buffer.length);
|
||||||
|
} else {
|
||||||
|
ifp->alias_size = strnlen(ifp->alias, alias_maxlen) + 1;
|
||||||
|
|
||||||
|
if (ifp->alias_size > MIBIF_ALIAS_SIZE)
|
||||||
|
ifp->alias_size = MIBIF_ALIAS_SIZE;
|
||||||
|
|
||||||
|
if (ifp->alias_size < alias_maxlen)
|
||||||
|
ifp->alias = realloc(ifp->alias, ifp->alias_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fin:
|
||||||
ifp->mibtick = get_ticks();
|
ifp->mibtick = get_ticks();
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
@ -706,6 +761,10 @@ mibif_free(struct mibif *ifp)
|
|||||||
mibif_reset_hc_timer();
|
mibif_reset_hc_timer();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ifp->alias != NULL) {
|
||||||
|
free(ifp->alias);
|
||||||
|
ifp->alias = NULL;
|
||||||
|
}
|
||||||
free(ifp->private);
|
free(ifp->private);
|
||||||
ifp->private = NULL;
|
ifp->private = NULL;
|
||||||
free(ifp->physaddr);
|
free(ifp->physaddr);
|
||||||
|
@ -57,8 +57,9 @@
|
|||||||
#include "snmp_mibII.h"
|
#include "snmp_mibII.h"
|
||||||
#include "mibII_tree.h"
|
#include "mibII_tree.h"
|
||||||
|
|
||||||
/* maximum size of the interface alias */
|
/* maximum size of the interface alias unless overridden with net.ifdescr_maxlen */
|
||||||
#define MIBIF_ALIAS_SIZE (64 + 1)
|
#define MIBIF_ALIAS_SIZE (64 + 1)
|
||||||
|
#define MIBIF_ALIAS_SIZE_MAX 1024
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Interface list and flags.
|
* Interface list and flags.
|
||||||
@ -81,8 +82,6 @@ struct mibif_private {
|
|||||||
uint64_t hc_imcasts;
|
uint64_t hc_imcasts;
|
||||||
uint64_t hc_ipackets;
|
uint64_t hc_ipackets;
|
||||||
|
|
||||||
/* this should be made public */
|
|
||||||
char alias[MIBIF_ALIAS_SIZE];
|
|
||||||
};
|
};
|
||||||
#define MIBIF_PRIV(IFP) ((struct mibif_private *)((IFP)->private))
|
#define MIBIF_PRIV(IFP) ((struct mibif_private *)((IFP)->private))
|
||||||
|
|
||||||
|
@ -528,7 +528,7 @@ op_ifxtable(struct snmp_context *ctx, struct snmp_value *value,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case LEAF_ifAlias:
|
case LEAF_ifAlias:
|
||||||
ret = string_get(value, MIBIF_PRIV(ifp)->alias, -1);
|
ret = string_get(value, ifp->alias, ifp->alias_size - 1);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case LEAF_ifCounterDiscontinuityTime:
|
case LEAF_ifCounterDiscontinuityTime:
|
||||||
|
@ -80,6 +80,9 @@ struct mibif {
|
|||||||
/* to be set by ifType specific modules. This is ifSpecific. */
|
/* to be set by ifType specific modules. This is ifSpecific. */
|
||||||
struct asn_oid spec_oid;
|
struct asn_oid spec_oid;
|
||||||
|
|
||||||
|
char *alias;
|
||||||
|
size_t alias_size;
|
||||||
|
|
||||||
/* private data - don't touch */
|
/* private data - don't touch */
|
||||||
void *private;
|
void *private;
|
||||||
};
|
};
|
||||||
|
@ -409,7 +409,8 @@ static int next_entry_seek(struct archive_read *, struct iso9660 *,
|
|||||||
struct file_info **);
|
struct file_info **);
|
||||||
static struct file_info *
|
static struct file_info *
|
||||||
parse_file_info(struct archive_read *a,
|
parse_file_info(struct archive_read *a,
|
||||||
struct file_info *parent, const unsigned char *isodirrec);
|
struct file_info *parent, const unsigned char *isodirrec,
|
||||||
|
size_t reclen);
|
||||||
static int parse_rockridge(struct archive_read *a,
|
static int parse_rockridge(struct archive_read *a,
|
||||||
struct file_info *file, const unsigned char *start,
|
struct file_info *file, const unsigned char *start,
|
||||||
const unsigned char *end);
|
const unsigned char *end);
|
||||||
@ -1022,7 +1023,7 @@ read_children(struct archive_read *a, struct file_info *parent)
|
|||||||
if (*(p + DR_name_len_offset) == 1
|
if (*(p + DR_name_len_offset) == 1
|
||||||
&& *(p + DR_name_offset) == '\001')
|
&& *(p + DR_name_offset) == '\001')
|
||||||
continue;
|
continue;
|
||||||
child = parse_file_info(a, parent, p);
|
child = parse_file_info(a, parent, p, b - p);
|
||||||
if (child == NULL) {
|
if (child == NULL) {
|
||||||
__archive_read_consume(a, skip_size);
|
__archive_read_consume(a, skip_size);
|
||||||
return (ARCHIVE_FATAL);
|
return (ARCHIVE_FATAL);
|
||||||
@ -1112,7 +1113,7 @@ choose_volume(struct archive_read *a, struct iso9660 *iso9660)
|
|||||||
*/
|
*/
|
||||||
seenJoliet = iso9660->seenJoliet;/* Save flag. */
|
seenJoliet = iso9660->seenJoliet;/* Save flag. */
|
||||||
iso9660->seenJoliet = 0;
|
iso9660->seenJoliet = 0;
|
||||||
file = parse_file_info(a, NULL, block);
|
file = parse_file_info(a, NULL, block, vd->size);
|
||||||
if (file == NULL)
|
if (file == NULL)
|
||||||
return (ARCHIVE_FATAL);
|
return (ARCHIVE_FATAL);
|
||||||
iso9660->seenJoliet = seenJoliet;
|
iso9660->seenJoliet = seenJoliet;
|
||||||
@ -1144,7 +1145,7 @@ choose_volume(struct archive_read *a, struct iso9660 *iso9660)
|
|||||||
return (ARCHIVE_FATAL);
|
return (ARCHIVE_FATAL);
|
||||||
}
|
}
|
||||||
iso9660->seenJoliet = 0;
|
iso9660->seenJoliet = 0;
|
||||||
file = parse_file_info(a, NULL, block);
|
file = parse_file_info(a, NULL, block, vd->size);
|
||||||
if (file == NULL)
|
if (file == NULL)
|
||||||
return (ARCHIVE_FATAL);
|
return (ARCHIVE_FATAL);
|
||||||
iso9660->seenJoliet = seenJoliet;
|
iso9660->seenJoliet = seenJoliet;
|
||||||
@ -1749,7 +1750,7 @@ archive_read_format_iso9660_cleanup(struct archive_read *a)
|
|||||||
*/
|
*/
|
||||||
static struct file_info *
|
static struct file_info *
|
||||||
parse_file_info(struct archive_read *a, struct file_info *parent,
|
parse_file_info(struct archive_read *a, struct file_info *parent,
|
||||||
const unsigned char *isodirrec)
|
const unsigned char *isodirrec, size_t reclen)
|
||||||
{
|
{
|
||||||
struct iso9660 *iso9660;
|
struct iso9660 *iso9660;
|
||||||
struct file_info *file, *filep;
|
struct file_info *file, *filep;
|
||||||
@ -1763,16 +1764,20 @@ parse_file_info(struct archive_read *a, struct file_info *parent,
|
|||||||
|
|
||||||
iso9660 = (struct iso9660 *)(a->format->data);
|
iso9660 = (struct iso9660 *)(a->format->data);
|
||||||
|
|
||||||
dr_len = (size_t)isodirrec[DR_length_offset];
|
if (reclen != 0)
|
||||||
|
dr_len = (size_t)isodirrec[DR_length_offset];
|
||||||
|
/*
|
||||||
|
* Sanity check that reclen is not zero and dr_len is greater than
|
||||||
|
* reclen but at least 34
|
||||||
|
*/
|
||||||
|
if (reclen == 0 || reclen < dr_len || dr_len < 34) {
|
||||||
|
archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
|
||||||
|
"Invalid length of directory record");
|
||||||
|
return (NULL);
|
||||||
|
}
|
||||||
name_len = (size_t)isodirrec[DR_name_len_offset];
|
name_len = (size_t)isodirrec[DR_name_len_offset];
|
||||||
location = archive_le32dec(isodirrec + DR_extent_offset);
|
location = archive_le32dec(isodirrec + DR_extent_offset);
|
||||||
fsize = toi(isodirrec + DR_size_offset, DR_size_size);
|
fsize = toi(isodirrec + DR_size_offset, DR_size_size);
|
||||||
/* Sanity check that dr_len needs at least 34. */
|
|
||||||
if (dr_len < 34) {
|
|
||||||
archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
|
|
||||||
"Invalid length of directory record");
|
|
||||||
return (NULL);
|
|
||||||
}
|
|
||||||
/* Sanity check that name_len doesn't exceed dr_len. */
|
/* Sanity check that name_len doesn't exceed dr_len. */
|
||||||
if (dr_len - 33 < name_len || name_len == 0) {
|
if (dr_len - 33 < name_len || name_len == 0) {
|
||||||
archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
|
archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
|
|
||||||
This is Lua 5.3.4, released on 12 Jan 2017.
|
This is Lua 5.3.5, released on 26 Jun 2018.
|
||||||
|
|
||||||
For installation instructions, license details, and
|
For installation instructions, license details, and
|
||||||
further information about Lua, see doc/readme.html.
|
further information about Lua, see doc/readme.html.
|
||||||
|
@ -32,7 +32,7 @@ For a complete introduction to Lua programming, see the book
|
|||||||
|
|
||||||
<P>
|
<P>
|
||||||
<SMALL>
|
<SMALL>
|
||||||
Copyright © 2015–2017 Lua.org, PUC-Rio.
|
Copyright © 2015–2018 Lua.org, PUC-Rio.
|
||||||
Freely available under the terms of the
|
Freely available under the terms of the
|
||||||
<A HREF="http://www.lua.org/license.html">Lua license</A>.
|
<A HREF="http://www.lua.org/license.html">Lua license</A>.
|
||||||
</SMALL>
|
</SMALL>
|
||||||
@ -609,10 +609,10 @@ Freely available under the terms of the
|
|||||||
|
|
||||||
<P CLASS="footer">
|
<P CLASS="footer">
|
||||||
Last update:
|
Last update:
|
||||||
Thu Dec 22 18:29:39 BRST 2016
|
Mon Jun 18 22:56:06 -03 2018
|
||||||
</P>
|
</P>
|
||||||
<!--
|
<!--
|
||||||
Last change: revised for Lua 5.3.4
|
Last change: revised for Lua 5.3.5
|
||||||
-->
|
-->
|
||||||
|
|
||||||
</BODY>
|
</BODY>
|
||||||
|
@ -10,7 +10,7 @@ body {
|
|||||||
line-height: 1.25 ;
|
line-height: 1.25 ;
|
||||||
margin: 16px auto ;
|
margin: 16px auto ;
|
||||||
padding: 32px ;
|
padding: 32px ;
|
||||||
border: solid #a0a0a0 1px ;
|
border: solid #ccc 1px ;
|
||||||
border-radius: 20px ;
|
border-radius: 20px ;
|
||||||
max-width: 70em ;
|
max-width: 70em ;
|
||||||
width: 90% ;
|
width: 90% ;
|
||||||
@ -111,36 +111,29 @@ pre.session {
|
|||||||
border-radius: 8px ;
|
border-radius: 8px ;
|
||||||
}
|
}
|
||||||
|
|
||||||
td.gutter {
|
table {
|
||||||
width: 4% ;
|
|
||||||
}
|
|
||||||
|
|
||||||
table.columns {
|
|
||||||
border: none ;
|
border: none ;
|
||||||
border-spacing: 0 ;
|
border-spacing: 0 ;
|
||||||
border-collapse: collapse ;
|
border-collapse: collapse ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
td {
|
||||||
|
padding: 0 ;
|
||||||
|
margin: 0 ;
|
||||||
|
}
|
||||||
|
|
||||||
|
td.gutter {
|
||||||
|
width: 4% ;
|
||||||
|
}
|
||||||
|
|
||||||
table.columns td {
|
table.columns td {
|
||||||
vertical-align: top ;
|
vertical-align: top ;
|
||||||
padding: 0 ;
|
|
||||||
padding-bottom: 1em ;
|
padding-bottom: 1em ;
|
||||||
text-align: justify ;
|
text-align: justify ;
|
||||||
line-height: 1.25 ;
|
line-height: 1.25 ;
|
||||||
}
|
}
|
||||||
|
|
||||||
p.logos a:link:hover, p.logos a:visited:hover {
|
|
||||||
background-color: inherit ;
|
|
||||||
}
|
|
||||||
|
|
||||||
table.book {
|
|
||||||
border: none ;
|
|
||||||
border-spacing: 0 ;
|
|
||||||
border-collapse: collapse ;
|
|
||||||
}
|
|
||||||
|
|
||||||
table.book td {
|
table.book td {
|
||||||
padding: 0 ;
|
|
||||||
vertical-align: top ;
|
vertical-align: top ;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -159,6 +152,10 @@ table.book span {
|
|||||||
margin-top: 0.25em ;
|
margin-top: 0.25em ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
p.logos a:link:hover, p.logos a:visited:hover {
|
||||||
|
background-color: inherit ;
|
||||||
|
}
|
||||||
|
|
||||||
img {
|
img {
|
||||||
background-color: white ;
|
background-color: white ;
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,7 @@ by Roberto Ierusalimschy, Luiz Henrique de Figueiredo, Waldemar Celes
|
|||||||
|
|
||||||
<P>
|
<P>
|
||||||
<SMALL>
|
<SMALL>
|
||||||
Copyright © 2015–2017 Lua.org, PUC-Rio.
|
Copyright © 2015–2018 Lua.org, PUC-Rio.
|
||||||
Freely available under the terms of the
|
Freely available under the terms of the
|
||||||
<a href="http://www.lua.org/license.html">Lua license</a>.
|
<a href="http://www.lua.org/license.html">Lua license</a>.
|
||||||
</SMALL>
|
</SMALL>
|
||||||
@ -35,7 +35,7 @@ Freely available under the terms of the
|
|||||||
<!-- ====================================================================== -->
|
<!-- ====================================================================== -->
|
||||||
<p>
|
<p>
|
||||||
|
|
||||||
<!-- $Id: manual.of,v 1.167 2017/01/09 15:18:11 roberto Exp $ -->
|
<!-- $Id: manual.of,v 1.167.1.2 2018/06/26 15:49:07 roberto Exp $ -->
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -203,8 +203,8 @@ even those that do not support threads natively.
|
|||||||
|
|
||||||
<p>
|
<p>
|
||||||
The type <em>table</em> implements associative arrays,
|
The type <em>table</em> implements associative arrays,
|
||||||
that is, arrays that can be indexed not only with numbers,
|
that is, arrays that can have as indices not only numbers,
|
||||||
but with any Lua value except <b>nil</b> and NaN.
|
but any Lua value except <b>nil</b> and NaN.
|
||||||
(<em>Not a Number</em> is a special value used to represent
|
(<em>Not a Number</em> is a special value used to represent
|
||||||
undefined or unrepresentable numerical results, such as <code>0/0</code>.)
|
undefined or unrepresentable numerical results, such as <code>0/0</code>.)
|
||||||
Tables can be <em>heterogeneous</em>;
|
Tables can be <em>heterogeneous</em>;
|
||||||
@ -400,6 +400,8 @@ with the event name prefixed by two underscores;
|
|||||||
the corresponding values are called <em>metamethods</em>.
|
the corresponding values are called <em>metamethods</em>.
|
||||||
In the previous example, the key is "<code>__add</code>"
|
In the previous example, the key is "<code>__add</code>"
|
||||||
and the metamethod is the function that performs the addition.
|
and the metamethod is the function that performs the addition.
|
||||||
|
Unless stated otherwise,
|
||||||
|
metamethods should be function values.
|
||||||
|
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
@ -597,7 +599,7 @@ it is also slower than a real <code>__le</code> metamethod.)
|
|||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li><b><code>__index</code>: </b>
|
<li><b><code>__index</code>: </b>
|
||||||
The indexing access <code>table[key]</code>.
|
The indexing access operation <code>table[key]</code>.
|
||||||
This event happens when <code>table</code> is not a table or
|
This event happens when <code>table</code> is not a table or
|
||||||
when <code>key</code> is not present in <code>table</code>.
|
when <code>key</code> is not present in <code>table</code>.
|
||||||
The metamethod is looked up in <code>table</code>.
|
The metamethod is looked up in <code>table</code>.
|
||||||
@ -1276,13 +1278,8 @@ Square brackets are used to index a table:
|
|||||||
<pre>
|
<pre>
|
||||||
var ::= prefixexp ‘<b>[</b>’ exp ‘<b>]</b>’
|
var ::= prefixexp ‘<b>[</b>’ exp ‘<b>]</b>’
|
||||||
</pre><p>
|
</pre><p>
|
||||||
The meaning of accesses to table fields can be changed via metatables.
|
The meaning of accesses to table fields can be changed via metatables
|
||||||
An access to an indexed variable <code>t[i]</code> is equivalent to
|
(see <a href="#2.4">§2.4</a>).
|
||||||
a call <code>gettable_event(t,i)</code>.
|
|
||||||
(See <a href="#2.4">§2.4</a> for a complete description of the
|
|
||||||
<code>gettable_event</code> function.
|
|
||||||
This function is not defined or callable in Lua.
|
|
||||||
We use it here only for explanatory purposes.)
|
|
||||||
|
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
@ -1476,23 +1473,18 @@ and
|
|||||||
cyclically permutes the values of <code>x</code>, <code>y</code>, and <code>z</code>.
|
cyclically permutes the values of <code>x</code>, <code>y</code>, and <code>z</code>.
|
||||||
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The meaning of assignments to global variables
|
|
||||||
and table fields can be changed via metatables.
|
|
||||||
An assignment to an indexed variable <code>t[i] = val</code> is equivalent to
|
|
||||||
<code>settable_event(t,i,val)</code>.
|
|
||||||
(See <a href="#2.4">§2.4</a> for a complete description of the
|
|
||||||
<code>settable_event</code> function.
|
|
||||||
This function is not defined or callable in Lua.
|
|
||||||
We use it here only for explanatory purposes.)
|
|
||||||
|
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
An assignment to a global name <code>x = val</code>
|
An assignment to a global name <code>x = val</code>
|
||||||
is equivalent to the assignment
|
is equivalent to the assignment
|
||||||
<code>_ENV.x = val</code> (see <a href="#2.2">§2.2</a>).
|
<code>_ENV.x = val</code> (see <a href="#2.2">§2.2</a>).
|
||||||
|
|
||||||
|
|
||||||
|
<p>
|
||||||
|
The meaning of assignments to table fields and
|
||||||
|
global variables (which are actually table fields, too)
|
||||||
|
can be changed via metatables (see <a href="#2.4">§2.4</a>).
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -1831,17 +1823,17 @@ Here are some examples:
|
|||||||
g(f(), x) -- f() is adjusted to 1 result
|
g(f(), x) -- f() is adjusted to 1 result
|
||||||
g(x, f()) -- g gets x plus all results from f()
|
g(x, f()) -- g gets x plus all results from f()
|
||||||
a,b,c = f(), x -- f() is adjusted to 1 result (c gets nil)
|
a,b,c = f(), x -- f() is adjusted to 1 result (c gets nil)
|
||||||
a,b = ... -- a gets the first vararg parameter, b gets
|
a,b = ... -- a gets the first vararg argument, b gets
|
||||||
-- the second (both a and b can get nil if there
|
-- the second (both a and b can get nil if there
|
||||||
-- is no corresponding vararg parameter)
|
-- is no corresponding vararg argument)
|
||||||
|
|
||||||
a,b,c = x, f() -- f() is adjusted to 2 results
|
a,b,c = x, f() -- f() is adjusted to 2 results
|
||||||
a,b,c = f() -- f() is adjusted to 3 results
|
a,b,c = f() -- f() is adjusted to 3 results
|
||||||
return f() -- returns all results from f()
|
return f() -- returns all results from f()
|
||||||
return ... -- returns all received vararg parameters
|
return ... -- returns all received vararg arguments
|
||||||
return x,y,f() -- returns x, y, and all results from f()
|
return x,y,f() -- returns x, y, and all results from f()
|
||||||
{f()} -- creates a list with all results from f()
|
{f()} -- creates a list with all results from f()
|
||||||
{...} -- creates a list with all vararg parameters
|
{...} -- creates a list with all vararg arguments
|
||||||
{f(), nil} -- f() is adjusted to 1 result
|
{f(), nil} -- f() is adjusted to 1 result
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
@ -2039,9 +2031,12 @@ two objects are considered equal only if they are the same object.
|
|||||||
Every time you create a new object
|
Every time you create a new object
|
||||||
(a table, userdata, or thread),
|
(a table, userdata, or thread),
|
||||||
this new object is different from any previously existing object.
|
this new object is different from any previously existing object.
|
||||||
Closures with the same reference are always equal.
|
A closure is always equal to itself.
|
||||||
Closures with any detectable difference
|
Closures with any detectable difference
|
||||||
(different behavior, different definition) are always different.
|
(different behavior, different definition) are always different.
|
||||||
|
Closures created at different times but with no detectable differences
|
||||||
|
may be classified as equal or not
|
||||||
|
(depending on internal caching details).
|
||||||
|
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
@ -2303,7 +2298,7 @@ If the value of prefixexp has type <em>function</em>,
|
|||||||
then this function is called
|
then this function is called
|
||||||
with the given arguments.
|
with the given arguments.
|
||||||
Otherwise, the prefixexp "call" metamethod is called,
|
Otherwise, the prefixexp "call" metamethod is called,
|
||||||
having as first parameter the value of prefixexp,
|
having as first argument the value of prefixexp,
|
||||||
followed by the original call arguments
|
followed by the original call arguments
|
||||||
(see <a href="#2.4">§2.4</a>).
|
(see <a href="#2.4">§2.4</a>).
|
||||||
|
|
||||||
@ -2881,7 +2876,7 @@ it can do whatever it wants on that Lua state,
|
|||||||
as it should be already protected.
|
as it should be already protected.
|
||||||
However,
|
However,
|
||||||
when C code operates on other Lua states
|
when C code operates on other Lua states
|
||||||
(e.g., a Lua parameter to the function,
|
(e.g., a Lua argument to the function,
|
||||||
a Lua state stored in the registry, or
|
a Lua state stored in the registry, or
|
||||||
the result of <a href="#lua_newthread"><code>lua_newthread</code></a>),
|
the result of <a href="#lua_newthread"><code>lua_newthread</code></a>),
|
||||||
it should use them only in API calls that cannot raise errors.
|
it should use them only in API calls that cannot raise errors.
|
||||||
@ -3370,7 +3365,7 @@ it is left unchanged.
|
|||||||
Destroys all objects in the given Lua state
|
Destroys all objects in the given Lua state
|
||||||
(calling the corresponding garbage-collection metamethods, if any)
|
(calling the corresponding garbage-collection metamethods, if any)
|
||||||
and frees all dynamic memory used by this state.
|
and frees all dynamic memory used by this state.
|
||||||
On several platforms, you may not need to call this function,
|
In several platforms, you may not need to call this function,
|
||||||
because all resources are naturally released when the host program ends.
|
because all resources are naturally released when the host program ends.
|
||||||
On the other hand, long-running programs that create multiple states,
|
On the other hand, long-running programs that create multiple states,
|
||||||
such as daemons or web servers,
|
such as daemons or web servers,
|
||||||
@ -5584,7 +5579,7 @@ given as argument to a hook (see <a href="#lua_Hook"><code>lua_Hook</code></a>).
|
|||||||
|
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
To get information about a function you push it onto the stack
|
To get information about a function, you push it onto the stack
|
||||||
and start the <code>what</code> string with the character '<code>></code>'.
|
and start the <code>what</code> string with the character '<code>></code>'.
|
||||||
(In that case,
|
(In that case,
|
||||||
<code>lua_getinfo</code> pops the function from the top of the stack.)
|
<code>lua_getinfo</code> pops the function from the top of the stack.)
|
||||||
@ -6462,7 +6457,7 @@ file-related functions in the standard library
|
|||||||
|
|
||||||
<p>
|
<p>
|
||||||
Pushes onto the stack the field <code>e</code> from the metatable
|
Pushes onto the stack the field <code>e</code> from the metatable
|
||||||
of the object at index <code>obj</code> and returns the type of pushed value.
|
of the object at index <code>obj</code> and returns the type of the pushed value.
|
||||||
If the object does not have a metatable,
|
If the object does not have a metatable,
|
||||||
or if the metatable does not have this field,
|
or if the metatable does not have this field,
|
||||||
pushes nothing and returns <code>LUA_TNIL</code>.
|
pushes nothing and returns <code>LUA_TNIL</code>.
|
||||||
@ -6749,7 +6744,7 @@ In words, if the argument <code>arg</code> is nil or absent,
|
|||||||
the macro results in the default <code>dflt</code>.
|
the macro results in the default <code>dflt</code>.
|
||||||
Otherwise, it results in the result of calling <code>func</code>
|
Otherwise, it results in the result of calling <code>func</code>
|
||||||
with the state <code>L</code> and the argument index <code>arg</code> as
|
with the state <code>L</code> and the argument index <code>arg</code> as
|
||||||
parameters.
|
arguments.
|
||||||
Note that it evaluates the expression <code>dflt</code> only if needed.
|
Note that it evaluates the expression <code>dflt</code> only if needed.
|
||||||
|
|
||||||
|
|
||||||
@ -8680,7 +8675,7 @@ the lowercase letters plus the '<code>-</code>' character.
|
|||||||
<p>
|
<p>
|
||||||
You can put a closing square bracket in a set
|
You can put a closing square bracket in a set
|
||||||
by positioning it as the first character in the set.
|
by positioning it as the first character in the set.
|
||||||
You can put an hyphen in a set
|
You can put a hyphen in a set
|
||||||
by positioning it as the first or the last character in the set.
|
by positioning it as the first or the last character in the set.
|
||||||
(You can also use an escape for both cases.)
|
(You can also use an escape for both cases.)
|
||||||
|
|
||||||
@ -9082,8 +9077,8 @@ Returns the destination table <code>a2</code>.
|
|||||||
|
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Returns a new table with all parameters stored into keys 1, 2, etc.
|
Returns a new table with all arguments stored into keys 1, 2, etc.
|
||||||
and with a field "<code>n</code>" with the total number of parameters.
|
and with a field "<code>n</code>" with the total number of arguments.
|
||||||
Note that the resulting table may not be a sequence.
|
Note that the resulting table may not be a sequence.
|
||||||
|
|
||||||
|
|
||||||
@ -9215,7 +9210,7 @@ Returns the arc sine of <code>x</code> (in radians).
|
|||||||
<p>
|
<p>
|
||||||
|
|
||||||
Returns the arc tangent of <code>y/x</code> (in radians),
|
Returns the arc tangent of <code>y/x</code> (in radians),
|
||||||
but uses the signs of both parameters to find the
|
but uses the signs of both arguments to find the
|
||||||
quadrant of the result.
|
quadrant of the result.
|
||||||
(It also handles correctly the case of <code>x</code> being zero.)
|
(It also handles correctly the case of <code>x</code> being zero.)
|
||||||
|
|
||||||
@ -9516,7 +9511,7 @@ all I/O functions return <b>nil</b> on failure
|
|||||||
(plus an error message as a second result and
|
(plus an error message as a second result and
|
||||||
a system-dependent error code as a third result)
|
a system-dependent error code as a third result)
|
||||||
and some value different from <b>nil</b> on success.
|
and some value different from <b>nil</b> on success.
|
||||||
On non-POSIX systems,
|
In non-POSIX systems,
|
||||||
the computation of the error message and error code
|
the computation of the error message and error code
|
||||||
in case of errors
|
in case of errors
|
||||||
may be not thread safe,
|
may be not thread safe,
|
||||||
@ -9553,7 +9548,7 @@ When called with a file name, it opens the named file (in text mode),
|
|||||||
and sets its handle as the default input file.
|
and sets its handle as the default input file.
|
||||||
When called with a file handle,
|
When called with a file handle,
|
||||||
it simply sets this file handle as the default input file.
|
it simply sets this file handle as the default input file.
|
||||||
When called without parameters,
|
When called without arguments,
|
||||||
it returns the current default input file.
|
it returns the current default input file.
|
||||||
|
|
||||||
|
|
||||||
@ -9580,7 +9575,7 @@ it returns no values (to finish the loop) and automatically closes the file.
|
|||||||
The call <code>io.lines()</code> (with no file name) is equivalent
|
The call <code>io.lines()</code> (with no file name) is equivalent
|
||||||
to <code>io.input():lines("*l")</code>;
|
to <code>io.input():lines("*l")</code>;
|
||||||
that is, it iterates over the lines of the default input file.
|
that is, it iterates over the lines of the default input file.
|
||||||
In this case it does not close the file when the loop ends.
|
In this case, the iterator does not close the file when the loop ends.
|
||||||
|
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
@ -9963,7 +9958,7 @@ the host system and on the current locale.
|
|||||||
|
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
On non-POSIX systems,
|
In non-POSIX systems,
|
||||||
this function may be not thread safe
|
this function may be not thread safe
|
||||||
because of its reliance on C function <code>gmtime</code> and C function <code>localtime</code>.
|
because of its reliance on C function <code>gmtime</code> and C function <code>localtime</code>.
|
||||||
|
|
||||||
@ -10163,7 +10158,7 @@ and explicitly removed when no longer needed.
|
|||||||
|
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
On POSIX systems,
|
In POSIX systems,
|
||||||
this function also creates a file with that name,
|
this function also creates a file with that name,
|
||||||
to avoid security risks.
|
to avoid security risks.
|
||||||
(Someone else might create the file with wrong permissions
|
(Someone else might create the file with wrong permissions
|
||||||
@ -10301,8 +10296,8 @@ The first parameter or local variable has index 1, and so on,
|
|||||||
following the order that they are declared in the code,
|
following the order that they are declared in the code,
|
||||||
counting only the variables that are active
|
counting only the variables that are active
|
||||||
in the current scope of the function.
|
in the current scope of the function.
|
||||||
Negative indices refer to vararg parameters;
|
Negative indices refer to vararg arguments;
|
||||||
-1 is the first vararg parameter.
|
-1 is the first vararg argument.
|
||||||
The function returns <b>nil</b> if there is no variable with the given index,
|
The function returns <b>nil</b> if there is no variable with the given index,
|
||||||
and raises an error when called with a level out of range.
|
and raises an error when called with a level out of range.
|
||||||
(You can call <a href="#pdf-debug.getinfo"><code>debug.getinfo</code></a> to check whether the level is valid.)
|
(You can call <a href="#pdf-debug.getinfo"><code>debug.getinfo</code></a> to check whether the level is valid.)
|
||||||
@ -10400,7 +10395,7 @@ When called without arguments,
|
|||||||
|
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
When the hook is called, its first parameter is a string
|
When the hook is called, its first argument is a string
|
||||||
describing the event that has triggered its call:
|
describing the event that has triggered its call:
|
||||||
<code>"call"</code> (or <code>"tail call"</code>),
|
<code>"call"</code> (or <code>"tail call"</code>),
|
||||||
<code>"return"</code>,
|
<code>"return"</code>,
|
||||||
@ -10551,7 +10546,8 @@ The options are:
|
|||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li><b><code>-e <em>stat</em></code>: </b> executes string <em>stat</em>;</li>
|
<li><b><code>-e <em>stat</em></code>: </b> executes string <em>stat</em>;</li>
|
||||||
<li><b><code>-l <em>mod</em></code>: </b> "requires" <em>mod</em>;</li>
|
<li><b><code>-l <em>mod</em></code>: </b> "requires" <em>mod</em> and assigns the
|
||||||
|
result to global @<em>mod</em>;</li>
|
||||||
<li><b><code>-i</code>: </b> enters interactive mode after running <em>script</em>;</li>
|
<li><b><code>-i</code>: </b> enters interactive mode after running <em>script</em>;</li>
|
||||||
<li><b><code>-v</code>: </b> prints version information;</li>
|
<li><b><code>-v</code>: </b> prints version information;</li>
|
||||||
<li><b><code>-E</code>: </b> ignores environment variables;</li>
|
<li><b><code>-E</code>: </b> ignores environment variables;</li>
|
||||||
@ -10629,7 +10625,7 @@ For instance, the call
|
|||||||
</pre><p>
|
</pre><p>
|
||||||
will print "<code>-e</code>".
|
will print "<code>-e</code>".
|
||||||
If there is a script,
|
If there is a script,
|
||||||
the script is called with parameters
|
the script is called with arguments
|
||||||
<code>arg[1]</code>, ···, <code>arg[#arg]</code>.
|
<code>arg[1]</code>, ···, <code>arg[#arg]</code>.
|
||||||
(Like all chunks in Lua,
|
(Like all chunks in Lua,
|
||||||
the script is compiled as a vararg function.)
|
the script is compiled as a vararg function.)
|
||||||
@ -10815,7 +10811,7 @@ The following functions were deprecated in the mathematical library:
|
|||||||
<code>frexp</code>, and <code>ldexp</code>.
|
<code>frexp</code>, and <code>ldexp</code>.
|
||||||
You can replace <code>math.pow(x,y)</code> with <code>x^y</code>;
|
You can replace <code>math.pow(x,y)</code> with <code>x^y</code>;
|
||||||
you can replace <code>math.atan2</code> with <code>math.atan</code>,
|
you can replace <code>math.atan2</code> with <code>math.atan</code>,
|
||||||
which now accepts one or two parameters;
|
which now accepts one or two arguments;
|
||||||
you can replace <code>math.ldexp(x,exp)</code> with <code>x * 2.0^exp</code>.
|
you can replace <code>math.ldexp(x,exp)</code> with <code>x * 2.0^exp</code>.
|
||||||
For the other operations,
|
For the other operations,
|
||||||
you can either use an external library or
|
you can either use an external library or
|
||||||
@ -10850,7 +10846,7 @@ of the first result.)
|
|||||||
<ul>
|
<ul>
|
||||||
|
|
||||||
<li>
|
<li>
|
||||||
Continuation functions now receive as parameters what they needed
|
Continuation functions now receive as arguments what they needed
|
||||||
to get through <code>lua_getctx</code>,
|
to get through <code>lua_getctx</code>,
|
||||||
so <code>lua_getctx</code> has been removed.
|
so <code>lua_getctx</code> has been removed.
|
||||||
Adapt your code accordingly.
|
Adapt your code accordingly.
|
||||||
@ -10973,12 +10969,13 @@ and LiteralString, see <a href="#3.1">§3.1</a>.)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<P CLASS="footer">
|
<P CLASS="footer">
|
||||||
Last update:
|
Last update:
|
||||||
Mon Jan 9 13:30:53 BRST 2017
|
Tue Jun 26 13:16:37 -03 2018
|
||||||
</P>
|
</P>
|
||||||
<!--
|
<!--
|
||||||
Last change: revised for Lua 5.3.4
|
Last change: revised for Lua 5.3.5
|
||||||
-->
|
-->
|
||||||
|
|
||||||
</body></html>
|
</body></html>
|
||||||
|
@ -107,7 +107,7 @@ Here are the details.
|
|||||||
<OL>
|
<OL>
|
||||||
<LI>
|
<LI>
|
||||||
Open a terminal window and move to
|
Open a terminal window and move to
|
||||||
the top-level directory, which is named <TT>lua-5.3.x</TT>.
|
the top-level directory, which is named <TT>lua-5.3.5</TT>.
|
||||||
The <TT>Makefile</TT> there controls both the build process and the installation process.
|
The <TT>Makefile</TT> there controls both the build process and the installation process.
|
||||||
<P>
|
<P>
|
||||||
<LI>
|
<LI>
|
||||||
@ -355,10 +355,10 @@ THE SOFTWARE.
|
|||||||
|
|
||||||
<P CLASS="footer">
|
<P CLASS="footer">
|
||||||
Last update:
|
Last update:
|
||||||
Thu Dec 22 18:22:57 BRST 2016
|
Mon Jun 18 22:57:33 -03 2018
|
||||||
</P>
|
</P>
|
||||||
<!--
|
<!--
|
||||||
Last change: revised for Lua 5.3.4
|
Last change: revised for Lua 5.3.5
|
||||||
-->
|
-->
|
||||||
|
|
||||||
</BODY>
|
</BODY>
|
||||||
|
@ -102,7 +102,7 @@ c89:
|
|||||||
|
|
||||||
|
|
||||||
freebsd:
|
freebsd:
|
||||||
$(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_LINUX" SYSLIBS="-Wl,-E -lreadline"
|
$(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_LINUX -DLUA_USE_READLINE -I/usr/include/edit" SYSLIBS="-Wl,-E -ledit" CC="cc"
|
||||||
|
|
||||||
generic: $(ALL)
|
generic: $(ALL)
|
||||||
|
|
||||||
@ -110,7 +110,7 @@ linux:
|
|||||||
$(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_LINUX" SYSLIBS="-Wl,-E -ldl -lreadline"
|
$(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_LINUX" SYSLIBS="-Wl,-E -ldl -lreadline"
|
||||||
|
|
||||||
macosx:
|
macosx:
|
||||||
$(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_MACOSX" SYSLIBS="-lreadline" CC=cc
|
$(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_MACOSX" SYSLIBS="-lreadline"
|
||||||
|
|
||||||
mingw:
|
mingw:
|
||||||
$(MAKE) "LUA_A=lua53.dll" "LUA_T=lua.exe" \
|
$(MAKE) "LUA_A=lua53.dll" "LUA_T=lua.exe" \
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lapi.c,v 2.259 2016/02/29 14:27:14 roberto Exp $
|
** $Id: lapi.c,v 2.259.1.2 2017/12/06 18:35:12 roberto Exp $
|
||||||
** Lua API
|
** Lua API
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
@ -533,6 +533,7 @@ LUA_API void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n) {
|
|||||||
lua_lock(L);
|
lua_lock(L);
|
||||||
if (n == 0) {
|
if (n == 0) {
|
||||||
setfvalue(L->top, fn);
|
setfvalue(L->top, fn);
|
||||||
|
api_incr_top(L);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
CClosure *cl;
|
CClosure *cl;
|
||||||
@ -546,9 +547,9 @@ LUA_API void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n) {
|
|||||||
/* does not need barrier because closure is white */
|
/* does not need barrier because closure is white */
|
||||||
}
|
}
|
||||||
setclCvalue(L, L->top, cl);
|
setclCvalue(L, L->top, cl);
|
||||||
|
api_incr_top(L);
|
||||||
|
luaC_checkGC(L);
|
||||||
}
|
}
|
||||||
api_incr_top(L);
|
|
||||||
luaC_checkGC(L);
|
|
||||||
lua_unlock(L);
|
lua_unlock(L);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lapi.h,v 2.9 2015/03/06 19:49:50 roberto Exp $
|
** $Id: lapi.h,v 2.9.1.1 2017/04/19 17:20:42 roberto Exp $
|
||||||
** Auxiliary functions from Lua API
|
** Auxiliary functions from Lua API
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lauxlib.c,v 1.289 2016/12/20 18:37:00 roberto Exp $
|
** $Id: lauxlib.c,v 1.289.1.1 2017/04/19 17:20:42 roberto Exp $
|
||||||
** Auxiliary functions for building Lua libraries
|
** Auxiliary functions for building Lua libraries
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lauxlib.h,v 1.131 2016/12/06 14:54:31 roberto Exp $
|
** $Id: lauxlib.h,v 1.131.1.1 2017/04/19 17:20:42 roberto Exp $
|
||||||
** Auxiliary functions for building Lua libraries
|
** Auxiliary functions for building Lua libraries
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lbaselib.c,v 1.314 2016/09/05 19:06:34 roberto Exp $
|
** $Id: lbaselib.c,v 1.314.1.1 2017/04/19 17:39:34 roberto Exp $
|
||||||
** Basic library
|
** Basic library
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lbitlib.c,v 1.30 2015/11/11 19:08:09 roberto Exp $
|
** $Id: lbitlib.c,v 1.30.1.1 2017/04/19 17:20:42 roberto Exp $
|
||||||
** Standard library for bitwise operations
|
** Standard library for bitwise operations
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lcode.c,v 2.112 2016/12/22 13:08:50 roberto Exp $
|
** $Id: lcode.c,v 2.112.1.1 2017/04/19 17:20:42 roberto Exp $
|
||||||
** Code generator for Lua
|
** Code generator for Lua
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lcode.h,v 1.64 2016/01/05 16:22:37 roberto Exp $
|
** $Id: lcode.h,v 1.64.1.1 2017/04/19 17:20:42 roberto Exp $
|
||||||
** Code generator for Lua
|
** Code generator for Lua
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lcorolib.c,v 1.10 2016/04/11 19:19:55 roberto Exp $
|
** $Id: lcorolib.c,v 1.10.1.1 2017/04/19 17:20:42 roberto Exp $
|
||||||
** Coroutine Library
|
** Coroutine Library
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lctype.c,v 1.12 2014/11/02 19:19:04 roberto Exp $
|
** $Id: lctype.c,v 1.12.1.1 2017/04/19 17:20:42 roberto Exp $
|
||||||
** 'ctype' functions for Lua
|
** 'ctype' functions for Lua
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lctype.h,v 1.12 2011/07/15 12:50:29 roberto Exp $
|
** $Id: lctype.h,v 1.12.1.1 2013/04/12 18:48:47 roberto Exp $
|
||||||
** 'ctype' functions for Lua
|
** 'ctype' functions for Lua
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: ldblib.c,v 1.151 2015/11/23 11:29:43 roberto Exp $
|
** $Id: ldblib.c,v 1.151.1.1 2017/04/19 17:20:42 roberto Exp $
|
||||||
** Interface from Lua to its debug API
|
** Interface from Lua to its debug API
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: ldebug.c,v 2.121 2016/10/19 12:32:10 roberto Exp $
|
** $Id: ldebug.c,v 2.121.1.2 2017/07/10 17:21:50 roberto Exp $
|
||||||
** Debug Interface
|
** Debug Interface
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
@ -653,6 +653,7 @@ l_noret luaG_runerror (lua_State *L, const char *fmt, ...) {
|
|||||||
CallInfo *ci = L->ci;
|
CallInfo *ci = L->ci;
|
||||||
const char *msg;
|
const char *msg;
|
||||||
va_list argp;
|
va_list argp;
|
||||||
|
luaC_checkGC(L); /* error message uses memory */
|
||||||
va_start(argp, fmt);
|
va_start(argp, fmt);
|
||||||
msg = luaO_pushvfstring(L, fmt, argp); /* format message */
|
msg = luaO_pushvfstring(L, fmt, argp); /* format message */
|
||||||
va_end(argp);
|
va_end(argp);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: ldebug.h,v 2.14 2015/05/22 17:45:56 roberto Exp $
|
** $Id: ldebug.h,v 2.14.1.1 2017/04/19 17:20:42 roberto Exp $
|
||||||
** Auxiliary functions from Debug Interface module
|
** Auxiliary functions from Debug Interface module
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: ldo.c,v 2.157 2016/12/13 15:52:21 roberto Exp $
|
** $Id: ldo.c,v 2.157.1.1 2017/04/19 17:20:42 roberto Exp $
|
||||||
** Stack and Call structure of Lua
|
** Stack and Call structure of Lua
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: ldo.h,v 2.29 2015/12/21 13:02:14 roberto Exp $
|
** $Id: ldo.h,v 2.29.1.1 2017/04/19 17:20:42 roberto Exp $
|
||||||
** Stack and Call structure of Lua
|
** Stack and Call structure of Lua
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: ldump.c,v 2.37 2015/10/08 15:53:49 roberto Exp $
|
** $Id: ldump.c,v 2.37.1.1 2017/04/19 17:20:42 roberto Exp $
|
||||||
** save precompiled Lua chunks
|
** save precompiled Lua chunks
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lfunc.c,v 2.45 2014/11/02 19:19:04 roberto Exp $
|
** $Id: lfunc.c,v 2.45.1.1 2017/04/19 17:39:34 roberto Exp $
|
||||||
** Auxiliary functions to manipulate prototypes and closures
|
** Auxiliary functions to manipulate prototypes and closures
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lfunc.h,v 2.15 2015/01/13 15:49:11 roberto Exp $
|
** $Id: lfunc.h,v 2.15.1.1 2017/04/19 17:39:34 roberto Exp $
|
||||||
** Auxiliary functions to manipulate prototypes and closures
|
** Auxiliary functions to manipulate prototypes and closures
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lgc.c,v 2.215 2016/12/22 13:08:50 roberto Exp $
|
** $Id: lgc.c,v 2.215.1.2 2017/08/31 16:15:27 roberto Exp $
|
||||||
** Garbage Collector
|
** Garbage Collector
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
@ -643,8 +643,9 @@ static void clearkeys (global_State *g, GCObject *l, GCObject *f) {
|
|||||||
for (n = gnode(h, 0); n < limit; n++) {
|
for (n = gnode(h, 0); n < limit; n++) {
|
||||||
if (!ttisnil(gval(n)) && (iscleared(g, gkey(n)))) {
|
if (!ttisnil(gval(n)) && (iscleared(g, gkey(n)))) {
|
||||||
setnilvalue(gval(n)); /* remove value ... */
|
setnilvalue(gval(n)); /* remove value ... */
|
||||||
removeentry(n); /* and remove entry from table */
|
|
||||||
}
|
}
|
||||||
|
if (ttisnil(gval(n))) /* is entry empty? */
|
||||||
|
removeentry(n); /* remove entry from table */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lgc.h,v 2.91 2015/12/21 13:02:14 roberto Exp $
|
** $Id: lgc.h,v 2.91.1.1 2017/04/19 17:39:34 roberto Exp $
|
||||||
** Garbage Collector
|
** Garbage Collector
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: linit.c,v 1.39 2016/12/04 20:17:24 roberto Exp $
|
** $Id: linit.c,v 1.39.1.1 2017/04/19 17:20:42 roberto Exp $
|
||||||
** Initialization of libraries for lua.c and other clients
|
** Initialization of libraries for lua.c and other clients
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: liolib.c,v 2.151 2016/12/20 18:37:00 roberto Exp $
|
** $Id: liolib.c,v 2.151.1.1 2017/04/19 17:29:57 roberto Exp $
|
||||||
** Standard I/O (and system) library
|
** Standard I/O (and system) library
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
@ -206,11 +206,16 @@ static int aux_close (lua_State *L) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int f_close (lua_State *L) {
|
||||||
|
tofile(L); /* make sure argument is an open stream */
|
||||||
|
return aux_close(L);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int io_close (lua_State *L) {
|
static int io_close (lua_State *L) {
|
||||||
if (lua_isnone(L, 1)) /* no argument? */
|
if (lua_isnone(L, 1)) /* no argument? */
|
||||||
lua_getfield(L, LUA_REGISTRYINDEX, IO_OUTPUT); /* use standard output */
|
lua_getfield(L, LUA_REGISTRYINDEX, IO_OUTPUT); /* use standard output */
|
||||||
tofile(L); /* make sure argument is an open stream */
|
return f_close(L);
|
||||||
return aux_close(L);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -712,7 +717,7 @@ static const luaL_Reg iolib[] = {
|
|||||||
** methods for file handles
|
** methods for file handles
|
||||||
*/
|
*/
|
||||||
static const luaL_Reg flib[] = {
|
static const luaL_Reg flib[] = {
|
||||||
{"close", io_close},
|
{"close", f_close},
|
||||||
{"flush", f_flush},
|
{"flush", f_flush},
|
||||||
{"lines", f_lines},
|
{"lines", f_lines},
|
||||||
{"read", f_read},
|
{"read", f_read},
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: llex.c,v 2.96 2016/05/02 14:02:12 roberto Exp $
|
** $Id: llex.c,v 2.96.1.1 2017/04/19 17:20:42 roberto Exp $
|
||||||
** Lexical Analyzer
|
** Lexical Analyzer
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: llex.h,v 1.79 2016/05/02 14:02:12 roberto Exp $
|
** $Id: llex.h,v 1.79.1.1 2017/04/19 17:20:42 roberto Exp $
|
||||||
** Lexical Analyzer
|
** Lexical Analyzer
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: llimits.h,v 1.141 2015/11/19 19:16:22 roberto Exp $
|
** $Id: llimits.h,v 1.141.1.1 2017/04/19 17:20:42 roberto Exp $
|
||||||
** Limits, basic types, and some other 'installation-dependent' definitions
|
** Limits, basic types, and some other 'installation-dependent' definitions
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lmathlib.c,v 1.119 2016/12/22 13:08:50 roberto Exp $
|
** $Id: lmathlib.c,v 1.119.1.1 2017/04/19 17:20:42 roberto Exp $
|
||||||
** Standard mathematical library
|
** Standard mathematical library
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lmem.c,v 1.91 2015/03/06 19:45:54 roberto Exp $
|
** $Id: lmem.c,v 1.91.1.1 2017/04/19 17:20:42 roberto Exp $
|
||||||
** Interface to Memory Manager
|
** Interface to Memory Manager
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lmem.h,v 1.43 2014/12/19 17:26:14 roberto Exp $
|
** $Id: lmem.h,v 1.43.1.1 2017/04/19 17:20:42 roberto Exp $
|
||||||
** Interface to Memory Manager
|
** Interface to Memory Manager
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: loadlib.c,v 1.130 2017/01/12 17:14:26 roberto Exp $
|
** $Id: loadlib.c,v 1.130.1.1 2017/04/19 17:20:42 roberto Exp $
|
||||||
** Dynamic library loader for Lua
|
** Dynamic library loader for Lua
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
**
|
**
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lobject.c,v 2.113 2016/12/22 13:08:50 roberto Exp $
|
** $Id: lobject.c,v 2.113.1.1 2017/04/19 17:29:57 roberto Exp $
|
||||||
** Some generic functions over Lua objects
|
** Some generic functions over Lua objects
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
@ -435,7 +435,8 @@ const char *luaO_pushvfstring (lua_State *L, const char *fmt, va_list argp) {
|
|||||||
}
|
}
|
||||||
case 'p': { /* a pointer */
|
case 'p': { /* a pointer */
|
||||||
char buff[4*sizeof(void *) + 8]; /* should be enough space for a '%p' */
|
char buff[4*sizeof(void *) + 8]; /* should be enough space for a '%p' */
|
||||||
int l = l_sprintf(buff, sizeof(buff), "%p", va_arg(argp, void *));
|
void *p = va_arg(argp, void *);
|
||||||
|
int l = lua_pointer2str(buff, sizeof(buff), p);
|
||||||
pushstr(L, buff, l);
|
pushstr(L, buff, l);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lobject.h,v 2.117 2016/08/01 19:51:24 roberto Exp $
|
** $Id: lobject.h,v 2.117.1.1 2017/04/19 17:39:34 roberto Exp $
|
||||||
** Type definitions for Lua objects
|
** Type definitions for Lua objects
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lopcodes.c,v 1.55 2015/01/05 13:48:33 roberto Exp $
|
** $Id: lopcodes.c,v 1.55.1.1 2017/04/19 17:20:42 roberto Exp $
|
||||||
** Opcodes for Lua virtual machine
|
** Opcodes for Lua virtual machine
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lopcodes.h,v 1.149 2016/07/19 17:12:21 roberto Exp $
|
** $Id: lopcodes.h,v 1.149.1.1 2017/04/19 17:20:42 roberto Exp $
|
||||||
** Opcodes for Lua virtual machine
|
** Opcodes for Lua virtual machine
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: loslib.c,v 1.65 2016/07/18 17:58:58 roberto Exp $
|
** $Id: loslib.c,v 1.65.1.1 2017/04/19 17:29:57 roberto Exp $
|
||||||
** Standard Operating System library
|
** Standard Operating System library
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
@ -293,7 +293,8 @@ static int os_date (lua_State *L) {
|
|||||||
else
|
else
|
||||||
stm = l_localtime(&t, &tmr);
|
stm = l_localtime(&t, &tmr);
|
||||||
if (stm == NULL) /* invalid date? */
|
if (stm == NULL) /* invalid date? */
|
||||||
luaL_error(L, "time result cannot be represented in this installation");
|
return luaL_error(L,
|
||||||
|
"time result cannot be represented in this installation");
|
||||||
if (strcmp(s, "*t") == 0) {
|
if (strcmp(s, "*t") == 0) {
|
||||||
lua_createtable(L, 0, 9); /* 9 = number of fields */
|
lua_createtable(L, 0, 9); /* 9 = number of fields */
|
||||||
setallfields(L, stm);
|
setallfields(L, stm);
|
||||||
@ -340,7 +341,8 @@ static int os_time (lua_State *L) {
|
|||||||
setallfields(L, &ts); /* update fields with normalized values */
|
setallfields(L, &ts); /* update fields with normalized values */
|
||||||
}
|
}
|
||||||
if (t != (time_t)(l_timet)t || t == (time_t)(-1))
|
if (t != (time_t)(l_timet)t || t == (time_t)(-1))
|
||||||
luaL_error(L, "time result cannot be represented in this installation");
|
return luaL_error(L,
|
||||||
|
"time result cannot be represented in this installation");
|
||||||
l_pushtime(L, t);
|
l_pushtime(L, t);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lparser.c,v 2.155 2016/08/01 19:51:24 roberto Exp $
|
** $Id: lparser.c,v 2.155.1.2 2017/04/29 18:11:40 roberto Exp $
|
||||||
** Lua Parser
|
** Lua Parser
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
@ -1392,7 +1392,7 @@ static void test_then_block (LexState *ls, int *escapelist) {
|
|||||||
luaK_goiffalse(ls->fs, &v); /* will jump to label if condition is true */
|
luaK_goiffalse(ls->fs, &v); /* will jump to label if condition is true */
|
||||||
enterblock(fs, &bl, 0); /* must enter block before 'goto' */
|
enterblock(fs, &bl, 0); /* must enter block before 'goto' */
|
||||||
gotostat(ls, v.t); /* handle goto/break */
|
gotostat(ls, v.t); /* handle goto/break */
|
||||||
skipnoopstat(ls); /* skip other no-op statements */
|
while (testnext(ls, ';')) {} /* skip colons */
|
||||||
if (block_follow(ls, 0)) { /* 'goto' is the entire block? */
|
if (block_follow(ls, 0)) { /* 'goto' is the entire block? */
|
||||||
leaveblock(fs);
|
leaveblock(fs);
|
||||||
return; /* and that is it */
|
return; /* and that is it */
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lparser.h,v 1.76 2015/12/30 18:16:13 roberto Exp $
|
** $Id: lparser.h,v 1.76.1.1 2017/04/19 17:20:42 roberto Exp $
|
||||||
** Lua Parser
|
** Lua Parser
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lprefix.h,v 1.2 2014/12/29 16:54:13 roberto Exp $
|
** $Id: lprefix.h,v 1.2.1.1 2017/04/19 17:20:42 roberto Exp $
|
||||||
** Definitions for Lua code that must come before any other header file
|
** Definitions for Lua code that must come before any other header file
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lstate.c,v 2.133 2015/11/13 12:16:51 roberto Exp $
|
** $Id: lstate.c,v 2.133.1.1 2017/04/19 17:39:34 roberto Exp $
|
||||||
** Global State
|
** Global State
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lstate.h,v 2.133 2016/12/22 13:08:50 roberto Exp $
|
** $Id: lstate.h,v 2.133.1.1 2017/04/19 17:39:34 roberto Exp $
|
||||||
** Global State
|
** Global State
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
@ -26,6 +26,24 @@
|
|||||||
** 'tobefnz': all objects ready to be finalized;
|
** 'tobefnz': all objects ready to be finalized;
|
||||||
** 'fixedgc': all objects that are not to be collected (currently
|
** 'fixedgc': all objects that are not to be collected (currently
|
||||||
** only small strings, such as reserved words).
|
** only small strings, such as reserved words).
|
||||||
|
**
|
||||||
|
** Moreover, there is another set of lists that control gray objects.
|
||||||
|
** These lists are linked by fields 'gclist'. (All objects that
|
||||||
|
** can become gray have such a field. The field is not the same
|
||||||
|
** in all objects, but it always has this name.) Any gray object
|
||||||
|
** must belong to one of these lists, and all objects in these lists
|
||||||
|
** must be gray:
|
||||||
|
**
|
||||||
|
** 'gray': regular gray objects, still waiting to be visited.
|
||||||
|
** 'grayagain': objects that must be revisited at the atomic phase.
|
||||||
|
** That includes
|
||||||
|
** - black objects got in a write barrier;
|
||||||
|
** - all kinds of weak tables during propagation phase;
|
||||||
|
** - all threads.
|
||||||
|
** 'weak': tables with weak values to be cleared;
|
||||||
|
** 'ephemeron': ephemeron tables with white->white entries;
|
||||||
|
** 'allweak': tables with weak keys and/or weak values to be cleared.
|
||||||
|
** The last three lists are used only during the atomic phase.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lstring.c,v 2.56 2015/11/23 11:32:51 roberto Exp $
|
** $Id: lstring.c,v 2.56.1.1 2017/04/19 17:20:42 roberto Exp $
|
||||||
** String table (keeps all strings handled by Lua)
|
** String table (keeps all strings handled by Lua)
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lstring.h,v 1.61 2015/11/03 15:36:01 roberto Exp $
|
** $Id: lstring.h,v 1.61.1.1 2017/04/19 17:20:42 roberto Exp $
|
||||||
** String table (keep all strings handled by Lua)
|
** String table (keep all strings handled by Lua)
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lstrlib.c,v 1.254 2016/12/22 13:08:50 roberto Exp $
|
** $Id: lstrlib.c,v 1.254.1.1 2017/04/19 17:29:57 roberto Exp $
|
||||||
** Standard library for string operations and pattern-matching
|
** Standard library for string operations and pattern-matching
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
@ -879,7 +879,7 @@ static int lua_number2strx (lua_State *L, char *buff, int sz,
|
|||||||
buff[i] = toupper(uchar(buff[i]));
|
buff[i] = toupper(uchar(buff[i]));
|
||||||
}
|
}
|
||||||
else if (fmt[SIZELENMOD] != 'a')
|
else if (fmt[SIZELENMOD] != 'a')
|
||||||
luaL_error(L, "modifiers for format '%%a'/'%%A' not implemented");
|
return luaL_error(L, "modifiers for format '%%a'/'%%A' not implemented");
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -928,6 +928,7 @@ static void addquoted (luaL_Buffer *b, const char *s, size_t len) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#if LUA_FLOAT_TYPE != LUA_FLOAT_INT64
|
||||||
/*
|
/*
|
||||||
** Ensures the 'buff' string uses a dot as the radix character.
|
** Ensures the 'buff' string uses a dot as the radix character.
|
||||||
*/
|
*/
|
||||||
@ -938,7 +939,7 @@ static void checkdp (char *buff, int nb) {
|
|||||||
if (ppoint) *ppoint = '.'; /* change it to a dot */
|
if (ppoint) *ppoint = '.'; /* change it to a dot */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static void addliteral (lua_State *L, luaL_Buffer *b, int arg) {
|
static void addliteral (lua_State *L, luaL_Buffer *b, int arg) {
|
||||||
switch (lua_type(L, arg)) {
|
switch (lua_type(L, arg)) {
|
||||||
@ -1209,8 +1210,8 @@ static int getnum (const char **fmt, int df) {
|
|||||||
static int getnumlimit (Header *h, const char **fmt, int df) {
|
static int getnumlimit (Header *h, const char **fmt, int df) {
|
||||||
int sz = getnum(fmt, df);
|
int sz = getnum(fmt, df);
|
||||||
if (sz > MAXINTSIZE || sz <= 0)
|
if (sz > MAXINTSIZE || sz <= 0)
|
||||||
luaL_error(h->L, "integral size (%d) out of limits [1,%d]",
|
return luaL_error(h->L, "integral size (%d) out of limits [1,%d]",
|
||||||
sz, MAXINTSIZE);
|
sz, MAXINTSIZE);
|
||||||
return sz;
|
return sz;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: ltable.c,v 2.118 2016/11/07 12:38:35 roberto Exp $
|
** $Id: ltable.c,v 2.118.1.4 2018/06/08 16:22:51 roberto Exp $
|
||||||
** Lua tables (hash)
|
** Lua tables (hash)
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
@ -223,7 +223,9 @@ static unsigned int computesizes (unsigned int nums[], unsigned int *pna) {
|
|||||||
unsigned int na = 0; /* number of elements to go to array part */
|
unsigned int na = 0; /* number of elements to go to array part */
|
||||||
unsigned int optimal = 0; /* optimal size for array part */
|
unsigned int optimal = 0; /* optimal size for array part */
|
||||||
/* loop while keys can fill more than half of total size */
|
/* loop while keys can fill more than half of total size */
|
||||||
for (i = 0, twotoi = 1; *pna > twotoi / 2; i++, twotoi *= 2) {
|
for (i = 0, twotoi = 1;
|
||||||
|
twotoi > 0 && *pna > twotoi / 2;
|
||||||
|
i++, twotoi *= 2) {
|
||||||
if (nums[i] > 0) {
|
if (nums[i] > 0) {
|
||||||
a += nums[i];
|
a += nums[i];
|
||||||
if (a > twotoi/2) { /* more than half elements present? */
|
if (a > twotoi/2) { /* more than half elements present? */
|
||||||
@ -330,17 +332,34 @@ static void setnodevector (lua_State *L, Table *t, unsigned int size) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
Table *t;
|
||||||
|
unsigned int nhsize;
|
||||||
|
} AuxsetnodeT;
|
||||||
|
|
||||||
|
|
||||||
|
static void auxsetnode (lua_State *L, void *ud) {
|
||||||
|
AuxsetnodeT *asn = cast(AuxsetnodeT *, ud);
|
||||||
|
setnodevector(L, asn->t, asn->nhsize);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void luaH_resize (lua_State *L, Table *t, unsigned int nasize,
|
void luaH_resize (lua_State *L, Table *t, unsigned int nasize,
|
||||||
unsigned int nhsize) {
|
unsigned int nhsize) {
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
int j;
|
int j;
|
||||||
|
AuxsetnodeT asn;
|
||||||
unsigned int oldasize = t->sizearray;
|
unsigned int oldasize = t->sizearray;
|
||||||
int oldhsize = allocsizenode(t);
|
int oldhsize = allocsizenode(t);
|
||||||
Node *nold = t->node; /* save old hash ... */
|
Node *nold = t->node; /* save old hash ... */
|
||||||
if (nasize > oldasize) /* array part must grow? */
|
if (nasize > oldasize) /* array part must grow? */
|
||||||
setarrayvector(L, t, nasize);
|
setarrayvector(L, t, nasize);
|
||||||
/* create new hash part with appropriate size */
|
/* create new hash part with appropriate size */
|
||||||
setnodevector(L, t, nhsize);
|
asn.t = t; asn.nhsize = nhsize;
|
||||||
|
if (luaD_rawrunprotected(L, auxsetnode, &asn) != LUA_OK) { /* mem. error? */
|
||||||
|
setarrayvector(L, t, oldasize); /* array back to its original size */
|
||||||
|
luaD_throw(L, LUA_ERRMEM); /* rethrow memory error */
|
||||||
|
}
|
||||||
if (nasize < oldasize) { /* array part must shrink? */
|
if (nasize < oldasize) { /* array part must shrink? */
|
||||||
t->sizearray = nasize;
|
t->sizearray = nasize;
|
||||||
/* re-insert elements from vanishing slice */
|
/* re-insert elements from vanishing slice */
|
||||||
@ -610,13 +629,13 @@ void luaH_setint (lua_State *L, Table *t, lua_Integer key, TValue *value) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int unbound_search (Table *t, unsigned int j) {
|
static lua_Unsigned unbound_search (Table *t, lua_Unsigned j) {
|
||||||
unsigned int i = j; /* i is zero or a present index */
|
lua_Unsigned i = j; /* i is zero or a present index */
|
||||||
j++;
|
j++;
|
||||||
/* find 'i' and 'j' such that i is present and j is not */
|
/* find 'i' and 'j' such that i is present and j is not */
|
||||||
while (!ttisnil(luaH_getint(t, j))) {
|
while (!ttisnil(luaH_getint(t, j))) {
|
||||||
i = j;
|
i = j;
|
||||||
if (j > cast(unsigned int, MAX_INT)/2) { /* overflow? */
|
if (j > l_castS2U(LUA_MAXINTEGER) / 2) { /* overflow? */
|
||||||
/* table was built with bad purposes: resort to linear search */
|
/* table was built with bad purposes: resort to linear search */
|
||||||
i = 1;
|
i = 1;
|
||||||
while (!ttisnil(luaH_getint(t, i))) i++;
|
while (!ttisnil(luaH_getint(t, i))) i++;
|
||||||
@ -626,7 +645,7 @@ static int unbound_search (Table *t, unsigned int j) {
|
|||||||
}
|
}
|
||||||
/* now do a binary search between them */
|
/* now do a binary search between them */
|
||||||
while (j - i > 1) {
|
while (j - i > 1) {
|
||||||
unsigned int m = (i+j)/2;
|
lua_Unsigned m = (i+j)/2;
|
||||||
if (ttisnil(luaH_getint(t, m))) j = m;
|
if (ttisnil(luaH_getint(t, m))) j = m;
|
||||||
else i = m;
|
else i = m;
|
||||||
}
|
}
|
||||||
@ -638,7 +657,7 @@ static int unbound_search (Table *t, unsigned int j) {
|
|||||||
** Try to find a boundary in table 't'. A 'boundary' is an integer index
|
** Try to find a boundary in table 't'. A 'boundary' is an integer index
|
||||||
** such that t[i] is non-nil and t[i+1] is nil (and 0 if t[1] is nil).
|
** such that t[i] is non-nil and t[i+1] is nil (and 0 if t[1] is nil).
|
||||||
*/
|
*/
|
||||||
int luaH_getn (Table *t) {
|
lua_Unsigned luaH_getn (Table *t) {
|
||||||
unsigned int j = t->sizearray;
|
unsigned int j = t->sizearray;
|
||||||
if (j > 0 && ttisnil(&t->array[j - 1])) {
|
if (j > 0 && ttisnil(&t->array[j - 1])) {
|
||||||
/* there is a boundary in the array part: (binary) search for it */
|
/* there is a boundary in the array part: (binary) search for it */
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: ltable.h,v 2.23 2016/12/22 13:08:50 roberto Exp $
|
** $Id: ltable.h,v 2.23.1.2 2018/05/24 19:39:05 roberto Exp $
|
||||||
** Lua tables (hash)
|
** Lua tables (hash)
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
@ -54,7 +54,7 @@ LUAI_FUNC void luaH_resize (lua_State *L, Table *t, unsigned int nasize,
|
|||||||
LUAI_FUNC void luaH_resizearray (lua_State *L, Table *t, unsigned int nasize);
|
LUAI_FUNC void luaH_resizearray (lua_State *L, Table *t, unsigned int nasize);
|
||||||
LUAI_FUNC void luaH_free (lua_State *L, Table *t);
|
LUAI_FUNC void luaH_free (lua_State *L, Table *t);
|
||||||
LUAI_FUNC int luaH_next (lua_State *L, Table *t, StkId key);
|
LUAI_FUNC int luaH_next (lua_State *L, Table *t, StkId key);
|
||||||
LUAI_FUNC int luaH_getn (Table *t);
|
LUAI_FUNC lua_Unsigned luaH_getn (Table *t);
|
||||||
|
|
||||||
|
|
||||||
#if defined(LUA_DEBUG)
|
#if defined(LUA_DEBUG)
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: ltablib.c,v 1.93 2016/02/25 19:41:54 roberto Exp $
|
** $Id: ltablib.c,v 1.93.1.1 2017/04/19 17:20:42 roberto Exp $
|
||||||
** Library for Table Manipulation
|
** Library for Table Manipulation
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: ltm.c,v 2.38 2016/12/22 13:08:50 roberto Exp $
|
** $Id: ltm.c,v 2.38.1.1 2017/04/19 17:39:34 roberto Exp $
|
||||||
** Tag methods
|
** Tag methods
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: ltm.h,v 2.22 2016/02/26 19:20:15 roberto Exp $
|
** $Id: ltm.h,v 2.22.1.1 2017/04/19 17:20:42 roberto Exp $
|
||||||
** Tag methods
|
** Tag methods
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lua.c,v 1.230 2017/01/12 17:14:26 roberto Exp $
|
** $Id: lua.c,v 1.230.1.1 2017/04/19 17:29:57 roberto Exp $
|
||||||
** Lua stand-alone interpreter
|
** Lua stand-alone interpreter
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
@ -138,7 +138,7 @@ static void print_usage (const char *badoption) {
|
|||||||
"Available options are:\n"
|
"Available options are:\n"
|
||||||
" -e stat execute string 'stat'\n"
|
" -e stat execute string 'stat'\n"
|
||||||
" -i enter interactive mode after executing 'script'\n"
|
" -i enter interactive mode after executing 'script'\n"
|
||||||
" -l name require library 'name'\n"
|
" -l name require library 'name' into global 'name'\n"
|
||||||
" -v show version information\n"
|
" -v show version information\n"
|
||||||
" -E ignore environment variables\n"
|
" -E ignore environment variables\n"
|
||||||
" -- stop handling options\n"
|
" -- stop handling options\n"
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lua.h,v 1.332 2016/12/22 15:51:20 roberto Exp $
|
** $Id: lua.h,v 1.332.1.2 2018/06/13 16:58:17 roberto Exp $
|
||||||
** Lua - A Scripting Language
|
** Lua - A Scripting Language
|
||||||
** Lua.org, PUC-Rio, Brazil (http://www.lua.org)
|
** Lua.org, PUC-Rio, Brazil (http://www.lua.org)
|
||||||
** See Copyright Notice at the end of this file
|
** See Copyright Notice at the end of this file
|
||||||
@ -19,11 +19,11 @@
|
|||||||
#define LUA_VERSION_MAJOR "5"
|
#define LUA_VERSION_MAJOR "5"
|
||||||
#define LUA_VERSION_MINOR "3"
|
#define LUA_VERSION_MINOR "3"
|
||||||
#define LUA_VERSION_NUM 503
|
#define LUA_VERSION_NUM 503
|
||||||
#define LUA_VERSION_RELEASE "4"
|
#define LUA_VERSION_RELEASE "5"
|
||||||
|
|
||||||
#define LUA_VERSION "Lua " LUA_VERSION_MAJOR "." LUA_VERSION_MINOR
|
#define LUA_VERSION "Lua " LUA_VERSION_MAJOR "." LUA_VERSION_MINOR
|
||||||
#define LUA_RELEASE LUA_VERSION "." LUA_VERSION_RELEASE
|
#define LUA_RELEASE LUA_VERSION "." LUA_VERSION_RELEASE
|
||||||
#define LUA_COPYRIGHT LUA_RELEASE " Copyright (C) 1994-2017 Lua.org, PUC-Rio"
|
#define LUA_COPYRIGHT LUA_RELEASE " Copyright (C) 1994-2018 Lua.org, PUC-Rio"
|
||||||
#define LUA_AUTHORS "R. Ierusalimschy, L. H. de Figueiredo, W. Celes"
|
#define LUA_AUTHORS "R. Ierusalimschy, L. H. de Figueiredo, W. Celes"
|
||||||
|
|
||||||
|
|
||||||
@ -460,7 +460,7 @@ struct lua_Debug {
|
|||||||
|
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* Copyright (C) 1994-2017 Lua.org, PUC-Rio.
|
* Copyright (C) 1994-2018 Lua.org, PUC-Rio.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining
|
* Permission is hereby granted, free of charge, to any person obtaining
|
||||||
* a copy of this software and associated documentation files (the
|
* a copy of this software and associated documentation files (the
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: luac.c,v 1.75 2015/03/12 01:58:27 lhf Exp $
|
** $Id: luac.c,v 1.76 2018/06/19 01:32:02 lhf Exp $
|
||||||
** Lua compiler (saves bytecodes to files; also lists bytecodes)
|
** Lua compiler (saves bytecodes to files; also lists bytecodes)
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
@ -206,7 +206,7 @@ int main(int argc, char* argv[])
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** $Id: luac.c,v 1.75 2015/03/12 01:58:27 lhf Exp $
|
** $Id: luac.c,v 1.76 2018/06/19 01:32:02 lhf Exp $
|
||||||
** print bytecodes
|
** print bytecodes
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
@ -348,6 +348,7 @@ static void PrintCode(const Proto* f)
|
|||||||
case OP_ADD:
|
case OP_ADD:
|
||||||
case OP_SUB:
|
case OP_SUB:
|
||||||
case OP_MUL:
|
case OP_MUL:
|
||||||
|
case OP_MOD:
|
||||||
case OP_POW:
|
case OP_POW:
|
||||||
case OP_DIV:
|
case OP_DIV:
|
||||||
case OP_IDIV:
|
case OP_IDIV:
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lualib.h,v 1.45 2017/01/12 17:14:26 roberto Exp $
|
** $Id: lualib.h,v 1.45.1.1 2017/04/19 17:20:42 roberto Exp $
|
||||||
** Lua standard libraries
|
** Lua standard libraries
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lundump.c,v 2.44 2015/11/02 16:09:30 roberto Exp $
|
** $Id: lundump.c,v 2.44.1.1 2017/04/19 17:20:42 roberto Exp $
|
||||||
** load precompiled Lua chunks
|
** load precompiled Lua chunks
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lundump.h,v 1.45 2015/09/08 15:41:05 roberto Exp $
|
** $Id: lundump.h,v 1.45.1.1 2017/04/19 17:20:42 roberto Exp $
|
||||||
** load precompiled Lua chunks
|
** load precompiled Lua chunks
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lutf8lib.c,v 1.16 2016/12/22 13:08:50 roberto Exp $
|
** $Id: lutf8lib.c,v 1.16.1.1 2017/04/19 17:29:57 roberto Exp $
|
||||||
** Standard library for UTF-8 manipulation
|
** Standard library for UTF-8 manipulation
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
@ -171,7 +171,7 @@ static int byteoffset (lua_State *L) {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (iscont(s + posi))
|
if (iscont(s + posi))
|
||||||
luaL_error(L, "initial position is a continuation byte");
|
return luaL_error(L, "initial position is a continuation byte");
|
||||||
if (n < 0) {
|
if (n < 0) {
|
||||||
while (n < 0 && posi > 0) { /* move back */
|
while (n < 0 && posi > 0) { /* move back */
|
||||||
do { /* find beginning of previous character */
|
do { /* find beginning of previous character */
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lvm.c,v 2.268 2016/02/05 19:59:14 roberto Exp $
|
** $Id: lvm.c,v 2.268.1.1 2017/04/19 17:39:34 roberto Exp $
|
||||||
** Lua virtual machine
|
** Lua virtual machine
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
@ -41,7 +41,7 @@
|
|||||||
** float without rounding. Used in comparisons. Left undefined if
|
** float without rounding. Used in comparisons. Left undefined if
|
||||||
** all integers fit in a float precisely.
|
** all integers fit in a float precisely.
|
||||||
*/
|
*/
|
||||||
#if !defined(l_intfitsf)
|
#if !defined(l_intfitsf) && LUA_FLOAT_TYPE != LUA_FLOAT_INT64
|
||||||
|
|
||||||
/* number of bits in the mantissa of a float */
|
/* number of bits in the mantissa of a float */
|
||||||
#define NBM (l_mathlim(MANT_DIG))
|
#define NBM (l_mathlim(MANT_DIG))
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lvm.h,v 2.41 2016/12/22 13:08:50 roberto Exp $
|
** $Id: lvm.h,v 2.41.1.1 2017/04/19 17:20:42 roberto Exp $
|
||||||
** Lua virtual machine
|
** Lua virtual machine
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lzio.c,v 1.37 2015/09/08 15:41:05 roberto Exp $
|
** $Id: lzio.c,v 1.37.1.1 2017/04/19 17:20:42 roberto Exp $
|
||||||
** Buffered streams
|
** Buffered streams
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user