Merge from HEAD
This commit is contained in:
commit
2e370a5c7a
@ -14,6 +14,15 @@
|
||||
# The file is partitioned: OLD_FILES first, then OLD_LIBS and OLD_DIRS last.
|
||||
#
|
||||
|
||||
# 20090522: removal of University of Michigan NFSv4 client
|
||||
OLD_FILES+=etc/rc.d/idmapd
|
||||
OLD_FILES+=sbin/idmapd
|
||||
OLD_FILES+=sbin/mount_nfs4
|
||||
OLD_FILES+=usr/share/man/man8/idmapd.8.gz
|
||||
OLD_FILES+=usr/share/man/man8/mount_nfs4.8.gz
|
||||
# 20090513: removal of legacy versions of USB network interface drivers
|
||||
OLD_FILES+=usr/include/legacy/dev/usb/if_upgtvar.h
|
||||
OLD_FILES+=usr/include/legacy/dev/usb/usb_ethersubr.h
|
||||
# 20090417: removal of legacy versions of USB network interface drivers
|
||||
OLD_FILES+=usr/include/legacy/dev/usb/if_auereg.h
|
||||
OLD_FILES+=usr/include/legacy/dev/usb/if_axereg.h
|
||||
|
24
UPDATING
24
UPDATING
@ -22,6 +22,28 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 8.x IS SLOW:
|
||||
to maximize performance. (To disable malloc debugging, run
|
||||
ln -s aj /etc/malloc.conf.)
|
||||
|
||||
20090523:
|
||||
The layout of struct vnet_net has changed, therefore modules
|
||||
need to be rebuilt.
|
||||
Bump __FreeBSD_version to 800090.
|
||||
|
||||
20090523:
|
||||
The newly imported zic(8) produces a new format in the
|
||||
output. Please run tzsetup(8) to install the newly created
|
||||
data to /etc/localtime.
|
||||
|
||||
20090520:
|
||||
The sysctl tree for the usb stack has renamed from hw.usb2.* to
|
||||
hw.usb.* and is now consistent again with previous releases.
|
||||
|
||||
20090520:
|
||||
802.11 monitor mode support was revised and driver api's
|
||||
were changed. Drivers dependent on net80211 now support
|
||||
DLT_IEEE802_11_RADIO instead of DLT_IEEE802_11. No
|
||||
user-visible data structures were changed but applications
|
||||
that use DLT_IEEE802_11 may require changes.
|
||||
Bump __FreeBSD_version to 800088.
|
||||
|
||||
20090430:
|
||||
The layout of the following structs has changed: sysctl_oid,
|
||||
socket, ifnet, inpcbinfo, tcpcb, syncache_head, vnet_inet,
|
||||
@ -262,7 +284,7 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 8.x IS SLOW:
|
||||
memory segment of size > 2 GB on the 64-bit architectures.
|
||||
Due to a limitation of the existing ABI, the shm_segsz member
|
||||
of the struct shmid_ds, returned by shmctl(IPC_STAT) call is
|
||||
wrong for large segments. Note that limits must be explicitely
|
||||
wrong for large segments. Note that limits must be explicitly
|
||||
raised to allow such segments to be created.
|
||||
|
||||
20090301:
|
||||
|
@ -115,7 +115,7 @@ main(int argc, char *argv[])
|
||||
fts_options |= FTS_LOGICAL;
|
||||
}
|
||||
} else
|
||||
fts_options = FTS_LOGICAL;
|
||||
fts_options = hflag ? FTS_PHYSICAL : FTS_LOGICAL;
|
||||
|
||||
/* XXX: Why don't chflags and lchflags have compatible prototypes? */
|
||||
if (hflag)
|
||||
|
@ -3,6 +3,6 @@
|
||||
|
||||
PROG= cp
|
||||
SRCS= cp.c utils.c
|
||||
CFLAGS+= -DVM_AND_BUFFER_CACHE_SYNCHRONIZED
|
||||
CFLAGS+= -DVM_AND_BUFFER_CACHE_SYNCHRONIZED -D_ACL_PRIVATE
|
||||
|
||||
.include <bsd.prog.mk>
|
||||
|
@ -36,7 +36,7 @@
|
||||
.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
.\" POSSIBILITY OF SUCH DAMAGE.
|
||||
.\"
|
||||
.Dd November 23, 2006
|
||||
.Dd May 16, 2009
|
||||
.Dt PKILL 1
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -44,7 +44,7 @@
|
||||
.Nd find or signal processes by name
|
||||
.Sh SYNOPSIS
|
||||
.Nm pgrep
|
||||
.Op Fl LSfilnovx
|
||||
.Op Fl LSafilnovx
|
||||
.Op Fl F Ar pidfile
|
||||
.Op Fl G Ar gid
|
||||
.Op Fl M Ar core
|
||||
@ -60,7 +60,7 @@
|
||||
.Ar pattern ...
|
||||
.Nm pkill
|
||||
.Op Fl Ar signal
|
||||
.Op Fl ILfinovx
|
||||
.Op Fl ILafinovx
|
||||
.Op Fl F Ar pidfile
|
||||
.Op Fl G Ar gid
|
||||
.Op Fl M Ar core
|
||||
@ -128,6 +128,15 @@ The default is a newline.
|
||||
This option can only be used with the
|
||||
.Nm pgrep
|
||||
command.
|
||||
.It Fl a
|
||||
Include process ancestors in the match list.
|
||||
By default, the current
|
||||
.Nm pgrep
|
||||
or
|
||||
.Nm pkill
|
||||
process and all of its ancestors are excluded (unless
|
||||
.Fl v
|
||||
is used).
|
||||
.It Fl f
|
||||
Match against full argument lists.
|
||||
The default is to match against process names.
|
||||
|
@ -133,7 +133,7 @@ main(int argc, char **argv)
|
||||
{
|
||||
char buf[_POSIX2_LINE_MAX], *mstr, **pargv, *p, *q, *pidfile;
|
||||
const char *execf, *coref;
|
||||
int debug_opt;
|
||||
int ancestors, debug_opt;
|
||||
int i, ch, bestidx, rv, criteria, pidfromfile, pidfilelock;
|
||||
size_t jsz;
|
||||
int (*action)(const struct kinfo_proc *);
|
||||
@ -142,6 +142,7 @@ main(int argc, char **argv)
|
||||
struct timeval best_tval;
|
||||
regex_t reg;
|
||||
regmatch_t regmatch;
|
||||
pid_t pid;
|
||||
|
||||
setlocale(LC_ALL, "");
|
||||
|
||||
@ -174,13 +175,14 @@ main(int argc, char **argv)
|
||||
}
|
||||
}
|
||||
|
||||
ancestors = 0;
|
||||
criteria = 0;
|
||||
debug_opt = 0;
|
||||
pidfile = NULL;
|
||||
pidfilelock = 0;
|
||||
execf = coref = _PATH_DEVNULL;
|
||||
|
||||
while ((ch = getopt(argc, argv, "DF:G:ILM:N:P:SU:d:fg:ij:lnos:t:u:vx")) != -1)
|
||||
while ((ch = getopt(argc, argv, "DF:G:ILM:N:P:SU:ad:fg:ij:lnos:t:u:vx")) != -1)
|
||||
switch (ch) {
|
||||
case 'D':
|
||||
debug_opt++;
|
||||
@ -220,6 +222,9 @@ main(int argc, char **argv)
|
||||
makelist(&ruidlist, LT_USER, optarg);
|
||||
criteria = 1;
|
||||
break;
|
||||
case 'a':
|
||||
ancestors++;
|
||||
break;
|
||||
case 'd':
|
||||
if (!pgrep)
|
||||
usage();
|
||||
@ -468,6 +473,27 @@ main(int argc, char **argv)
|
||||
selected[i] = 1;
|
||||
}
|
||||
|
||||
if (!ancestors) {
|
||||
pid = mypid;
|
||||
while (pid) {
|
||||
for (i = 0, kp = plist; i < nproc; i++, kp++) {
|
||||
if (PSKIP(kp))
|
||||
continue;
|
||||
if (kp->ki_pid == pid) {
|
||||
selected[i] = 0;
|
||||
pid = kp->ki_ppid;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (i == nproc) {
|
||||
if (pid == mypid)
|
||||
pid = getppid();
|
||||
else
|
||||
break; /* Maybe we're in a jail ? */
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (newest || oldest) {
|
||||
best_tval.tv_sec = 0;
|
||||
best_tval.tv_usec = 0;
|
||||
|
@ -130,9 +130,11 @@ command(KINFO *k, VARENT *ve)
|
||||
if (cflag) {
|
||||
/* If it is the last field, then don't pad */
|
||||
if (STAILQ_NEXT(ve, next_ve) == NULL) {
|
||||
if (k->ki_d.prefix)
|
||||
(void)printf("%s", k->ki_d.prefix);
|
||||
(void)printf("%s", k->ki_p->ki_comm);
|
||||
if (showthreads && k->ki_p->ki_numthreads > 1)
|
||||
printf("/%s", k->ki_p->ki_ocomm);
|
||||
(void)printf("/%s", k->ki_p->ki_ocomm);
|
||||
} else
|
||||
(void)printf("%-*s", v->width, k->ki_p->ki_comm);
|
||||
return;
|
||||
@ -140,16 +142,22 @@ command(KINFO *k, VARENT *ve)
|
||||
if ((vis_args = malloc(strlen(k->ki_args) * 4 + 1)) == NULL)
|
||||
errx(1, "malloc failed");
|
||||
strvis(vis_args, k->ki_args, VIS_TAB | VIS_NL | VIS_NOSLASH);
|
||||
if (k->ki_env) {
|
||||
if ((vis_env = malloc(strlen(k->ki_env) * 4 + 1)) == NULL)
|
||||
errx(1, "malloc failed");
|
||||
strvis(vis_env, k->ki_env, VIS_TAB | VIS_NL | VIS_NOSLASH);
|
||||
} else
|
||||
vis_env = NULL;
|
||||
|
||||
if (STAILQ_NEXT(ve, next_ve) == NULL) {
|
||||
/* last field */
|
||||
|
||||
if (k->ki_env) {
|
||||
if ((vis_env = malloc(strlen(k->ki_env) * 4 + 1))
|
||||
== NULL)
|
||||
errx(1, "malloc failed");
|
||||
strvis(vis_env, k->ki_env,
|
||||
VIS_TAB | VIS_NL | VIS_NOSLASH);
|
||||
} else
|
||||
vis_env = NULL;
|
||||
|
||||
if (termwidth == UNLIMITED) {
|
||||
if (k->ki_d.prefix)
|
||||
(void)printf("%s", k->ki_d.prefix);
|
||||
if (vis_env)
|
||||
(void)printf("%s ", vis_env);
|
||||
(void)printf("%s", vis_args);
|
||||
@ -157,6 +165,9 @@ command(KINFO *k, VARENT *ve)
|
||||
left = termwidth - (totwidth - v->width);
|
||||
if (left < 1) /* already wrapped, just use std width */
|
||||
left = v->width;
|
||||
if ((cp = k->ki_d.prefix) != NULL)
|
||||
while (--left >= 0 && *cp)
|
||||
(void)putchar(*cp++);
|
||||
if ((cp = vis_env) != NULL) {
|
||||
while (--left >= 0 && *cp)
|
||||
(void)putchar(*cp++);
|
||||
@ -166,12 +177,12 @@ command(KINFO *k, VARENT *ve)
|
||||
for (cp = vis_args; --left >= 0 && *cp != '\0';)
|
||||
(void)putchar(*cp++);
|
||||
}
|
||||
if (vis_env != NULL)
|
||||
free(vis_env);
|
||||
} else
|
||||
/* XXX env? */
|
||||
/* ki_d.prefix & ki_env aren't shown for interim fields */
|
||||
(void)printf("%-*.*s", v->width, v->width, vis_args);
|
||||
free(vis_args);
|
||||
if (vis_env != NULL)
|
||||
free(vis_env);
|
||||
}
|
||||
|
||||
void
|
||||
@ -182,6 +193,8 @@ ucomm(KINFO *k, VARENT *ve)
|
||||
|
||||
v = ve->var;
|
||||
if (STAILQ_NEXT(ve, next_ve) == NULL) { /* last field, don't pad */
|
||||
if (k->ki_d.prefix)
|
||||
(void)printf("%s", k->ki_d.prefix);
|
||||
(void)printf("%s", k->ki_p->ki_comm);
|
||||
if (showthreads && k->ki_p->ki_numthreads > 1)
|
||||
printf("/%s", k->ki_p->ki_ocomm);
|
||||
@ -583,6 +596,10 @@ elapsed(KINFO *k, VARENT *ve)
|
||||
char obuff[128];
|
||||
|
||||
v = ve->var;
|
||||
if (!k->ki_valid) {
|
||||
(void)printf("%-*s", v->width, "-");
|
||||
return;
|
||||
}
|
||||
val = now - k->ki_p->ki_start.tv_sec;
|
||||
days = val / (24 * 60 * 60);
|
||||
val %= 24 * 60 * 60;
|
||||
|
13
bin/ps/ps.1
13
bin/ps/ps.1
@ -29,7 +29,7 @@
|
||||
.\" @(#)ps.1 8.3 (Berkeley) 4/18/94
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd August 21, 2006
|
||||
.Dd May 16, 2009
|
||||
.Dt PS 1
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -37,7 +37,7 @@
|
||||
.Nd process status
|
||||
.Sh SYNOPSIS
|
||||
.Nm
|
||||
.Op Fl aCcefHhjlmrSTuvwXxZ
|
||||
.Op Fl aCcdefHhjlmrSTuvwXxZ
|
||||
.Op Fl O Ar fmt | Fl o Ar fmt
|
||||
.Op Fl G Ar gid Ns Op , Ns Ar gid Ns Ar ...
|
||||
.Op Fl M Ar core
|
||||
@ -122,6 +122,15 @@ CPU calculation that ignores
|
||||
.Dq resident
|
||||
time (this normally has
|
||||
no effect).
|
||||
.It Fl d
|
||||
Arrange processes into descendancy order and prefix each command with
|
||||
indentation text showing sibling and parent/child relationships.
|
||||
If either of the
|
||||
.Fl m
|
||||
and
|
||||
.Fl r
|
||||
options are also used, they control how sibling processes are sorted
|
||||
relative to eachother.
|
||||
.It Fl e
|
||||
Display the environment as well.
|
||||
.It Fl f
|
||||
|
135
bin/ps/ps.c
135
bin/ps/ps.c
@ -138,6 +138,7 @@ static int addelem_pid(struct listinfo *, const char *);
|
||||
static int addelem_tty(struct listinfo *, const char *);
|
||||
static int addelem_uid(struct listinfo *, const char *);
|
||||
static void add_list(struct listinfo *, const char *);
|
||||
static void descendant_sort(KINFO *, int);
|
||||
static void dynsizevars(KINFO *);
|
||||
static void *expand_list(struct listinfo *);
|
||||
static const char *
|
||||
@ -163,7 +164,7 @@ static char vfmt[] = "pid,state,time,sl,re,pagein,vsz,rss,lim,tsiz,"
|
||||
"%cpu,%mem,command";
|
||||
static char Zfmt[] = "label";
|
||||
|
||||
#define PS_ARGS "AaCce" OPT_LAZY_f "G:gHhjLlM:mN:O:o:p:rSTt:U:uvwXxZ"
|
||||
#define PS_ARGS "AaCcde" OPT_LAZY_f "G:gHhjLlM:mN:O:o:p:rSTt:U:uvwXxZ"
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
@ -177,7 +178,7 @@ main(int argc, char *argv[])
|
||||
const char *nlistf, *memf;
|
||||
char *cols;
|
||||
int all, ch, elem, flag, _fmt, i, lineno;
|
||||
int nentries, nkept, nselectors;
|
||||
int descendancy, nentries, nkept, nselectors;
|
||||
int prtheader, wflag, what, xkeep, xkeep_implied;
|
||||
char errbuf[_POSIX2_LINE_MAX];
|
||||
|
||||
@ -201,7 +202,7 @@ main(int argc, char *argv[])
|
||||
if (argc > 1)
|
||||
argv[1] = kludge_oldps_options(PS_ARGS, argv[1], argv[2]);
|
||||
|
||||
all = _fmt = nselectors = optfatal = 0;
|
||||
all = descendancy = _fmt = nselectors = optfatal = 0;
|
||||
prtheader = showthreads = wflag = xkeep_implied = 0;
|
||||
xkeep = -1; /* Neither -x nor -X. */
|
||||
init_list(&gidlist, addelem_gid, sizeof(gid_t), "group");
|
||||
@ -233,6 +234,9 @@ main(int argc, char *argv[])
|
||||
case 'c':
|
||||
cflag = 1;
|
||||
break;
|
||||
case 'd':
|
||||
descendancy = 1;
|
||||
break;
|
||||
case 'e': /* XXX set ufmt */
|
||||
needenv = 1;
|
||||
break;
|
||||
@ -575,6 +579,8 @@ main(int argc, char *argv[])
|
||||
keepit:
|
||||
next_KINFO = &kinfo[nkept];
|
||||
next_KINFO->ki_p = kp;
|
||||
next_KINFO->ki_d.level = 0;
|
||||
next_KINFO->ki_d.prefix = NULL;
|
||||
next_KINFO->ki_pcpu = getpcpu(next_KINFO);
|
||||
if (sortby == SORTMEM)
|
||||
next_KINFO->ki_memsize = kp->ki_tsize +
|
||||
@ -599,6 +605,13 @@ main(int argc, char *argv[])
|
||||
* sort proc list
|
||||
*/
|
||||
qsort(kinfo, nkept, sizeof(KINFO), pscomp);
|
||||
|
||||
/*
|
||||
* We want things in descendant order
|
||||
*/
|
||||
if (descendancy)
|
||||
descendant_sort(kinfo, nkept);
|
||||
|
||||
/*
|
||||
* For each process, call each variable output function.
|
||||
*/
|
||||
@ -622,6 +635,9 @@ main(int argc, char *argv[])
|
||||
free_list(&sesslist);
|
||||
free_list(&ttylist);
|
||||
free_list(&uidlist);
|
||||
for (i = 0; i < nkept; i++)
|
||||
free(kinfo[i].ki_d.prefix);
|
||||
free(kinfo);
|
||||
|
||||
exit(eval);
|
||||
}
|
||||
@ -748,7 +764,7 @@ addelem_tty(struct listinfo *inf, const char *elem)
|
||||
strlcat(pathbuf2, elem, sizeof(pathbuf2));
|
||||
if (stat(pathbuf2, &sb) == 0 && S_ISCHR(sb.st_mode)) {
|
||||
/* No need to repeat stat() && S_ISCHR() checks */
|
||||
ttypath = NULL;
|
||||
ttypath = NULL;
|
||||
break;
|
||||
}
|
||||
/* Check to see if /dev/pts/${elem} exists */
|
||||
@ -756,7 +772,7 @@ addelem_tty(struct listinfo *inf, const char *elem)
|
||||
strlcat(pathbuf3, elem, sizeof(pathbuf3));
|
||||
if (stat(pathbuf3, &sb) == 0 && S_ISCHR(sb.st_mode)) {
|
||||
/* No need to repeat stat() && S_ISCHR() checks */
|
||||
ttypath = NULL;
|
||||
ttypath = NULL;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
@ -890,6 +906,115 @@ add_list(struct listinfo *inf, const char *argp)
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
descendant_sort(KINFO *ki, int items)
|
||||
{
|
||||
int dst, lvl, maxlvl, n, ndst, nsrc, siblings, src;
|
||||
unsigned char *path;
|
||||
KINFO kn;
|
||||
|
||||
/*
|
||||
* First, sort the entries by descendancy, tracking the descendancy
|
||||
* depth in the ki_d.level field.
|
||||
*/
|
||||
src = 0;
|
||||
maxlvl = 0;
|
||||
while (src < items) {
|
||||
if (ki[src].ki_d.level) {
|
||||
src++;
|
||||
continue;
|
||||
}
|
||||
for (nsrc = 1; src + nsrc < items; nsrc++)
|
||||
if (!ki[src + nsrc].ki_d.level)
|
||||
break;
|
||||
|
||||
for (dst = 0; dst < items; dst++) {
|
||||
if (ki[dst].ki_p->ki_pid == ki[src].ki_p->ki_pid)
|
||||
continue;
|
||||
if (ki[dst].ki_p->ki_pid == ki[src].ki_p->ki_ppid)
|
||||
break;
|
||||
}
|
||||
|
||||
if (dst == items) {
|
||||
src += nsrc;
|
||||
continue;
|
||||
}
|
||||
|
||||
for (ndst = 1; dst + ndst < items; ndst++)
|
||||
if (ki[dst + ndst].ki_d.level <= ki[dst].ki_d.level)
|
||||
break;
|
||||
|
||||
for (n = src; n < src + nsrc; n++) {
|
||||
ki[n].ki_d.level += ki[dst].ki_d.level + 1;
|
||||
if (maxlvl < ki[n].ki_d.level)
|
||||
maxlvl = ki[n].ki_d.level;
|
||||
}
|
||||
|
||||
while (nsrc) {
|
||||
if (src < dst) {
|
||||
kn = ki[src];
|
||||
memmove(ki + src, ki + src + 1,
|
||||
(dst - src + ndst - 1) * sizeof *ki);
|
||||
ki[dst + ndst - 1] = kn;
|
||||
nsrc--;
|
||||
dst--;
|
||||
ndst++;
|
||||
} else if (src != dst + ndst) {
|
||||
kn = ki[src];
|
||||
memmove(ki + dst + ndst + 1, ki + dst + ndst,
|
||||
(src - dst - ndst) * sizeof *ki);
|
||||
ki[dst + ndst] = kn;
|
||||
ndst++;
|
||||
nsrc--;
|
||||
src++;
|
||||
} else {
|
||||
ndst += nsrc;
|
||||
src += nsrc;
|
||||
nsrc = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Now populate ki_d.prefix (instead of ki_d.level) with the command
|
||||
* prefix used to show descendancies.
|
||||
*/
|
||||
path = malloc((maxlvl + 7) / 8);
|
||||
memset(path, '\0', (maxlvl + 7) / 8);
|
||||
for (src = 0; src < items; src++) {
|
||||
if ((lvl = ki[src].ki_d.level) == 0) {
|
||||
ki[src].ki_d.prefix = NULL;
|
||||
continue;
|
||||
}
|
||||
if ((ki[src].ki_d.prefix = malloc(lvl * 2 + 1)) == NULL)
|
||||
errx(1, "malloc failed");
|
||||
for (n = 0; n < lvl - 2; n++) {
|
||||
ki[src].ki_d.prefix[n * 2] =
|
||||
path[n / 8] & 1 << (n % 8) ? '|' : ' ';
|
||||
ki[src].ki_d.prefix[n * 2 + 1] = ' ';
|
||||
}
|
||||
if (n == lvl - 2) {
|
||||
/* Have I any more siblings? */
|
||||
for (siblings = 0, dst = src + 1; dst < items; dst++) {
|
||||
if (ki[dst].ki_d.level > lvl)
|
||||
continue;
|
||||
if (ki[dst].ki_d.level == lvl)
|
||||
siblings = 1;
|
||||
break;
|
||||
}
|
||||
if (siblings)
|
||||
path[n / 8] |= 1 << (n % 8);
|
||||
else
|
||||
path[n / 8] &= ~(1 << (n % 8));
|
||||
ki[src].ki_d.prefix[n * 2] = siblings ? '|' : '`';
|
||||
ki[src].ki_d.prefix[n * 2 + 1] = '-';
|
||||
n++;
|
||||
}
|
||||
strcpy(ki[src].ki_d.prefix + n * 2, "- ");
|
||||
}
|
||||
free(path);
|
||||
}
|
||||
|
||||
static void *
|
||||
expand_list(struct listinfo *inf)
|
||||
{
|
||||
|
@ -42,6 +42,10 @@ typedef struct kinfo {
|
||||
int ki_valid; /* 1 => uarea stuff valid */
|
||||
double ki_pcpu; /* calculated in main() */
|
||||
segsz_t ki_memsize; /* calculated in main() */
|
||||
union {
|
||||
int level; /* used in decendant_sort() */
|
||||
char *prefix; /* calculated in decendant_sort() */
|
||||
} ki_d;
|
||||
} KINFO;
|
||||
|
||||
/* Variables. */
|
||||
|
@ -418,6 +418,7 @@ typedef struct vsecattr {
|
||||
#define VOP_FSYNC(vp, f, cr, ct) fsync((vp)->v_fd)
|
||||
|
||||
#define VN_RELE(vp) vn_close(vp, 0, NULL, NULL)
|
||||
#define VN_RELE_ASYNC(vp, taskq) vn_close(vp, 0, NULL, NULL)
|
||||
|
||||
#define vn_lock(vp, type)
|
||||
#define VOP_UNLOCK(vp, type)
|
||||
|
@ -13,7 +13,7 @@
|
||||
# ATOMIC_SRCS
|
||||
.if ${MACHINE_ARCH} == "i386" || ${MACHINE_ARCH} == "amd64" || ${MACHINE_ARCH} == "ia64"
|
||||
.PATH: ${.CURDIR}/../../../sys/cddl/contrib/opensolaris/common/atomic/${MACHINE_ARCH}
|
||||
ATOMIC_SRCS= atomic.S
|
||||
ATOMIC_SRCS= opensolaris_atomic.S
|
||||
.else
|
||||
.PATH: ${.CURDIR}/../../../sys/cddl/compat/opensolaris/kern
|
||||
ATOMIC_SRCS= opensolaris_atomic.c
|
||||
|
@ -1,3 +1,59 @@
|
||||
2009-05-06 10:25 Christos Zoulas <christos@zoulas.com>
|
||||
|
||||
* Avoid null dereference in cdf code (Drew Yao)
|
||||
|
||||
* More cdf bounds checks and overflow checks
|
||||
|
||||
2009-05-01 18:37 Christos Zoulas <christos@zoulas.com>
|
||||
|
||||
* Buffer overflow fixes from Drew Yao
|
||||
|
||||
2009-04-30 17:10 Christos Zoulas <christos@zoulas.com>
|
||||
|
||||
* Fix more cdf lossage. All the documents I have
|
||||
right now print the correct information.
|
||||
|
||||
2009-03-27 18:43 Christos Zoulas <christos@zoulas.com>
|
||||
|
||||
* don't print \012- separators in the same magic entry
|
||||
if it consists of multiple magic printing lines.
|
||||
|
||||
2009-03-23 10:20 Christos Zoulas <christos@zoulas.com>
|
||||
|
||||
* Avoid file descriptor leak in compress code from
|
||||
(Daniel Novotny)
|
||||
|
||||
2009-03-18 16:50 Christos Zoulas <christos@zoulas.com>
|
||||
|
||||
* Allow escaping of relation characters, so that we can say \^[A-Z]
|
||||
and the ^ is not eaten as a relation char.
|
||||
|
||||
* Fix troff and fortran to their previous glory using
|
||||
regex. This was broken since their removel from ascmagic.
|
||||
|
||||
2009-03-10 16:50 Christos Zoulas <christos@zoulas.com>
|
||||
|
||||
* don't use strlen in strndup() (Toby Peterson)
|
||||
|
||||
2009-03-10 7:45 Christos Zoulas <christos@zoulas.com>
|
||||
|
||||
* avoid c99 syntax.
|
||||
|
||||
2009-02-23 15:45 Christos Zoulas <christos@zoulas.com>
|
||||
|
||||
* make the cdf code use the buffer first if available,
|
||||
and then the fd code.
|
||||
|
||||
2009-02-13 13:45 Christos Zoulas <christos@zoulas.com>
|
||||
|
||||
* look for struct option to determine if getopt.h is usable for IRIX.
|
||||
|
||||
* sanitize cdf document strings
|
||||
|
||||
2009-02-04 13:25 Christos Zoulas <christos@zoulas.com>
|
||||
|
||||
* fix OS/2 warnings.
|
||||
|
||||
2008-12-12 15:50 Christos Zoulas <christos@zoulas.com>
|
||||
|
||||
* fix initial offset calculation for non 4K sector files
|
||||
|
@ -17,6 +17,15 @@
|
||||
>4 belong >30 compiled Java class data,
|
||||
>>6 beshort x version %d.
|
||||
>>4 beshort x \b%d
|
||||
# Which is which?
|
||||
#>>4 belong 0x032d (Java 1.0)
|
||||
#>>4 belong 0x032d (Java 1.1)
|
||||
>>4 belong 0x002e (Java 1.2)
|
||||
>>4 belong 0x002f (Java 1.3)
|
||||
>>4 belong 0x0030 (Java 1.4)
|
||||
>>4 belong 0x0031 (Java 1.5)
|
||||
>>4 belong 0x0032 (Java 1.6)
|
||||
|
||||
|
||||
0 belong 0xcafebabe
|
||||
>4 belong 1 Mach-O fat file with 1 architecture
|
||||
|
@ -195,6 +195,10 @@
|
||||
# bug #364260)
|
||||
#0 string ]\000\000\200\000 LZMA compressed data
|
||||
|
||||
# http://tukaani.org/xz/xz-file-format.txt
|
||||
0 ustring \xFD7zXZ\x00 xz compressed data
|
||||
!:mime application/x-xz
|
||||
|
||||
# AFX compressed files (Wolfram Kleff)
|
||||
2 string -afx- AFX compressed file data
|
||||
|
||||
@ -208,3 +212,8 @@
|
||||
>4 byte x - version %d
|
||||
>5 byte x \b.%d
|
||||
>6 belong x (%d bytes)
|
||||
|
||||
# Type: XZ
|
||||
# URL: http://tukaani.org/xz/
|
||||
0 string \xfd\x37\x7a\x58\x5a\x00 XZ compressed data
|
||||
!:mime application/x-xz
|
||||
|
@ -242,3 +242,28 @@
|
||||
# URL: http://www.grc.nasa.gov/WWW/cgns/adf/
|
||||
# From: Nicolas Chauvat <nicolas.chauvat@logilab.fr>
|
||||
0 string @(#)ADF\ Database CGNS Advanced Data Format
|
||||
|
||||
# Tokyo Cabinet magic data
|
||||
# http://tokyocabinet.sourceforge.net/index.html
|
||||
0 string ToKyO\ CaBiNeT\n Tokyo Cabinet
|
||||
>14 string x \b (%s)
|
||||
>32 byte 0 \b, Hash
|
||||
!:mime application/x-tokyocabinet-hash
|
||||
>32 byte 1 \b, B+ tree
|
||||
!:mime application/x-tokyocabinet-btree
|
||||
>32 byte 2 \b, Fixed-length
|
||||
!:mime application/x-tokyocabinet-fixed
|
||||
>32 byte 3 \b, Table
|
||||
!:mime application/x-tokyocabinet-table
|
||||
>33 byte &1 \b, [open]
|
||||
>33 byte &2 \b, [fatal]
|
||||
>34 byte x \b, apow=%d
|
||||
>35 byte x \b, fpow=%d
|
||||
>36 byte &0x01 \b, [large]
|
||||
>36 byte &0x02 \b, [deflate]
|
||||
>36 byte &0x04 \b, [bzip]
|
||||
>36 byte &0x08 \b, [tcbs]
|
||||
>36 byte &0x10 \b, [excodec]
|
||||
>40 lequad x \b, bnum=%lld
|
||||
>48 lequad x \b, rnum=%lld
|
||||
>56 lequad x \b, fsiz=%lld
|
||||
|
@ -12,7 +12,7 @@
|
||||
>8 string BEAM Erlang BEAM file
|
||||
|
||||
# 4.2 version may have a copyright notice!
|
||||
4 string Tue Jan 22 14:32:44 MET 1991 Erlang JAM file - version 4.2
|
||||
79 string Tue Jan 22 14:32:44 MET 1991 Erlang JAM file - version 4.2
|
||||
4 string Tue\ Jan\ 22\ 14:32:44\ MET\ 1991 Erlang JAM file - version 4.2
|
||||
79 string Tue\ Jan\ 22\ 14:32:44\ MET\ 1991 Erlang JAM file - version 4.2
|
||||
|
||||
4 string 1.0 Fri Feb 3 09:55:56 MET 1995 Erlang JAM file - version 4.3
|
||||
4 string 1.0\ Fri\ Feb\ 3\ 09:55:56\ MET\ 1995 Erlang JAM file - version 4.3
|
||||
|
@ -891,7 +891,7 @@
|
||||
0x410 leshort 0x2478 Minix filesystem, version 2, 30 char names
|
||||
|
||||
# romfs filesystems - Juan Cespedes <cespedes@debian.org>
|
||||
0 string -rom1fs-\0 romfs filesystem, version 1
|
||||
0 string -rom1fs- romfs filesystem, version 1
|
||||
>8 belong x %d bytes,
|
||||
>16 string x named %s.
|
||||
|
||||
|
@ -6,8 +6,8 @@
|
||||
0 short 017001 byte-swapped Berkeley vfont data
|
||||
|
||||
# PostScript fonts (must precede "printer" entries), quinlan@yggdrasil.com
|
||||
0 search/1 %!PS-AdobeFont-1. PostScript Type 1 font text
|
||||
>20 search/1 >\0 (%s)
|
||||
0 string %!PS-AdobeFont-1. PostScript Type 1 font text
|
||||
>20 string >\0 (%s)
|
||||
6 string %!PS-AdobeFont-1. PostScript Type 1 font program data
|
||||
|
||||
# X11 font files in SNF (Server Natural Format) format
|
||||
@ -55,6 +55,8 @@
|
||||
0 string \007\001\001\000Copyright\ (c)\ 199 Adobe Multiple Master font
|
||||
0 string \012\001\001\000Copyright\ (c)\ 199 Adobe Multiple Master font
|
||||
|
||||
0 string ttcf TrueType font collection data
|
||||
|
||||
# Opentype font data from Avi Bercovich
|
||||
0 string OTTO OpenType font data
|
||||
|
||||
|
@ -1,3 +1,3 @@
|
||||
# FORTRAN source
|
||||
0 string/c c\ FORTRAN program
|
||||
0 regex/100 \^[Cc][\ \t] FORTRAN program
|
||||
!:mime text/x-fortran
|
||||
|
32
contrib/file/Magdir/kml
Normal file
32
contrib/file/Magdir/kml
Normal file
@ -0,0 +1,32 @@
|
||||
#------------------------------------------------------------------------------
|
||||
# Type: Google KML, formerly Keyhole Markup Language
|
||||
# Future development of this format has been handed
|
||||
# over to the Open Geospatial Consortium.
|
||||
# http://www.opengeospatial.org/standards/kml/
|
||||
# From: Asbjoern Sloth Toennesen <asbjorn@lila.io>
|
||||
0 string \<?xml
|
||||
>20 search/400 \ xmlns=
|
||||
>>&0 regex ['"]http://earth.google.com/kml Google KML document
|
||||
!:mime application/vnd.google-earth.kml+xml
|
||||
>>>&1 string 2.0' \b, version 2.0
|
||||
>>>&1 string 2.1' \b, version 2.1
|
||||
>>>&1 string 2.2' \b, version 2.2
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Type: OpenGIS KML, formerly Keyhole Markup Language
|
||||
# This standard is maintained by the
|
||||
# Open Geospatial Consortium.
|
||||
# http://www.opengeospatial.org/standards/kml/
|
||||
# From: Asbjoern Sloth Toennesen <asbjorn@lila.io>
|
||||
>>&0 regex ['"]http://www.opengis.net/kml OpenGIS KML document
|
||||
!:mime application/vnd.google-earth.kml+xml
|
||||
>>>&1 string 2.2 \b, version 2.2
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Type: Google KML Archive (ZIP based)
|
||||
# http://code.google.com/apis/kml/documentation/kml_tut.html
|
||||
# From: Asbjoern Sloth Toennesen <asbjorn@lila.io>
|
||||
0 string PK\003\004
|
||||
>4 byte 0x14
|
||||
>>30 string doc.kml Compressed Google KML Document, including resources.
|
||||
!:mime application/vnd.google-earth.kmz
|
@ -84,7 +84,7 @@
|
||||
514 string HdrS Linux kernel
|
||||
>510 leshort 0xAA55 x86 boot executable
|
||||
>>518 leshort >0x1ff
|
||||
>>529 byte 0 zImage,
|
||||
>>>529 byte 0 zImage,
|
||||
>>>529 byte 1 bzImage,
|
||||
>>>(526.s+0x200) string >\0 version %s,
|
||||
>>498 leshort 1 RO-rootFS,
|
||||
|
@ -8,22 +8,22 @@
|
||||
#0 string ;;
|
||||
# windows INF files often begin with semicolon and use CRLF as line end
|
||||
# lisp files are mainly created on unix system with LF as line end
|
||||
#>2 search/2048 !\r Lisp/Scheme program text
|
||||
#>2 search/2048 \r Windows INF file
|
||||
#>2 search/4096 !\r Lisp/Scheme program text
|
||||
#>2 search/4096 \r Windows INF file
|
||||
|
||||
0 search/256 (if\ Lisp/Scheme program text
|
||||
0 search/4096 (if\ Lisp/Scheme program text
|
||||
!:mime text/x-lisp
|
||||
0 search/256 (setq\ Lisp/Scheme program text
|
||||
0 search/4096 (setq\ Lisp/Scheme program text
|
||||
!:mime text/x-lisp
|
||||
0 search/256 (defvar\ Lisp/Scheme program text
|
||||
0 search/4096 (defvar\ Lisp/Scheme program text
|
||||
!:mime text/x-lisp
|
||||
0 search/256 (defparam\ Lisp/Scheme program text
|
||||
0 search/4096 (defparam\ Lisp/Scheme program text
|
||||
!:mime text/x-lisp
|
||||
0 search/256 (defun\ Lisp/Scheme program text
|
||||
0 search/4096 (defun\ Lisp/Scheme program text
|
||||
!:mime text/x-lisp
|
||||
0 search/256 (autoload\ Lisp/Scheme program text
|
||||
0 search/4096 (autoload\ Lisp/Scheme program text
|
||||
!:mime text/x-lisp
|
||||
0 search/256 (custom-set-variables\ Lisp/Scheme program text
|
||||
0 search/4096 (custom-set-variables\ Lisp/Scheme program text
|
||||
!:mime text/x-lisp
|
||||
|
||||
# Emacs 18 - this is always correct, but not very magical.
|
||||
|
@ -14,6 +14,8 @@
|
||||
0 belong 0x3bf20d0a python 2.3 byte-compiled
|
||||
0 belong 0x6df20d0a python 2.4 byte-compiled
|
||||
0 belong 0xb3f20d0a python 2.5 byte-compiled
|
||||
0 belong 0xd1f20d0a python 2.6 byte-compiled
|
||||
|
||||
|
||||
0 string/b #!\ /usr/bin/python python script text executable
|
||||
|
||||
|
@ -14,6 +14,10 @@
|
||||
!:mime text/troff
|
||||
0 search/1 ''' troff or preprocessor input text
|
||||
!:mime text/troff
|
||||
0 regex/20 \^\\.[A-Za-z0-9][A-Za-z0-9][\ \t] troff or preprocessor input text
|
||||
!:mime text/troff
|
||||
0 regex/20 \^\\.[A-Za-z0-9][A-Za-z0-9]$ troff or preprocessor input text
|
||||
!:mime text/troff
|
||||
|
||||
# ditroff intermediate output text
|
||||
0 search/1 x\ T ditroff output text
|
||||
|
@ -113,3 +113,9 @@
|
||||
0 string REGEDIT4\r\n\r\n Windows Registry text (Win95 or above)
|
||||
0 string Windows\ Registry\ Editor\
|
||||
>&0 string Version\ 5.00\r\n\r\n Windows Registry text (Win2K or above)
|
||||
|
||||
|
||||
# From: Pal Tamas <folti@balabit.hu>
|
||||
# Autorun File
|
||||
0 string/c [autorun]\r\n Microsoft Windows Autorun file.
|
||||
!:mime application/x-setupscript.
|
||||
|
@ -1,5 +1,5 @@
|
||||
#
|
||||
# $File: Makefile.am,v 1.44 2009/01/28 02:11:20 christos Exp $
|
||||
# $File: Makefile.am,v 1.45 2009/03/05 22:40:59 christos Exp $
|
||||
#
|
||||
MAGIC_FRAGMENT_BASE = Magdir
|
||||
MAGIC_FRAGMENT_DIR = $(top_srcdir)/magic/$(MAGIC_FRAGMENT_BASE)
|
||||
@ -97,6 +97,7 @@ $(MAGIC_FRAGMENT_DIR)/java \
|
||||
$(MAGIC_FRAGMENT_DIR)/jpeg \
|
||||
$(MAGIC_FRAGMENT_DIR)/karma \
|
||||
$(MAGIC_FRAGMENT_DIR)/kde \
|
||||
$(MAGIC_FRAGMENT_DIR)/kml \
|
||||
$(MAGIC_FRAGMENT_DIR)/lecter \
|
||||
$(MAGIC_FRAGMENT_DIR)/lex \
|
||||
$(MAGIC_FRAGMENT_DIR)/lif \
|
||||
|
@ -15,7 +15,6 @@
|
||||
@SET_MAKE@
|
||||
|
||||
VPATH = @srcdir@
|
||||
pkgdatadir = $(datadir)/@PACKAGE@
|
||||
pkglibdir = $(libdir)/@PACKAGE@
|
||||
pkgincludedir = $(includedir)/@PACKAGE@
|
||||
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
|
||||
@ -54,6 +53,7 @@ am__installdirs = "$(DESTDIR)$(pkgdatadir)"
|
||||
pkgdataDATA_INSTALL = $(INSTALL_DATA)
|
||||
DATA = $(pkgdata_DATA)
|
||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||
pkgdatadir = @pkgdatadir@
|
||||
ACLOCAL = @ACLOCAL@
|
||||
AMTAR = @AMTAR@
|
||||
AR = @AR@
|
||||
@ -73,6 +73,7 @@ CXXFLAGS = @CXXFLAGS@
|
||||
CYGPATH_W = @CYGPATH_W@
|
||||
DEFS = @DEFS@
|
||||
DEPDIR = @DEPDIR@
|
||||
DSYMUTIL = @DSYMUTIL@
|
||||
ECHO = @ECHO@
|
||||
ECHO_C = @ECHO_C@
|
||||
ECHO_N = @ECHO_N@
|
||||
@ -95,6 +96,7 @@ LN_S = @LN_S@
|
||||
LTLIBOBJS = @LTLIBOBJS@
|
||||
MAKEINFO = @MAKEINFO@
|
||||
MKDIR_P = @MKDIR_P@
|
||||
NMEDIT = @NMEDIT@
|
||||
OBJEXT = @OBJEXT@
|
||||
PACKAGE = @PACKAGE@
|
||||
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
||||
@ -104,6 +106,7 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
||||
PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||
PATH_SEPARATOR = @PATH_SEPARATOR@
|
||||
RANLIB = @RANLIB@
|
||||
SED = @SED@
|
||||
SET_MAKE = @SET_MAKE@
|
||||
SHELL = @SHELL@
|
||||
STRIP = @STRIP@
|
||||
@ -163,7 +166,7 @@ top_builddir = @top_builddir@
|
||||
top_srcdir = @top_srcdir@
|
||||
|
||||
#
|
||||
# $File: Makefile.am,v 1.44 2009/01/28 02:11:20 christos Exp $
|
||||
# $File: Makefile.am,v 1.45 2009/03/05 22:40:59 christos Exp $
|
||||
#
|
||||
MAGIC_FRAGMENT_BASE = Magdir
|
||||
MAGIC_FRAGMENT_DIR = $(top_srcdir)/magic/$(MAGIC_FRAGMENT_BASE)
|
||||
@ -259,6 +262,7 @@ $(MAGIC_FRAGMENT_DIR)/java \
|
||||
$(MAGIC_FRAGMENT_DIR)/jpeg \
|
||||
$(MAGIC_FRAGMENT_DIR)/karma \
|
||||
$(MAGIC_FRAGMENT_DIR)/kde \
|
||||
$(MAGIC_FRAGMENT_DIR)/kml \
|
||||
$(MAGIC_FRAGMENT_DIR)/lecter \
|
||||
$(MAGIC_FRAGMENT_DIR)/lex \
|
||||
$(MAGIC_FRAGMENT_DIR)/lif \
|
||||
|
@ -1,15 +1,18 @@
|
||||
** README for file(1) Command **
|
||||
@(#) $File: README,v 1.41 2008/12/02 16:34:46 christos Exp $
|
||||
@(#) $File: README,v 1.42 2009/02/14 15:16:24 christos Exp $
|
||||
|
||||
E-mail: christos@astron.com
|
||||
Mailing List: file@mx.gw.com
|
||||
|
||||
Phone: Do not even think of telephoning me about this program. Send cash first!
|
||||
|
||||
This is Release 4.x of Ian Darwin's (copyright but distributable)
|
||||
This is Release 5.x of Ian Darwin's (copyright but distributable)
|
||||
file(1) command. This version is the standard "file" command for Linux,
|
||||
*BSD, and other systems. (See "patchlevel.h" for the exact release number).
|
||||
|
||||
The major changes for 5.x are CDF file parsing, indirect magic, and
|
||||
overhaul in mime and ascii encoding handling.
|
||||
|
||||
The major feature of 4.x is the refactoring of the code into a library,
|
||||
and the re-write of the file command in terms of that library. The library
|
||||
itself, libmagic can be used by 3rd party programs that wish to identify
|
||||
|
@ -9,6 +9,7 @@ AC_CACHE_CHECK([for tm_zone in struct tm], ac_cv_struct_tm_zone,
|
||||
if test "$ac_cv_struct_tm_zone" = yes; then
|
||||
AC_DEFINE(HAVE_TM_ZONE,1,[HAVE_TM_ZONE])
|
||||
fi
|
||||
|
||||
AC_CACHE_CHECK(for tzname, ac_cv_var_tzname,
|
||||
[AC_TRY_LINK(
|
||||
changequote(<<, >>)dnl
|
||||
@ -29,6 +30,7 @@ AC_CACHE_CHECK([for tm_isdst in struct tm], ac_cv_struct_tm_isdst,
|
||||
if test "$ac_cv_struct_tm_isdst" = yes; then
|
||||
AC_DEFINE(HAVE_TM_ISDST,1,[HAVE_TM_ISDST])
|
||||
fi
|
||||
|
||||
AC_CACHE_CHECK(for daylight, ac_cv_var_daylight,
|
||||
[AC_TRY_LINK(
|
||||
changequote(<<, >>)dnl
|
||||
@ -42,3 +44,12 @@ changequote([, ])dnl
|
||||
AC_DEFINE(HAVE_DAYLIGHT,1,[HAVE_DAYLIGHT])
|
||||
fi
|
||||
])
|
||||
|
||||
AC_DEFUN([AC_STRUCT_OPTION_GETOPT_H],
|
||||
[AC_CACHE_CHECK([for struct option in getopt], ac_cv_struct_option_getopt_h,
|
||||
[AC_TRY_COMPILE([#include <getopt.h>], [struct option op; op.name;],
|
||||
ac_cv_struct_option_getopt_h=yes, ac_cv_struct_option_getopt_h=no)])
|
||||
if test "$ac_cv_struct_option_getopt_h" = yes; then
|
||||
AC_DEFINE(HAVE_STRUCT_OPTION,1,[HAVE_STRUCT_OPTION])
|
||||
fi
|
||||
])
|
||||
|
1562
contrib/file/aclocal.m4
vendored
1562
contrib/file/aclocal.m4
vendored
File diff suppressed because it is too large
Load Diff
@ -32,7 +32,7 @@
|
||||
#include "file.h"
|
||||
|
||||
#ifndef lint
|
||||
FILE_RCSID("@(#)$File: apprentice.c,v 1.147 2009/02/03 20:27:51 christos Exp $")
|
||||
FILE_RCSID("@(#)$File: apprentice.c,v 1.151 2009/03/18 15:19:23 christos Exp $")
|
||||
#endif /* lint */
|
||||
|
||||
#include "magic.h"
|
||||
@ -89,8 +89,8 @@ const size_t file_nnames = FILE_NAMES_SIZE;
|
||||
|
||||
private int getvalue(struct magic_set *ms, struct magic *, const char **, int);
|
||||
private int hextoint(int);
|
||||
private const char *getstr(struct magic_set *, const char *, char *, int,
|
||||
int *, int);
|
||||
private const char *getstr(struct magic_set *, struct magic *, const char *,
|
||||
int);
|
||||
private int parse(struct magic_set *, struct magic_entry **, uint32_t *,
|
||||
const char *, size_t, int);
|
||||
private void eatsize(const char **);
|
||||
@ -324,11 +324,15 @@ file_delmagic(struct magic *p, int type, size_t entries)
|
||||
if (p == NULL)
|
||||
return;
|
||||
switch (type) {
|
||||
#ifdef QUICK
|
||||
case 2:
|
||||
#ifdef QUICK
|
||||
p--;
|
||||
(void)munmap((void *)p, sizeof(*p) * (entries + 1));
|
||||
break;
|
||||
#else
|
||||
(void)&entries;
|
||||
abort();
|
||||
/*NOTREACHED*/
|
||||
#endif
|
||||
case 1:
|
||||
p--;
|
||||
@ -1714,8 +1718,7 @@ check_format(struct magic_set *ms, struct magic *m)
|
||||
* string is not one character long
|
||||
*/
|
||||
file_magwarn(ms, "Printf format `%c' is not valid for type "
|
||||
"`%s' in description `%s'",
|
||||
ptr && *ptr ? *ptr : '?',
|
||||
"`%s' in description `%s'", *ptr ? *ptr : '?',
|
||||
file_names[m->type], m->desc);
|
||||
return -1;
|
||||
}
|
||||
@ -1740,8 +1743,6 @@ check_format(struct magic_set *ms, struct magic *m)
|
||||
private int
|
||||
getvalue(struct magic_set *ms, struct magic *m, const char **p, int action)
|
||||
{
|
||||
int slen;
|
||||
|
||||
switch (m->type) {
|
||||
case FILE_BESTRING16:
|
||||
case FILE_LESTRING16:
|
||||
@ -1749,16 +1750,13 @@ getvalue(struct magic_set *ms, struct magic *m, const char **p, int action)
|
||||
case FILE_PSTRING:
|
||||
case FILE_REGEX:
|
||||
case FILE_SEARCH:
|
||||
*p = getstr(ms, *p, m->value.s, sizeof(m->value.s), &slen, action);
|
||||
*p = getstr(ms, m, *p, action == FILE_COMPILE);
|
||||
if (*p == NULL) {
|
||||
if (ms->flags & MAGIC_CHECK)
|
||||
file_magwarn(ms, "cannot get string from `%s'",
|
||||
m->value.s);
|
||||
return -1;
|
||||
}
|
||||
m->vallen = slen;
|
||||
if (m->type == FILE_PSTRING)
|
||||
m->vallen++;
|
||||
return 0;
|
||||
case FILE_FLOAT:
|
||||
case FILE_BEFLOAT:
|
||||
@ -1797,13 +1795,15 @@ getvalue(struct magic_set *ms, struct magic *m, const char **p, int action)
|
||||
/*
|
||||
* Convert a string containing C character escapes. Stop at an unescaped
|
||||
* space or tab.
|
||||
* Copy the converted version to "p", returning its length in *slen.
|
||||
* Return updated scan pointer as function result.
|
||||
* Copy the converted version to "m->value.s", and the length in m->vallen.
|
||||
* Return updated scan pointer as function result. Warn if set.
|
||||
*/
|
||||
private const char *
|
||||
getstr(struct magic_set *ms, const char *s, char *p, int plen, int *slen, int action)
|
||||
getstr(struct magic_set *ms, struct magic *m, const char *s, int warn)
|
||||
{
|
||||
const char *origs = s;
|
||||
char *p = m->value.s;
|
||||
size_t plen = sizeof(m->value.s);
|
||||
char *origp = p;
|
||||
char *pmax = p + plen - 1;
|
||||
int c;
|
||||
@ -1820,25 +1820,33 @@ getstr(struct magic_set *ms, const char *s, char *p, int plen, int *slen, int ac
|
||||
switch(c = *s++) {
|
||||
|
||||
case '\0':
|
||||
if (action == FILE_COMPILE)
|
||||
if (warn)
|
||||
file_magwarn(ms, "incomplete escape");
|
||||
goto out;
|
||||
|
||||
case '\t':
|
||||
if (action == FILE_COMPILE) {
|
||||
if (warn) {
|
||||
file_magwarn(ms,
|
||||
"escaped tab found, use \\t instead");
|
||||
action++;
|
||||
warn = 0; /* already did */
|
||||
}
|
||||
/*FALLTHROUGH*/
|
||||
default:
|
||||
if (action == FILE_COMPILE) {
|
||||
if (isprint((unsigned char)c))
|
||||
file_magwarn(ms,
|
||||
"no need to escape `%c'", c);
|
||||
else
|
||||
file_magwarn(ms,
|
||||
"unknown escape sequence: \\%03o", c);
|
||||
if (warn) {
|
||||
if (isprint((unsigned char)c)) {
|
||||
/* Allow escaping of
|
||||
* ``relations'' */
|
||||
if (strchr("<>&^=!", c)
|
||||
== NULL) {
|
||||
file_magwarn(ms, "no "
|
||||
"need to escape "
|
||||
"`%c'", c);
|
||||
}
|
||||
} else {
|
||||
file_magwarn(ms,
|
||||
"unknown escape sequence: "
|
||||
"\\%03o", c);
|
||||
}
|
||||
}
|
||||
/*FALLTHROUGH*/
|
||||
/* space, perhaps force people to use \040? */
|
||||
@ -1937,7 +1945,9 @@ getstr(struct magic_set *ms, const char *s, char *p, int plen, int *slen, int ac
|
||||
}
|
||||
out:
|
||||
*p = '\0';
|
||||
*slen = p - origp;
|
||||
m->vallen = p - origp;
|
||||
if (m->type == FILE_PSTRING)
|
||||
m->vallen++;
|
||||
return s;
|
||||
}
|
||||
|
||||
@ -2086,7 +2096,7 @@ apprentice_map(struct magic_set *ms, struct magic **magicp, uint32_t *nmagicp,
|
||||
file_oomem(ms, (size_t)st.st_size);
|
||||
goto error1;
|
||||
}
|
||||
if (read(fd, mm, (size_t)st.st_size) != (size_t)st.st_size) {
|
||||
if (read(fd, mm, (size_t)st.st_size) != (ssize_t)st.st_size) {
|
||||
file_badread(ms);
|
||||
goto error1;
|
||||
}
|
||||
@ -2109,7 +2119,7 @@ apprentice_map(struct magic_set *ms, struct magic **magicp, uint32_t *nmagicp,
|
||||
else
|
||||
version = ptr[1];
|
||||
if (version != VERSIONNO) {
|
||||
file_error(ms, 0, "File %d.%d supports only %d version magic "
|
||||
file_error(ms, 0, "File %d.%d supports only version %d magic "
|
||||
"files. `%s' is version %d", FILE_VERSION_MAJOR, patchlevel,
|
||||
VERSIONNO, dbname, version);
|
||||
goto error1;
|
||||
|
@ -27,7 +27,7 @@
|
||||
#include "file.h"
|
||||
|
||||
#ifndef lint
|
||||
FILE_RCSID("@(#)$File: apptype.c,v 1.10 2009/02/03 20:27:51 christos Exp $")
|
||||
FILE_RCSID("@(#)$File: apptype.c,v 1.11 2009/02/04 18:24:32 christos Exp $")
|
||||
#endif /* lint */
|
||||
|
||||
#include <stdlib.h>
|
||||
@ -76,7 +76,7 @@ file_os2_apptype(struct magic_set *ms, const char *fn, const void *buf,
|
||||
}
|
||||
(void)fclose(fp);
|
||||
}
|
||||
rc = DosQueryAppType(path, &type);
|
||||
rc = DosQueryAppType((unsigned char *)path, &type);
|
||||
|
||||
if (fn == NULL) {
|
||||
unlink(path);
|
||||
|
@ -32,7 +32,7 @@
|
||||
#include "file.h"
|
||||
|
||||
#ifndef lint
|
||||
FILE_RCSID("@(#)$File: cdf.c,v 1.17 2009/02/03 20:27:51 christos Exp $")
|
||||
FILE_RCSID("@(#)$File: cdf.c,v 1.30 2009/05/06 14:29:47 christos Exp $")
|
||||
#endif
|
||||
|
||||
#include <assert.h>
|
||||
@ -56,7 +56,7 @@ FILE_RCSID("@(#)$File: cdf.c,v 1.17 2009/02/03 20:27:51 christos Exp $")
|
||||
#endif
|
||||
|
||||
#ifdef CDF_DEBUG
|
||||
#define DPRINTF(a) printf a
|
||||
#define DPRINTF(a) printf a, fflush(stdout)
|
||||
#else
|
||||
#define DPRINTF(a)
|
||||
#endif
|
||||
@ -227,34 +227,85 @@ cdf_unpack_dir(cdf_directory_t *d, char *buf)
|
||||
CDF_UNPACK(d->d_unused0);
|
||||
}
|
||||
|
||||
int
|
||||
cdf_read_header(int fd, cdf_header_t *h)
|
||||
static int
|
||||
cdf_check_stream_offset(const cdf_stream_t *sst, const void *p, size_t tail)
|
||||
{
|
||||
(void)memcpy(cdf_bo.s, "\01\02\03\04", 4);
|
||||
char buf[512];
|
||||
if (lseek(fd, (off_t)0, SEEK_SET) == (off_t)-1)
|
||||
const char *b = (const char *)sst->sst_tab;
|
||||
const char *e = ((const char *)p) + tail;
|
||||
if (e >= b && (size_t)(e - b) < sst->sst_dirlen * sst->sst_len)
|
||||
return 0;
|
||||
DPRINTF((stderr, "offset begin %p end %p %zu >= %zu\n", b, e,
|
||||
(size_t)(e - b), sst->sst_dirlen * sst->sst_len));
|
||||
errno = EFTYPE;
|
||||
return -1;
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
cdf_read(const cdf_info_t *info, off_t off, void *buf, size_t len)
|
||||
{
|
||||
size_t siz = (size_t)off + len;
|
||||
|
||||
if ((off_t)(off + len) != (off_t)siz) {
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
if (read(fd, buf, sizeof(buf)) != sizeof(buf))
|
||||
}
|
||||
|
||||
if (info->i_buf != NULL && info->i_len >= siz) {
|
||||
(void)memcpy(buf, &info->i_buf[off], len);
|
||||
return (ssize_t)len;
|
||||
}
|
||||
|
||||
if (info->i_fd == -1)
|
||||
return -1;
|
||||
|
||||
if (lseek(info->i_fd, off, SEEK_SET) == (off_t)-1)
|
||||
return -1;
|
||||
|
||||
if (read(info->i_fd, buf, len) != (ssize_t)len)
|
||||
return -1;
|
||||
|
||||
return (ssize_t)len;
|
||||
}
|
||||
|
||||
int
|
||||
cdf_read_header(const cdf_info_t *info, cdf_header_t *h)
|
||||
{
|
||||
char buf[512];
|
||||
|
||||
(void)memcpy(cdf_bo.s, "\01\02\03\04", 4);
|
||||
if (cdf_read(info, (off_t)0, buf, sizeof(buf)) == -1)
|
||||
return -1;
|
||||
cdf_unpack_header(h, buf);
|
||||
cdf_swap_header(h);
|
||||
if (h->h_magic != CDF_MAGIC) {
|
||||
DPRINTF(("Bad magic 0x%x != 0x$x\n", h->h_magic, CDF_MAGIC));
|
||||
errno = EFTYPE;
|
||||
return -1;
|
||||
DPRINTF(("Bad magic 0x%llx != 0x%llx\n",
|
||||
(unsigned long long)h->h_magic,
|
||||
(unsigned long long)CDF_MAGIC));
|
||||
goto out;
|
||||
}
|
||||
if (h->h_sec_size_p2 > 20) {
|
||||
DPRINTF(("Bad sector size 0x%u\n", h->h_sec_size_p2));
|
||||
goto out;
|
||||
}
|
||||
if (h->h_short_sec_size_p2 > 20) {
|
||||
DPRINTF(("Bad short sector size 0x%u\n",
|
||||
h->h_short_sec_size_p2));
|
||||
goto out;
|
||||
}
|
||||
return 0;
|
||||
out:
|
||||
errno = EFTYPE;
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
ssize_t
|
||||
cdf_read_sector(int fd, void *buf, size_t offs, size_t len,
|
||||
cdf_read_sector(const cdf_info_t *info, void *buf, size_t offs, size_t len,
|
||||
const cdf_header_t *h, cdf_secid_t id)
|
||||
{
|
||||
assert((size_t)CDF_SEC_SIZE(h) == len);
|
||||
if (lseek(fd, (off_t)CDF_SEC_POS(h, id), SEEK_SET) == (off_t)-1)
|
||||
return -1;
|
||||
return read(fd, ((char *)buf) + offs, len);
|
||||
return cdf_read(info, (off_t)CDF_SEC_POS(h, id),
|
||||
((char *)buf) + offs, len);
|
||||
}
|
||||
|
||||
ssize_t
|
||||
@ -271,24 +322,35 @@ cdf_read_short_sector(const cdf_stream_t *sst, void *buf, size_t offs,
|
||||
* Read the sector allocation table.
|
||||
*/
|
||||
int
|
||||
cdf_read_sat(int fd, cdf_header_t *h, cdf_sat_t *sat)
|
||||
cdf_read_sat(const cdf_info_t *info, cdf_header_t *h, cdf_sat_t *sat)
|
||||
{
|
||||
size_t i, j, k;
|
||||
size_t ss = CDF_SEC_SIZE(h);
|
||||
cdf_secid_t *msa, mid;
|
||||
cdf_secid_t *msa, mid, sec;
|
||||
size_t nsatpersec = (ss / sizeof(mid)) - 1;
|
||||
|
||||
for (i = 0; i < __arraycount(h->h_master_sat); i++)
|
||||
if (h->h_master_sat[i] == CDF_SECID_FREE)
|
||||
break;
|
||||
|
||||
sat->sat_len = (h->h_num_sectors_in_master_sat + i);
|
||||
#define CDF_SEC_LIMIT (UINT32_MAX / (4 * ss))
|
||||
if (h->h_num_sectors_in_master_sat > CDF_SEC_LIMIT / nsatpersec ||
|
||||
i > CDF_SEC_LIMIT) {
|
||||
DPRINTF(("Number of sectors in master SAT too big %u %zu\n",
|
||||
h->h_num_sectors_in_master_sat, i));
|
||||
errno = EFTYPE;
|
||||
return -1;
|
||||
}
|
||||
|
||||
sat->sat_len = h->h_num_sectors_in_master_sat * nsatpersec + i;
|
||||
DPRINTF(("sat_len = %zu ss = %zu\n", sat->sat_len, ss));
|
||||
if ((sat->sat_tab = calloc(sat->sat_len, ss)) == NULL)
|
||||
return -1;
|
||||
|
||||
for (i = 0; i < __arraycount(h->h_master_sat); i++) {
|
||||
if (h->h_master_sat[i] < 0)
|
||||
break;
|
||||
if (cdf_read_sector(fd, sat->sat_tab, ss * i, ss, h,
|
||||
if (cdf_read_sector(info, sat->sat_tab, ss * i, ss, h,
|
||||
h->h_master_sat[i]) != (ssize_t)ss) {
|
||||
DPRINTF(("Reading sector %d", h->h_master_sat[i]));
|
||||
goto out1;
|
||||
@ -300,24 +362,38 @@ cdf_read_sat(int fd, cdf_header_t *h, cdf_sat_t *sat)
|
||||
|
||||
mid = h->h_secid_first_sector_in_master_sat;
|
||||
for (j = 0; j < h->h_num_sectors_in_master_sat; j++) {
|
||||
if (mid < 0)
|
||||
goto out;
|
||||
if (j >= CDF_LOOP_LIMIT) {
|
||||
DPRINTF(("Reading master sector loop limit"));
|
||||
errno = EFTYPE;
|
||||
goto out2;
|
||||
}
|
||||
if (cdf_read_sector(fd, msa, 0, ss, h, mid) != (ssize_t)ss) {
|
||||
if (cdf_read_sector(info, msa, 0, ss, h, mid) != (ssize_t)ss) {
|
||||
DPRINTF(("Reading master sector %d", mid));
|
||||
goto out2;
|
||||
}
|
||||
for (k = 0; k < (ss / sizeof(mid)) - 1; k++, i++)
|
||||
if (cdf_read_sector(fd, sat->sat_tab, ss * i, ss, h,
|
||||
CDF_TOLE4(msa[k])) != (ssize_t)ss) {
|
||||
for (k = 0; k < nsatpersec; k++, i++) {
|
||||
sec = CDF_TOLE4(msa[k]);
|
||||
if (sec < 0)
|
||||
goto out;
|
||||
if (i >= sat->sat_len) {
|
||||
DPRINTF(("Out of bounds reading MSA %u >= %u",
|
||||
i, sat->sat_len));
|
||||
errno = EFTYPE;
|
||||
goto out2;
|
||||
}
|
||||
if (cdf_read_sector(info, sat->sat_tab, ss * i, ss, h,
|
||||
sec) != (ssize_t)ss) {
|
||||
DPRINTF(("Reading sector %d",
|
||||
CDF_TOLE4(msa[k])));
|
||||
goto out2;
|
||||
}
|
||||
mid = CDF_TOLE4(msa[(ss / sizeof(mid)) - 1]);
|
||||
}
|
||||
mid = CDF_TOLE4(msa[nsatpersec]);
|
||||
}
|
||||
out:
|
||||
sat->sat_len = i;
|
||||
free(msa);
|
||||
return 0;
|
||||
out2:
|
||||
@ -328,11 +404,10 @@ cdf_read_sat(int fd, cdf_header_t *h, cdf_sat_t *sat)
|
||||
}
|
||||
|
||||
size_t
|
||||
cdf_count_chain(const cdf_header_t *h, const cdf_sat_t *sat,
|
||||
cdf_secid_t sid)
|
||||
cdf_count_chain(const cdf_sat_t *sat, cdf_secid_t sid, size_t size)
|
||||
{
|
||||
size_t i, j, s = CDF_SEC_SIZE(h) / sizeof(cdf_secid_t);
|
||||
cdf_secid_t maxsector = (cdf_secid_t)(sat->sat_len * s);
|
||||
size_t i, j;
|
||||
cdf_secid_t maxsector = (cdf_secid_t)(sat->sat_len * size);
|
||||
|
||||
DPRINTF(("Chain:"));
|
||||
for (j = i = 0; sid >= 0; i++, j++) {
|
||||
@ -354,12 +429,12 @@ cdf_count_chain(const cdf_header_t *h, const cdf_sat_t *sat,
|
||||
}
|
||||
|
||||
int
|
||||
cdf_read_long_sector_chain(int fd, const cdf_header_t *h, const cdf_sat_t *sat,
|
||||
cdf_secid_t sid, size_t len, cdf_stream_t *scn)
|
||||
cdf_read_long_sector_chain(const cdf_info_t *info, const cdf_header_t *h,
|
||||
const cdf_sat_t *sat, cdf_secid_t sid, size_t len, cdf_stream_t *scn)
|
||||
{
|
||||
size_t ss = CDF_SEC_SIZE(h), i, j;
|
||||
ssize_t nr;
|
||||
scn->sst_len = cdf_count_chain(h, sat, sid);
|
||||
scn->sst_len = cdf_count_chain(sat, sid, ss);
|
||||
scn->sst_dirlen = len;
|
||||
|
||||
if (scn->sst_len == (size_t)-1)
|
||||
@ -370,7 +445,18 @@ cdf_read_long_sector_chain(int fd, const cdf_header_t *h, const cdf_sat_t *sat,
|
||||
return -1;
|
||||
|
||||
for (j = i = 0; sid >= 0; i++, j++) {
|
||||
if ((nr = cdf_read_sector(fd, scn->sst_tab, i * ss, ss, h,
|
||||
if (j >= CDF_LOOP_LIMIT) {
|
||||
DPRINTF(("Read long sector chain loop limit"));
|
||||
errno = EFTYPE;
|
||||
goto out;
|
||||
}
|
||||
if (i >= scn->sst_len) {
|
||||
DPRINTF(("Out of bounds reading long sector chain "
|
||||
"%u > %u\n", i, scn->sst_len));
|
||||
errno = EFTYPE;
|
||||
goto out;
|
||||
}
|
||||
if ((nr = cdf_read_sector(info, scn->sst_tab, i * ss, ss, h,
|
||||
sid)) != (ssize_t)ss) {
|
||||
if (i == scn->sst_len - 1 && nr > 0) {
|
||||
/* Last sector might be truncated */
|
||||
@ -380,16 +466,11 @@ cdf_read_long_sector_chain(int fd, const cdf_header_t *h, const cdf_sat_t *sat,
|
||||
goto out;
|
||||
}
|
||||
sid = CDF_TOLE4(sat->sat_tab[sid]);
|
||||
if (j >= CDF_LOOP_LIMIT) {
|
||||
DPRINTF(("Read long sector chain loop limit"));
|
||||
errno = EFTYPE;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
out:
|
||||
free(scn->sst_tab);
|
||||
return (size_t)-1;
|
||||
return -1;
|
||||
}
|
||||
|
||||
int
|
||||
@ -398,10 +479,10 @@ cdf_read_short_sector_chain(const cdf_header_t *h,
|
||||
cdf_secid_t sid, size_t len, cdf_stream_t *scn)
|
||||
{
|
||||
size_t ss = CDF_SHORT_SEC_SIZE(h), i, j;
|
||||
scn->sst_len = cdf_count_chain(h, ssat, sid);
|
||||
scn->sst_len = cdf_count_chain(ssat, sid, CDF_SEC_SIZE(h));
|
||||
scn->sst_dirlen = len;
|
||||
|
||||
if (scn->sst_len == (size_t)-1)
|
||||
if (sst->sst_tab == NULL || scn->sst_len == (size_t)-1)
|
||||
return -1;
|
||||
|
||||
scn->sst_tab = calloc(scn->sst_len, ss);
|
||||
@ -414,6 +495,12 @@ cdf_read_short_sector_chain(const cdf_header_t *h,
|
||||
errno = EFTYPE;
|
||||
goto out;
|
||||
}
|
||||
if (i >= scn->sst_len) {
|
||||
DPRINTF(("Out of bounds reading short sector chain "
|
||||
"%u > %u\n", i, scn->sst_len));
|
||||
errno = EFTYPE;
|
||||
goto out;
|
||||
}
|
||||
if (cdf_read_short_sector(sst, scn->sst_tab, i * ss, ss, h,
|
||||
sid) != (ssize_t)ss) {
|
||||
DPRINTF(("Reading short sector chain %d", sid));
|
||||
@ -424,12 +511,12 @@ cdf_read_short_sector_chain(const cdf_header_t *h,
|
||||
return 0;
|
||||
out:
|
||||
free(scn->sst_tab);
|
||||
return (size_t)-1;
|
||||
return -1;
|
||||
}
|
||||
|
||||
int
|
||||
cdf_read_sector_chain(int fd, const cdf_header_t *h, const cdf_sat_t *sat,
|
||||
const cdf_sat_t *ssat, const cdf_stream_t *sst,
|
||||
cdf_read_sector_chain(const cdf_info_t *info, const cdf_header_t *h,
|
||||
const cdf_sat_t *sat, const cdf_sat_t *ssat, const cdf_stream_t *sst,
|
||||
cdf_secid_t sid, size_t len, cdf_stream_t *scn)
|
||||
{
|
||||
|
||||
@ -437,19 +524,19 @@ cdf_read_sector_chain(int fd, const cdf_header_t *h, const cdf_sat_t *sat,
|
||||
return cdf_read_short_sector_chain(h, ssat, sst, sid, len,
|
||||
scn);
|
||||
else
|
||||
return cdf_read_long_sector_chain(fd, h, sat, sid, len, scn);
|
||||
return cdf_read_long_sector_chain(info, h, sat, sid, len, scn);
|
||||
}
|
||||
|
||||
int
|
||||
cdf_read_dir(int fd, const cdf_header_t *h, const cdf_sat_t *sat,
|
||||
cdf_dir_t *dir)
|
||||
cdf_read_dir(const cdf_info_t *info, const cdf_header_t *h,
|
||||
const cdf_sat_t *sat, cdf_dir_t *dir)
|
||||
{
|
||||
size_t i, j;
|
||||
size_t ss = CDF_SEC_SIZE(h), ns, nd;
|
||||
char *buf;
|
||||
cdf_secid_t sid = h->h_secid_first_directory;
|
||||
|
||||
ns = cdf_count_chain(h, sat, sid);
|
||||
ns = cdf_count_chain(sat, sid, ss);
|
||||
if (ns == (size_t)-1)
|
||||
return -1;
|
||||
|
||||
@ -471,7 +558,7 @@ cdf_read_dir(int fd, const cdf_header_t *h, const cdf_sat_t *sat,
|
||||
errno = EFTYPE;
|
||||
goto out;
|
||||
}
|
||||
if (cdf_read_sector(fd, buf, 0, ss, h, sid) != (ssize_t)ss) {
|
||||
if (cdf_read_sector(info, buf, 0, ss, h, sid) != (ssize_t)ss) {
|
||||
DPRINTF(("Reading directory sector %d", sid));
|
||||
goto out;
|
||||
}
|
||||
@ -494,14 +581,14 @@ cdf_read_dir(int fd, const cdf_header_t *h, const cdf_sat_t *sat,
|
||||
|
||||
|
||||
int
|
||||
cdf_read_ssat(int fd, const cdf_header_t *h, const cdf_sat_t *sat,
|
||||
cdf_sat_t *ssat)
|
||||
cdf_read_ssat(const cdf_info_t *info, const cdf_header_t *h,
|
||||
const cdf_sat_t *sat, cdf_sat_t *ssat)
|
||||
{
|
||||
size_t i, j;
|
||||
size_t ss = CDF_SEC_SIZE(h);
|
||||
cdf_secid_t sid = h->h_secid_first_sector_in_short_sat;
|
||||
|
||||
ssat->sat_len = cdf_count_chain(h, sat, sid);
|
||||
ssat->sat_len = cdf_count_chain(sat, sid, CDF_SEC_SIZE(h));
|
||||
if (ssat->sat_len == (size_t)-1)
|
||||
return -1;
|
||||
|
||||
@ -515,7 +602,13 @@ cdf_read_ssat(int fd, const cdf_header_t *h, const cdf_sat_t *sat,
|
||||
errno = EFTYPE;
|
||||
goto out;
|
||||
}
|
||||
if (cdf_read_sector(fd, ssat->sat_tab, i * ss, ss, h, sid) !=
|
||||
if (i >= ssat->sat_len) {
|
||||
DPRINTF(("Out of bounds reading short sector chain "
|
||||
"%u > %u\n", i, ssat->sat_len));
|
||||
errno = EFTYPE;
|
||||
goto out;
|
||||
}
|
||||
if (cdf_read_sector(info, ssat->sat_tab, i * ss, ss, h, sid) !=
|
||||
(ssize_t)ss) {
|
||||
DPRINTF(("Reading short sat sector %d", sid));
|
||||
goto out;
|
||||
@ -529,8 +622,8 @@ cdf_read_ssat(int fd, const cdf_header_t *h, const cdf_sat_t *sat,
|
||||
}
|
||||
|
||||
int
|
||||
cdf_read_short_stream(int fd, const cdf_header_t *h, const cdf_sat_t *sat,
|
||||
const cdf_dir_t *dir, cdf_stream_t *scn)
|
||||
cdf_read_short_stream(const cdf_info_t *info, const cdf_header_t *h,
|
||||
const cdf_sat_t *sat, const cdf_dir_t *dir, cdf_stream_t *scn)
|
||||
{
|
||||
size_t i;
|
||||
const cdf_directory_t *d;
|
||||
@ -539,22 +632,22 @@ cdf_read_short_stream(int fd, const cdf_header_t *h, const cdf_sat_t *sat,
|
||||
if (dir->dir_tab[i].d_type == CDF_DIR_TYPE_ROOT_STORAGE)
|
||||
break;
|
||||
|
||||
if (i == dir->dir_len) {
|
||||
DPRINTF(("Cannot find root storage node\n"));
|
||||
errno = EFTYPE;
|
||||
return -1;
|
||||
}
|
||||
/* If the it is not there, just fake it; some docs don't have it */
|
||||
if (i == dir->dir_len)
|
||||
goto out;
|
||||
d = &dir->dir_tab[i];
|
||||
|
||||
/* If the it is not there, just fake it; some docs don't have it */
|
||||
if (d->d_stream_first_sector < 0) {
|
||||
scn->sst_tab = NULL;
|
||||
scn->sst_len = 0;
|
||||
return 0;
|
||||
}
|
||||
if (d->d_stream_first_sector < 0)
|
||||
goto out;
|
||||
|
||||
return cdf_read_long_sector_chain(fd, h, sat,
|
||||
return cdf_read_long_sector_chain(info, h, sat,
|
||||
d->d_stream_first_sector, d->d_size, scn);
|
||||
out:
|
||||
scn->sst_tab = NULL;
|
||||
scn->sst_len = 0;
|
||||
scn->sst_dirlen = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
@ -567,7 +660,7 @@ cdf_namecmp(const char *d, const uint16_t *s, size_t l)
|
||||
}
|
||||
|
||||
int
|
||||
cdf_read_summary_info(int fd, const cdf_header_t *h,
|
||||
cdf_read_summary_info(const cdf_info_t *info, const cdf_header_t *h,
|
||||
const cdf_sat_t *sat, const cdf_sat_t *ssat, const cdf_stream_t *sst,
|
||||
const cdf_dir_t *dir, cdf_stream_t *scn)
|
||||
{
|
||||
@ -587,7 +680,7 @@ cdf_read_summary_info(int fd, const cdf_header_t *h,
|
||||
return -1;
|
||||
}
|
||||
d = &dir->dir_tab[i];
|
||||
return cdf_read_sector_chain(fd, h, sat, ssat, sst,
|
||||
return cdf_read_sector_chain(info, h, sat, ssat, sst,
|
||||
d->d_stream_first_sector, d->d_size, scn);
|
||||
}
|
||||
|
||||
@ -607,12 +700,28 @@ cdf_read_property_info(const cdf_stream_t *sst, uint32_t offs,
|
||||
size_t i, o, nelements, j;
|
||||
cdf_property_info_t *inp;
|
||||
|
||||
if (offs > UINT32_MAX / 4) {
|
||||
errno = EFTYPE;
|
||||
goto out;
|
||||
}
|
||||
shp = (const void *)((const char *)sst->sst_tab + offs);
|
||||
if (cdf_check_stream_offset(sst, shp, sizeof(*shp)) == -1)
|
||||
goto out;
|
||||
sh.sh_len = CDF_TOLE4(shp->sh_len);
|
||||
#define CDF_SHLEN_LIMIT (UINT32_MAX / 8)
|
||||
if (sh.sh_len > CDF_SHLEN_LIMIT) {
|
||||
errno = EFTYPE;
|
||||
goto out;
|
||||
}
|
||||
sh.sh_properties = CDF_TOLE4(shp->sh_properties);
|
||||
DPRINTF(("section len: %d properties %d\n", sh.sh_len,
|
||||
#define CDF_PROP_LIMIT (UINT32_MAX / (4 * sizeof(*inp)))
|
||||
if (sh.sh_properties > CDF_PROP_LIMIT)
|
||||
goto out;
|
||||
DPRINTF(("section len: %u properties %u\n", sh.sh_len,
|
||||
sh.sh_properties));
|
||||
if (*maxcount) {
|
||||
if (*maxcount > CDF_PROP_LIMIT)
|
||||
goto out;
|
||||
*maxcount += sh.sh_properties;
|
||||
inp = realloc(*info, *maxcount * sizeof(*inp));
|
||||
} else {
|
||||
@ -626,6 +735,8 @@ cdf_read_property_info(const cdf_stream_t *sst, uint32_t offs,
|
||||
*count += sh.sh_properties;
|
||||
p = (const void *)((const char *)sst->sst_tab + offs + sizeof(sh));
|
||||
e = (const void *)(((const char *)shp) + sh.sh_len);
|
||||
if (cdf_check_stream_offset(sst, e, 0) == -1)
|
||||
goto out;
|
||||
for (i = 0; i < sh.sh_properties; i++) {
|
||||
q = (const uint32_t *)((const char *)p +
|
||||
CDF_TOLE4(p[(i << 1) + 1])) - 2;
|
||||
@ -683,6 +794,9 @@ cdf_read_property_info(const cdf_stream_t *sst, uint32_t offs,
|
||||
case CDF_LENGTH32_STRING:
|
||||
if (nelements > 1) {
|
||||
size_t nelem = inp - *info;
|
||||
if (*maxcount > CDF_PROP_LIMIT
|
||||
|| nelements > CDF_PROP_LIMIT)
|
||||
goto out;
|
||||
*maxcount += nelements;
|
||||
inp = realloc(*info, *maxcount * sizeof(*inp));
|
||||
if (inp == NULL)
|
||||
@ -735,6 +849,9 @@ cdf_unpack_summary_info(const cdf_stream_t *sst, cdf_summary_info_header_t *ssi,
|
||||
const cdf_section_declaration_t *sd = (const void *)
|
||||
((const char *)sst->sst_tab + CDF_SECTION_DECLARATION_OFFSET);
|
||||
|
||||
if (cdf_check_stream_offset(sst, si, sizeof(*si)) == -1 ||
|
||||
cdf_check_stream_offset(sst, sd, sizeof(*sd)) == -1)
|
||||
return -1;
|
||||
ssi->si_byte_order = CDF_TOLE2(si->si_byte_order);
|
||||
ssi->si_os_version = CDF_TOLE2(si->si_os_version);
|
||||
ssi->si_os = CDF_TOLE2(si->si_os);
|
||||
@ -848,12 +965,14 @@ cdf_dump_header(const cdf_header_t *h)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
#define DUMP(a, b) printf("%40.40s = " a "\n", # b, h->h_ ## b)
|
||||
#define DUMP(a, b) (void)fprintf(stderr, "%40.40s = " a "\n", # b, h->h_ ## b)
|
||||
#define DUMP2(a, b) (void)fprintf(stderr, "%40.40s = " a " (" a ")\n", # b, \
|
||||
h->h_ ## b, 1 << h->h_ ## b)
|
||||
DUMP("%d", revision);
|
||||
DUMP("%d", version);
|
||||
DUMP("0x%x", byte_order);
|
||||
DUMP("%d", sec_size_p2);
|
||||
DUMP("%d", short_sec_size_p2);
|
||||
DUMP2("%d", sec_size_p2);
|
||||
DUMP2("%d", short_sec_size_p2);
|
||||
DUMP("%d", num_sectors_in_sat);
|
||||
DUMP("%d", secid_first_directory);
|
||||
DUMP("%d", min_size_standard_stream);
|
||||
@ -864,24 +983,26 @@ cdf_dump_header(const cdf_header_t *h)
|
||||
for (i = 0; i < __arraycount(h->h_master_sat); i++) {
|
||||
if (h->h_master_sat[i] == CDF_SECID_FREE)
|
||||
break;
|
||||
printf("%35.35s[%.3zu] = %d\n",
|
||||
(void)fprintf(stderr, "%35.35s[%.3zu] = %d\n",
|
||||
"master_sat", i, h->h_master_sat[i]);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
cdf_dump_sat(const char *prefix, const cdf_header_t *h, const cdf_sat_t *sat)
|
||||
cdf_dump_sat(const char *prefix, const cdf_sat_t *sat, size_t size)
|
||||
{
|
||||
size_t i, j, s = CDF_SEC_SIZE(h) / sizeof(cdf_secid_t);
|
||||
size_t i, j, s = size / sizeof(cdf_secid_t);
|
||||
|
||||
for (i = 0; i < sat->sat_len; i++) {
|
||||
printf("%s[%zu]:\n", prefix, i);
|
||||
(void)fprintf(stderr, "%s[%zu]:\n%.6d: ", prefix, i, i * s);
|
||||
for (j = 0; j < s; j++) {
|
||||
printf("%5d, ", CDF_TOLE4(sat->sat_tab[s * i + j]));
|
||||
(void)fprintf(stderr, "%5d, ",
|
||||
CDF_TOLE4(sat->sat_tab[s * i + j]));
|
||||
if ((j + 1) % 10 == 0)
|
||||
printf("\n");
|
||||
(void)fprintf(stderr, "\n%.6d: ",
|
||||
i * s + j + 1);
|
||||
}
|
||||
printf("\n");
|
||||
(void)fprintf(stderr, "\n");
|
||||
}
|
||||
}
|
||||
|
||||
@ -891,17 +1012,17 @@ cdf_dump(void *v, size_t len)
|
||||
size_t i, j;
|
||||
unsigned char *p = v;
|
||||
char abuf[16];
|
||||
printf("%.4x: ", 0);
|
||||
(void)fprintf(stderr, "%.4x: ", 0);
|
||||
for (i = 0, j = 0; i < len; i++, p++) {
|
||||
printf("%.2x ", *p);
|
||||
(void)fprintf(stderr, "%.2x ", *p);
|
||||
abuf[j++] = isprint(*p) ? *p : '.';
|
||||
if (j == 16) {
|
||||
j = 0;
|
||||
abuf[15] = '\0';
|
||||
printf("%s\n%.4x: ", abuf, i + 1);
|
||||
(void)fprintf(stderr, "%s\n%.4x: ", abuf, i + 1);
|
||||
}
|
||||
}
|
||||
printf("\n");
|
||||
(void)fprintf(stderr, "\n");
|
||||
}
|
||||
|
||||
void
|
||||
@ -913,8 +1034,8 @@ cdf_dump_stream(const cdf_header_t *h, const cdf_stream_t *sst)
|
||||
}
|
||||
|
||||
void
|
||||
cdf_dump_dir(int fd, const cdf_header_t *h, const cdf_sat_t *sat,
|
||||
const cdf_sat_t *ssat, const cdf_stream_t *sst,
|
||||
cdf_dump_dir(const cdf_info_t *info, const cdf_header_t *h,
|
||||
const cdf_sat_t *sat, const cdf_sat_t *ssat, const cdf_stream_t *sst,
|
||||
const cdf_dir_t *dir)
|
||||
{
|
||||
size_t i, j;
|
||||
@ -930,29 +1051,30 @@ cdf_dump_dir(int fd, const cdf_header_t *h, const cdf_sat_t *sat,
|
||||
d = &dir->dir_tab[i];
|
||||
for (j = 0; j < sizeof(name); j++)
|
||||
name[j] = (char)CDF_TOLE2(d->d_name[j]);
|
||||
printf("Directory %zu: %s\n", i, name);
|
||||
(void)fprintf(stderr, "Directory %zu: %s\n", i, name);
|
||||
if (d->d_type < __arraycount(types))
|
||||
printf("Type: %s\n", types[d->d_type]);
|
||||
(void)fprintf(stderr, "Type: %s\n", types[d->d_type]);
|
||||
else
|
||||
printf("Type: %d\n", d->d_type);
|
||||
printf("Color: %s\n", d->d_color ? "black" : "red");
|
||||
printf("Left child: %d\n", d->d_left_child);
|
||||
printf("Right child: %d\n", d->d_right_child);
|
||||
printf("Flags: 0x%x\n", d->d_flags);
|
||||
(void)fprintf(stderr, "Type: %d\n", d->d_type);
|
||||
(void)fprintf(stderr, "Color: %s\n",
|
||||
d->d_color ? "black" : "red");
|
||||
(void)fprintf(stderr, "Left child: %d\n", d->d_left_child);
|
||||
(void)fprintf(stderr, "Right child: %d\n", d->d_right_child);
|
||||
(void)fprintf(stderr, "Flags: 0x%x\n", d->d_flags);
|
||||
cdf_timestamp_to_timespec(&ts, d->d_created);
|
||||
printf("Created %s", ctime(&ts.tv_sec));
|
||||
(void)fprintf(stderr, "Created %s", ctime(&ts.tv_sec));
|
||||
cdf_timestamp_to_timespec(&ts, d->d_modified);
|
||||
printf("Modified %s", ctime(&ts.tv_sec));
|
||||
printf("Stream %d\n", d->d_stream_first_sector);
|
||||
printf("Size %d\n", d->d_size);
|
||||
(void)fprintf(stderr, "Modified %s", ctime(&ts.tv_sec));
|
||||
(void)fprintf(stderr, "Stream %d\n", d->d_stream_first_sector);
|
||||
(void)fprintf(stderr, "Size %d\n", d->d_size);
|
||||
switch (d->d_type) {
|
||||
case CDF_DIR_TYPE_USER_STORAGE:
|
||||
printf("Storage: %d\n", d->d_storage);
|
||||
(void)fprintf(stderr, "Storage: %d\n", d->d_storage);
|
||||
break;
|
||||
case CDF_DIR_TYPE_USER_STREAM:
|
||||
if (sst == NULL)
|
||||
break;
|
||||
if (cdf_read_sector_chain(fd, h, sat, ssat, sst,
|
||||
if (cdf_read_sector_chain(info, h, sat, ssat, sst,
|
||||
d->d_stream_first_sector, d->d_size, &scn) == -1) {
|
||||
warn("Can't read stream for %s at %d len %d",
|
||||
name, d->d_stream_first_sector, d->d_size);
|
||||
@ -978,33 +1100,38 @@ cdf_dump_property_info(const cdf_property_info_t *info, size_t count)
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
cdf_print_property_name(buf, sizeof(buf), info[i].pi_id);
|
||||
printf("%zu) %s: ", i, buf);
|
||||
(void)fprintf(stderr, "%zu) %s: ", i, buf);
|
||||
switch (info[i].pi_type) {
|
||||
case CDF_SIGNED16:
|
||||
printf("signed 16 [%hd]\n", info[i].pi_s16);
|
||||
(void)fprintf(stderr, "signed 16 [%hd]\n",
|
||||
info[i].pi_s16);
|
||||
break;
|
||||
case CDF_SIGNED32:
|
||||
printf("signed 32 [%d]\n", info[i].pi_s32);
|
||||
(void)fprintf(stderr, "signed 32 [%d]\n",
|
||||
info[i].pi_s32);
|
||||
break;
|
||||
case CDF_UNSIGNED32:
|
||||
printf("unsigned 32 [%u]\n", info[i].pi_u32);
|
||||
(void)fprintf(stderr, "unsigned 32 [%u]\n",
|
||||
info[i].pi_u32);
|
||||
break;
|
||||
case CDF_LENGTH32_STRING:
|
||||
printf("string %u [%.*s]\n", info[i].pi_str.s_len,
|
||||
(void)fprintf(stderr, "string %u [%.*s]\n",
|
||||
info[i].pi_str.s_len,
|
||||
info[i].pi_str.s_len, info[i].pi_str.s_buf);
|
||||
break;
|
||||
case CDF_FILETIME:
|
||||
tp = info[i].pi_tp;
|
||||
if (tp < 1000000000000000LL) {
|
||||
cdf_print_elapsed_time(buf, sizeof(buf), tp);
|
||||
printf("timestamp %s\n", buf);
|
||||
(void)fprintf(stderr, "timestamp %s\n", buf);
|
||||
} else {
|
||||
cdf_timestamp_to_timespec(&ts, tp);
|
||||
printf("timestamp %s", ctime(&ts.tv_sec));
|
||||
(void)fprintf(stderr, "timestamp %s",
|
||||
ctime(&ts.tv_sec));
|
||||
}
|
||||
break;
|
||||
case CDF_CLIPBOARD:
|
||||
printf("CLIPBOARD %u\n", info[i].pi_u32);
|
||||
(void)fprintf(stderr, "CLIPBOARD %u\n", info[i].pi_u32);
|
||||
break;
|
||||
default:
|
||||
DPRINTF(("Don't know how to deal with %x\n",
|
||||
@ -1026,13 +1153,13 @@ cdf_dump_summary_info(const cdf_header_t *h, const cdf_stream_t *sst)
|
||||
(void)&h;
|
||||
if (cdf_unpack_summary_info(sst, &ssi, &info, &count) == -1)
|
||||
return;
|
||||
printf("Endian: %x\n", ssi.si_byte_order);
|
||||
printf("Os Version %d.%d\n", ssi.si_os_version & 0xff,
|
||||
(void)fprintf(stderr, "Endian: %x\n", ssi.si_byte_order);
|
||||
(void)fprintf(stderr, "Os Version %d.%d\n", ssi.si_os_version & 0xff,
|
||||
ssi.si_os_version >> 8);
|
||||
printf("Os %d\n", ssi.si_os);
|
||||
(void)fprintf(stderr, "Os %d\n", ssi.si_os);
|
||||
cdf_print_classid(buf, sizeof(buf), &ssi.si_class);
|
||||
printf("Class %s\n", buf);
|
||||
printf("Count %d\n", ssi.si_count);
|
||||
(void)fprintf(stderr, "Class %s\n", buf);
|
||||
(void)fprintf(stderr, "Count %d\n", ssi.si_count);
|
||||
cdf_dump_property_info(info, count);
|
||||
free(info);
|
||||
}
|
||||
@ -1043,61 +1170,64 @@ cdf_dump_summary_info(const cdf_header_t *h, const cdf_stream_t *sst)
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
int fd, i;
|
||||
int i;
|
||||
cdf_header_t h;
|
||||
cdf_sat_t sat, ssat;
|
||||
cdf_stream_t sst, scn;
|
||||
cdf_dir_t dir;
|
||||
cdf_info_t info;
|
||||
|
||||
if (argc < 2) {
|
||||
(void)fprintf(stderr, "Usage: %s <filename>\n", getprogname());
|
||||
return -1;
|
||||
}
|
||||
|
||||
info.i_buf = NULL;
|
||||
info.i_len = 0;
|
||||
for (i = 1; i < argc; i++) {
|
||||
if ((fd = open(argv[1], O_RDONLY)) == -1)
|
||||
if ((info.i_fd = open(argv[1], O_RDONLY)) == -1)
|
||||
err(1, "Cannot open `%s'", argv[1]);
|
||||
|
||||
if (cdf_read_header(fd, &h) == -1)
|
||||
if (cdf_read_header(&info, &h) == -1)
|
||||
err(1, "Cannot read header");
|
||||
#ifdef CDF_DEBUG
|
||||
cdf_dump_header(&h);
|
||||
#endif
|
||||
|
||||
if (cdf_read_sat(fd, &h, &sat) == -1)
|
||||
if (cdf_read_sat(&info, &h, &sat) == -1)
|
||||
err(1, "Cannot read sat");
|
||||
#ifdef CDF_DEBUG
|
||||
cdf_dump_sat("SAT", &h, &sat);
|
||||
cdf_dump_sat("SAT", &sat, CDF_SEC_SIZE(&h));
|
||||
#endif
|
||||
|
||||
if (cdf_read_ssat(fd, &h, &sat, &ssat) == -1)
|
||||
if (cdf_read_ssat(&info, &h, &sat, &ssat) == -1)
|
||||
err(1, "Cannot read ssat");
|
||||
#ifdef CDF_DEBUG
|
||||
cdf_dump_sat("SSAT", &h, &ssat);
|
||||
cdf_dump_sat("SSAT", &h, &ssat, CDF_SHORT_SEC_SIZE(&h));
|
||||
#endif
|
||||
|
||||
if (cdf_read_dir(fd, &h, &sat, &dir) == -1)
|
||||
if (cdf_read_dir(&info, &h, &sat, &dir) == -1)
|
||||
err(1, "Cannot read dir");
|
||||
|
||||
if (cdf_read_short_stream(fd, &h, &sat, &dir, &sst) == -1)
|
||||
if (cdf_read_short_stream(&info, &h, &sat, &dir, &sst) == -1)
|
||||
err(1, "Cannot read short stream");
|
||||
#ifdef CDF_DEBUG
|
||||
cdf_dump_stream(&h, &sst);
|
||||
#endif
|
||||
|
||||
#ifdef CDF_DEBUG
|
||||
cdf_dump_dir(fd, &h, &sat, &ssat, &sst, &dir);
|
||||
cdf_dump_dir(&info, &h, &sat, &ssat, &sst, &dir);
|
||||
#endif
|
||||
|
||||
|
||||
if (cdf_read_summary_info(fd, &h, &sat, &ssat, &sst, &dir,
|
||||
if (cdf_read_summary_info(&info, &h, &sat, &ssat, &sst, &dir,
|
||||
&scn) == -1)
|
||||
err(1, "Cannot read summary info");
|
||||
#ifdef CDF_DEBUG
|
||||
cdf_dump_summary_info(&h, &scn);
|
||||
#endif
|
||||
|
||||
(void)close(fd);
|
||||
(void)close(info.i_fd);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -242,38 +242,45 @@ typedef struct {
|
||||
#define CDF_PROPERTY_SECURITY 0x00000013
|
||||
#define CDF_PROPERTY_LOCALE_ID 0x80000000
|
||||
|
||||
typedef struct {
|
||||
int i_fd;
|
||||
const unsigned char *i_buf;
|
||||
size_t i_len;
|
||||
} cdf_info_t;
|
||||
|
||||
struct timespec;
|
||||
int cdf_timestamp_to_timespec(struct timespec *, cdf_timestamp_t);
|
||||
int cdf_timespec_to_timestamp(cdf_timestamp_t *, const struct timespec *);
|
||||
int cdf_read_header(int, cdf_header_t *);
|
||||
int cdf_read_header(const cdf_info_t *, cdf_header_t *);
|
||||
void cdf_swap_header(cdf_header_t *);
|
||||
void cdf_unpack_header(cdf_header_t *, char *);
|
||||
void cdf_swap_dir(cdf_directory_t *);
|
||||
void cdf_unpack_dir(cdf_directory_t *, char *);
|
||||
void cdf_swap_class(cdf_classid_t *);
|
||||
ssize_t cdf_read_sector(int, void *, size_t, size_t, const cdf_header_t *,
|
||||
cdf_secid_t);
|
||||
ssize_t cdf_read_sector(const cdf_info_t *, void *, size_t, size_t,
|
||||
const cdf_header_t *, cdf_secid_t);
|
||||
ssize_t cdf_read_short_sector(const cdf_stream_t *, void *, size_t, size_t,
|
||||
const cdf_header_t *, cdf_secid_t);
|
||||
int cdf_read_sat(int, cdf_header_t *, cdf_sat_t *);
|
||||
size_t cdf_count_chain(const cdf_header_t *, const cdf_sat_t *,
|
||||
cdf_secid_t);
|
||||
int cdf_read_long_sector_chain(int, const cdf_header_t *,
|
||||
int cdf_read_sat(const cdf_info_t *, cdf_header_t *, cdf_sat_t *);
|
||||
size_t cdf_count_chain(const cdf_sat_t *, cdf_secid_t, size_t);
|
||||
int cdf_read_long_sector_chain(const cdf_info_t *, const cdf_header_t *,
|
||||
const cdf_sat_t *, cdf_secid_t, size_t, cdf_stream_t *);
|
||||
int cdf_read_short_sector_chain(const cdf_header_t *, const cdf_sat_t *,
|
||||
const cdf_stream_t *, cdf_secid_t, size_t, cdf_stream_t *);
|
||||
int cdf_read_sector_chain(int, const cdf_header_t *,
|
||||
int cdf_read_sector_chain(const cdf_info_t *, const cdf_header_t *,
|
||||
const cdf_sat_t *, const cdf_sat_t *, const cdf_stream_t *, cdf_secid_t,
|
||||
size_t, cdf_stream_t *);
|
||||
int cdf_read_dir(int, const cdf_header_t *, const cdf_sat_t *, cdf_dir_t *);
|
||||
int cdf_read_ssat(int, const cdf_header_t *, const cdf_sat_t *, cdf_sat_t *);
|
||||
int cdf_read_short_stream(int, const cdf_header_t *, const cdf_sat_t *,
|
||||
const cdf_dir_t *, cdf_stream_t *);
|
||||
int cdf_read_dir(const cdf_info_t *, const cdf_header_t *, const cdf_sat_t *,
|
||||
cdf_dir_t *);
|
||||
int cdf_read_ssat(const cdf_info_t *, const cdf_header_t *, const cdf_sat_t *,
|
||||
cdf_sat_t *);
|
||||
int cdf_read_short_stream(const cdf_info_t *, const cdf_header_t *,
|
||||
const cdf_sat_t *, const cdf_dir_t *, cdf_stream_t *);
|
||||
int cdf_read_property_info(const cdf_stream_t *, uint32_t,
|
||||
cdf_property_info_t **, size_t *, size_t *);
|
||||
int cdf_read_summary_info(int, const cdf_header_t *, const cdf_sat_t *,
|
||||
const cdf_sat_t *, const cdf_stream_t *, const cdf_dir_t *,
|
||||
cdf_stream_t *);
|
||||
int cdf_read_summary_info(const cdf_info_t *, const cdf_header_t *,
|
||||
const cdf_sat_t *, const cdf_sat_t *, const cdf_stream_t *,
|
||||
const cdf_dir_t *, cdf_stream_t *);
|
||||
int cdf_unpack_summary_info(const cdf_stream_t *, cdf_summary_info_header_t *,
|
||||
cdf_property_info_t **, size_t *);
|
||||
int cdf_print_classid(char *, size_t, const cdf_classid_t *);
|
||||
@ -285,10 +292,10 @@ uint64_t cdf_tole8(uint64_t);
|
||||
|
||||
#ifdef CDF_DEBUG
|
||||
void cdf_dump_header(const cdf_header_t *);
|
||||
void cdf_dump_sat(const char *, const cdf_header_t *, const cdf_sat_t *);
|
||||
void cdf_dump_sat(const char *, const cdf_sat_t *, size_t);
|
||||
void cdf_dump(void *, size_t);
|
||||
void cdf_dump_stream(const cdf_header_t *, const cdf_stream_t *);
|
||||
void cdf_dump_dir(int, const cdf_header_t *, const cdf_sat_t *,
|
||||
void cdf_dump_dir(const cdf_info_t *, const cdf_header_t *, const cdf_sat_t *,
|
||||
const cdf_sat_t *, const cdf_stream_t *, const cdf_dir_t *);
|
||||
void cdf_dump_property_info(const cdf_property_info_t *, size_t);
|
||||
void cdf_dump_summary_info(const cdf_header_t *, const cdf_stream_t *);
|
||||
|
@ -27,7 +27,7 @@
|
||||
#include "file.h"
|
||||
|
||||
#ifndef lint
|
||||
FILE_RCSID("@(#)$File: cdf_time.c,v 1.5 2009/02/03 20:27:51 christos Exp $")
|
||||
FILE_RCSID("@(#)$File: cdf_time.c,v 1.6 2009/03/10 11:44:29 christos Exp $")
|
||||
#endif
|
||||
|
||||
#include <time.h>
|
||||
@ -102,6 +102,7 @@ cdf_timestamp_to_timespec(struct timespec *ts, cdf_timestamp_t t)
|
||||
#ifdef HAVE_STRUCT_TM_TM_ZONE
|
||||
static char UTC[] = "UTC";
|
||||
#endif
|
||||
int rdays;
|
||||
|
||||
/* Unit is 100's of nanoseconds */
|
||||
ts->tv_nsec = (t % CDF_TIME_PREC) * 100;
|
||||
@ -119,7 +120,7 @@ cdf_timestamp_to_timespec(struct timespec *ts, cdf_timestamp_t t)
|
||||
// XXX: Approx
|
||||
tm.tm_year = CDF_BASE_YEAR + (t / 365);
|
||||
|
||||
int rdays = cdf_getdays(tm.tm_year);
|
||||
rdays = cdf_getdays(tm.tm_year);
|
||||
t -= rdays;
|
||||
tm.tm_mday = cdf_getday(tm.tm_year, t);
|
||||
tm.tm_mon = cdf_getmonth(tm.tm_year, t);
|
||||
|
@ -35,7 +35,7 @@
|
||||
#include "file.h"
|
||||
|
||||
#ifndef lint
|
||||
FILE_RCSID("@(#)$File: compress.c,v 1.61 2009/02/03 20:27:51 christos Exp $")
|
||||
FILE_RCSID("@(#)$File: compress.c,v 1.63 2009/03/23 14:21:51 christos Exp $")
|
||||
#endif
|
||||
|
||||
#include "magic.h"
|
||||
@ -76,6 +76,7 @@ private const struct {
|
||||
/* ...only first file examined */
|
||||
{ "BZh", 3, { "bzip2", "-cd", NULL }, 1 }, /* bzip2-ed */
|
||||
{ "LZIP", 4, { "lzip", "-cdq", NULL }, 1 },
|
||||
{ "\3757zXZ\0",6,{ "xz", "-cd", NULL }, 1 }, /* XZ Utils */
|
||||
};
|
||||
|
||||
private size_t ncompr = sizeof(compr) / sizeof(compr[0]);
|
||||
@ -486,6 +487,8 @@ uncompressbuf(struct magic_set *ms, int fd, size_t method,
|
||||
#else
|
||||
(void)wait(NULL);
|
||||
#endif
|
||||
(void) close(fdin[0]);
|
||||
|
||||
return n;
|
||||
}
|
||||
}
|
||||
|
1504
contrib/file/config.guess
vendored
1504
contrib/file/config.guess
vendored
File diff suppressed because it is too large
Load Diff
@ -93,6 +93,9 @@
|
||||
/* Define to 1 if you have the `strtoul' function. */
|
||||
#undef HAVE_STRTOUL
|
||||
|
||||
/* HAVE_STRUCT_OPTION */
|
||||
#undef HAVE_STRUCT_OPTION
|
||||
|
||||
/* Define to 1 if `st_rdev' is member of `struct stat'. */
|
||||
#undef HAVE_STRUCT_STAT_ST_RDEV
|
||||
|
||||
|
1622
contrib/file/config.sub
vendored
1622
contrib/file/config.sub
vendored
File diff suppressed because it is too large
Load Diff
5177
contrib/file/configure
vendored
5177
contrib/file/configure
vendored
File diff suppressed because it is too large
Load Diff
@ -1,7 +1,8 @@
|
||||
dnl Process this file with autoconf to produce a configure script.
|
||||
AC_INIT(file, 5.00, christos@astron.com)
|
||||
AC_INIT(file, 5.03, christos@astron.com)
|
||||
AM_INIT_AUTOMAKE
|
||||
AM_CONFIG_HEADER(config.h)
|
||||
#AC_CONFIG_MACRO_DIR([m4])
|
||||
|
||||
AC_MSG_CHECKING(for builtin ELF support)
|
||||
AC_ARG_ENABLE(elf,
|
||||
@ -46,6 +47,7 @@ fi], [
|
||||
fsect=4
|
||||
])
|
||||
|
||||
AC_SUBST([pkgdatadir], ['$(datadir)/misc'])
|
||||
AC_SUBST(fsect)
|
||||
AM_CONDITIONAL(FSECT5, test x$fsect = x5)
|
||||
|
||||
@ -82,6 +84,8 @@ AC_SYS_LARGEFILE
|
||||
AC_FUNC_FSEEKO
|
||||
AC_TYPE_MBSTATE_T
|
||||
|
||||
AC_STRUCT_OPTION_GETOPT_H
|
||||
|
||||
AC_CHECK_TYPES([uint8_t, uint16_t, uint32_t, int32_t, uint64_t, int64_t])
|
||||
AC_CHECK_SIZEOF(long long)
|
||||
AH_BOTTOM([
|
||||
@ -116,7 +120,7 @@ typedef long int64_t;
|
||||
AC_MSG_CHECKING(for gcc compiler warnings)
|
||||
AC_ARG_ENABLE(warnings,
|
||||
[ --disable-warnings disable compiler warnings],
|
||||
[if test "${enableval}" = no -o $GCC = no; then
|
||||
[if test "${enableval}" = no -o "$GCC" = no; then
|
||||
AC_MSG_RESULT(no)
|
||||
WARNINGS=
|
||||
else
|
||||
@ -126,7 +130,7 @@ else
|
||||
-Wsign-compare -Wreturn-type -Wswitch -Wshadow \
|
||||
-Wcast-qual -Wwrite-strings -Wextra -Wunused-parameter"
|
||||
fi], [
|
||||
if test $GCC = no; then
|
||||
if test "$GCC" = no; then
|
||||
WARNINGS=
|
||||
AC_MSG_RESULT(no)
|
||||
else
|
||||
|
@ -32,7 +32,7 @@
|
||||
#include "file.h"
|
||||
|
||||
#ifndef lint
|
||||
FILE_RCSID("@(#)$File: file.c,v 1.130 2009/02/03 20:27:51 christos Exp $")
|
||||
FILE_RCSID("@(#)$File: file.c,v 1.131 2009/02/13 18:48:05 christos Exp $")
|
||||
#endif /* lint */
|
||||
|
||||
#include "magic.h"
|
||||
@ -61,7 +61,7 @@ FILE_RCSID("@(#)$File: file.c,v 1.130 2009/02/03 20:27:51 christos Exp $")
|
||||
#include <wchar.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_GETOPT_H
|
||||
#if defined(HAVE_GETOPT_H) && defined(HAVE_STRUCT_OPTION)
|
||||
#include <getopt.h>
|
||||
#else
|
||||
#include "mygetopt.h"
|
||||
|
@ -27,7 +27,7 @@
|
||||
*/
|
||||
/*
|
||||
* file.h - definitions for file(1) program
|
||||
* @(#)$File: file.h,v 1.118 2009/02/03 20:27:51 christos Exp $
|
||||
* @(#)$File: file.h,v 1.119 2009/02/04 18:24:32 christos Exp $
|
||||
*/
|
||||
|
||||
#ifndef __file_h__
|
||||
@ -387,7 +387,13 @@ protected size_t file_mbswidth(const char *);
|
||||
protected const char *file_getbuffer(struct magic_set *);
|
||||
protected ssize_t sread(int, void *, size_t, int);
|
||||
protected int file_check_mem(struct magic_set *, unsigned int);
|
||||
protected int file_looks_utf8(const unsigned char *, size_t, unichar *, size_t *);
|
||||
protected int file_looks_utf8(const unsigned char *, size_t, unichar *,
|
||||
size_t *);
|
||||
#ifdef __EMX__
|
||||
protected int file_os2_apptype(struct magic_set *, const char *, const void *,
|
||||
size_t);
|
||||
#endif /* __EMX__ */
|
||||
|
||||
|
||||
#ifndef COMPILE_ONLY
|
||||
extern const char *file_names[];
|
||||
|
@ -27,7 +27,7 @@
|
||||
#include "file.h"
|
||||
|
||||
#ifndef lint
|
||||
FILE_RCSID("@(#)$File: funcs.c,v 1.51 2008/11/07 18:57:28 christos Exp $")
|
||||
FILE_RCSID("@(#)$File: funcs.c,v 1.53 2009/04/07 11:07:00 christos Exp $")
|
||||
#endif /* lint */
|
||||
|
||||
#include "magic.h"
|
||||
@ -303,7 +303,14 @@ file_reset(struct magic_set *ms)
|
||||
file_error(ms, 0, "no magic files loaded");
|
||||
return -1;
|
||||
}
|
||||
ms->o.buf = NULL;
|
||||
if (ms->o.buf) {
|
||||
free(ms->o.buf);
|
||||
ms->o.buf = NULL;
|
||||
}
|
||||
if (ms->o.pbuf) {
|
||||
free(ms->o.pbuf);
|
||||
ms->o.pbuf = NULL;
|
||||
}
|
||||
ms->event_flags &= ~EVENT_HAD_ERR;
|
||||
ms->error = -1;
|
||||
return 0;
|
||||
|
@ -32,7 +32,7 @@
|
||||
#include "file.h"
|
||||
|
||||
#ifndef lint
|
||||
FILE_RCSID("@(#)$File: getopt_long.c,v 1.5 2009/02/03 20:27:51 christos Exp $")
|
||||
FILE_RCSID("@(#)$File: getopt_long.c,v 1.6 2009/02/13 18:48:05 christos Exp $")
|
||||
#endif /* lint */
|
||||
|
||||
#include <assert.h>
|
||||
@ -42,7 +42,7 @@ FILE_RCSID("@(#)$File: getopt_long.c,v 1.5 2009/02/03 20:27:51 christos Exp $")
|
||||
#define warnx printf
|
||||
#endif
|
||||
#include <errno.h>
|
||||
#ifdef HAVE_GETOPT_H
|
||||
#if defined(HAVE_GETOPT_H) && defined(HAVE_STRUCT_OPTION)
|
||||
#include <getopt.h>
|
||||
#else
|
||||
#include "mygetopt.h"
|
||||
|
@ -28,7 +28,7 @@
|
||||
#include "file.h"
|
||||
|
||||
#ifndef lint
|
||||
FILE_RCSID("@(#)$File: magic.c,v 1.59 2009/02/03 20:27:51 christos Exp $")
|
||||
FILE_RCSID("@(#)$File: magic.c,v 1.62 2009/03/20 21:25:41 christos Exp $")
|
||||
#endif /* lint */
|
||||
|
||||
#include "magic.h"
|
||||
@ -57,10 +57,6 @@ FILE_RCSID("@(#)$File: magic.c,v 1.59 2009/02/03 20:27:51 christos Exp $")
|
||||
#include <unistd.h> /* for read() */
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_LOCALE_H
|
||||
#include <locale.h>
|
||||
#endif
|
||||
|
||||
#include <netinet/in.h> /* for byte swapping */
|
||||
|
||||
#include "patchlevel.h"
|
||||
@ -74,12 +70,6 @@ FILE_RCSID("@(#)$File: magic.c,v 1.59 2009/02/03 20:27:51 christos Exp $")
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef __EMX__
|
||||
private char *apptypeName = NULL;
|
||||
protected int file_os2_apptype(struct magic_set *ms, const char *fn,
|
||||
const void *buf, size_t nb);
|
||||
#endif /* __EMX__ */
|
||||
|
||||
private void free_mlist(struct mlist *);
|
||||
private void close_and_restore(const struct magic_set *, const char *, int,
|
||||
const struct stat *);
|
||||
@ -297,26 +287,10 @@ file_or_fd(struct magic_set *ms, const char *inname, int fd)
|
||||
|
||||
errno = 0;
|
||||
if ((fd = open(inname, flags)) < 0) {
|
||||
#ifdef __CYGWIN__
|
||||
/* FIXME: Do this with EXEEXT from autotools */
|
||||
size_t len = strlen(inname) + 5;
|
||||
char *tmp = alloca(len);
|
||||
(void)strlcat(strlcpy(tmp, inname, len), ".exe", len);
|
||||
if ((fd = open(tmp, flags)) < 0) {
|
||||
#endif
|
||||
if (unreadable_info(ms, sb.st_mode,
|
||||
#ifdef __CYGWIN
|
||||
tmp
|
||||
#else
|
||||
inname
|
||||
#endif
|
||||
) == -1)
|
||||
goto done;
|
||||
rv = 0;
|
||||
if (unreadable_info(ms, sb.st_mode, inname) == -1)
|
||||
goto done;
|
||||
#ifdef __CYGWIN__
|
||||
}
|
||||
#endif
|
||||
rv = 0;
|
||||
goto done;
|
||||
}
|
||||
#ifdef O_NONBLOCK
|
||||
if ((flags = fcntl(fd, F_GETFL)) != -1) {
|
||||
|
@ -1,11 +1,20 @@
|
||||
#define FILE_VERSION_MAJOR 5
|
||||
#define patchlevel 0
|
||||
#define patchlevel 3
|
||||
|
||||
/*
|
||||
* Patchlevel file for Ian Darwin's MAGIC command.
|
||||
* $File: patchlevel.h,v 1.71 2009/01/21 19:09:42 christos Exp $
|
||||
* $File: patchlevel.h,v 1.74 2009/05/06 20:32:48 christos Exp $
|
||||
*
|
||||
* $Log: patchlevel.h,v $
|
||||
* Revision 1.74 2009/05/06 20:32:48 christos
|
||||
* welcome to 5.03
|
||||
*
|
||||
* Revision 1.73 2009/05/04 15:15:13 christos
|
||||
* 5.02...
|
||||
*
|
||||
* Revision 1.72 2009/04/30 21:20:15 christos
|
||||
* 5.01 we are almost here.
|
||||
*
|
||||
* Revision 1.71 2009/01/21 19:09:42 christos
|
||||
* file 5.0
|
||||
*
|
||||
|
@ -26,7 +26,7 @@
|
||||
#include "file.h"
|
||||
|
||||
#ifndef lint
|
||||
FILE_RCSID("@(#)$File: readcdf.c,v 1.11 2009/02/03 20:27:51 christos Exp $")
|
||||
FILE_RCSID("@(#)$File: readcdf.c,v 1.18 2009/05/06 20:48:22 christos Exp $")
|
||||
#endif
|
||||
|
||||
#include <stdlib.h>
|
||||
@ -75,9 +75,23 @@ cdf_file_property_info(struct magic_set *ms, const cdf_property_info_t *info,
|
||||
if (len > 1) {
|
||||
s = info[i].pi_str.s_buf;
|
||||
if (NOTMIME(ms)) {
|
||||
if (file_printf(ms, ", %s: %.*s", buf,
|
||||
len, s) == -1)
|
||||
return -1;
|
||||
char vbuf[1024];
|
||||
size_t j;
|
||||
for (j = 0; j < sizeof(vbuf) && len--;
|
||||
j++, s++) {
|
||||
if (*s == '\0')
|
||||
break;
|
||||
if (isprint((unsigned char)*s))
|
||||
vbuf[j] = *s;
|
||||
}
|
||||
if (j == sizeof(vbuf))
|
||||
--j;
|
||||
vbuf[j] = '\0';
|
||||
if (vbuf[0]) {
|
||||
if (file_printf(ms, ", %s: %s",
|
||||
buf, vbuf) == -1)
|
||||
return -1;
|
||||
}
|
||||
} else if (info[i].pi_id ==
|
||||
CDF_PROPERTY_NAME_OF_APPLICATION) {
|
||||
if (strstr(s, "Word"))
|
||||
@ -115,7 +129,6 @@ cdf_file_property_info(struct magic_set *ms, const cdf_property_info_t *info,
|
||||
case CDF_CLIPBOARD:
|
||||
break;
|
||||
default:
|
||||
file_error(ms, 0, "Internal parsing error");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
@ -134,15 +147,8 @@ cdf_file_summary_info(struct magic_set *ms, const cdf_stream_t *sst)
|
||||
size_t count;
|
||||
int m;
|
||||
|
||||
if (cdf_unpack_summary_info(sst, &si, &info, &count) == -1) {
|
||||
if (si.si_byte_order != 0xfffe)
|
||||
return 0;
|
||||
else
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (si.si_byte_order != 0xfffe)
|
||||
return 0;
|
||||
if (cdf_unpack_summary_info(sst, &si, &info, &count) == -1)
|
||||
return -1;
|
||||
|
||||
if (NOTMIME(ms)) {
|
||||
if (file_printf(ms, "CDF V2 Document") == -1)
|
||||
@ -183,66 +189,64 @@ protected int
|
||||
file_trycdf(struct magic_set *ms, int fd, const unsigned char *buf,
|
||||
size_t nbytes)
|
||||
{
|
||||
cdf_info_t info;
|
||||
cdf_header_t h;
|
||||
cdf_sat_t sat, ssat;
|
||||
cdf_stream_t sst, scn;
|
||||
cdf_dir_t dir;
|
||||
int i;
|
||||
(void)&nbytes;
|
||||
(void)&buf;
|
||||
const char *expn = "";
|
||||
|
||||
info.i_fd = fd;
|
||||
info.i_buf = buf;
|
||||
info.i_len = nbytes;
|
||||
if (ms->flags & MAGIC_APPLE)
|
||||
return 0;
|
||||
if (cdf_read_header(fd, &h) == -1)
|
||||
if (cdf_read_header(&info, &h) == -1)
|
||||
return 0;
|
||||
#ifdef CDF_DEBUG
|
||||
cdf_dump_header(&h);
|
||||
#endif
|
||||
|
||||
if (cdf_read_sat(fd, &h, &sat) == -1) {
|
||||
file_error(ms, errno, "Can't read SAT");
|
||||
return -1;
|
||||
if ((i = cdf_read_sat(&info, &h, &sat)) == -1) {
|
||||
expn = "Can't read SAT";
|
||||
goto out0;
|
||||
}
|
||||
#ifdef CDF_DEBUG
|
||||
cdf_dump_sat("SAT", &h, &sat);
|
||||
cdf_dump_sat("SAT", &sat, CDF_SEC_SIZE(&h));
|
||||
#endif
|
||||
|
||||
if ((i = cdf_read_ssat(fd, &h, &sat, &ssat)) == -1) {
|
||||
file_error(ms, errno, "Can't read SAT");
|
||||
if ((i = cdf_read_ssat(&info, &h, &sat, &ssat)) == -1) {
|
||||
expn = "Can't read SSAT";
|
||||
goto out1;
|
||||
}
|
||||
#ifdef CDF_DEBUG
|
||||
cdf_dump_sat("SSAT", &h, &ssat);
|
||||
cdf_dump_sat("SSAT", &ssat, CDF_SHORT_SEC_SIZE(&h));
|
||||
#endif
|
||||
|
||||
if ((i = cdf_read_dir(fd, &h, &sat, &dir)) == -1) {
|
||||
file_error(ms, errno, "Can't read directory");
|
||||
if ((i = cdf_read_dir(&info, &h, &sat, &dir)) == -1) {
|
||||
expn = "Can't read directory";
|
||||
goto out2;
|
||||
}
|
||||
|
||||
if ((i = cdf_read_short_stream(fd, &h, &sat, &dir, &sst)) == -1) {
|
||||
file_error(ms, errno, "Cannot read short stream");
|
||||
if ((i = cdf_read_short_stream(&info, &h, &sat, &dir, &sst)) == -1) {
|
||||
expn = "Cannot read short stream";
|
||||
goto out3;
|
||||
}
|
||||
|
||||
#ifdef CDF_DEBUG
|
||||
cdf_dump_dir(fd, &h, &sat, &ssat, &sst, &dir);
|
||||
#endif
|
||||
if ((i = cdf_read_summary_info(fd, &h, &sat, &ssat, &sst, &dir, &scn))
|
||||
== -1) {
|
||||
/* Some files don't have summary info! */
|
||||
#ifdef notyet
|
||||
file_error(ms, errno, "Can't read summary_info");
|
||||
#else
|
||||
i = 0;
|
||||
cdf_dump_dir(&info, &h, &sat, &ssat, &sst, &dir);
|
||||
#endif
|
||||
|
||||
if ((i = cdf_read_summary_info(&info, &h, &sat, &ssat, &sst, &dir,
|
||||
&scn)) == -1) {
|
||||
expn = "Cannot read summary info";
|
||||
goto out4;
|
||||
}
|
||||
#ifdef CDF_DEBUG
|
||||
cdf_dump_summary_info(&h, &scn);
|
||||
#endif
|
||||
if ((i = cdf_file_summary_info(ms, &scn)) == -1)
|
||||
file_error(ms, errno, "Can't expand summary_info");
|
||||
expn = "Can't expand summary_info";
|
||||
free(scn.sst_tab);
|
||||
out4:
|
||||
free(sst.sst_tab);
|
||||
@ -252,5 +256,14 @@ file_trycdf(struct magic_set *ms, int fd, const unsigned char *buf,
|
||||
free(ssat.sat_tab);
|
||||
out1:
|
||||
free(sat.sat_tab);
|
||||
out0:
|
||||
if (i != 1) {
|
||||
if (file_printf(ms, "CDF V2 Document") == -1)
|
||||
return -1;
|
||||
if (*expn)
|
||||
if (file_printf(ms, ", corrupt: %s", expn) == -1)
|
||||
return -1;
|
||||
i = 1;
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
@ -32,7 +32,7 @@
|
||||
#include "file.h"
|
||||
|
||||
#ifndef lint
|
||||
FILE_RCSID("@(#)$File: softmagic.c,v 1.133 2008/11/07 22:50:37 christos Exp $")
|
||||
FILE_RCSID("@(#)$File: softmagic.c,v 1.135 2009/03/27 22:42:49 christos Exp $")
|
||||
#endif /* lint */
|
||||
|
||||
#include "magic.h"
|
||||
@ -256,11 +256,14 @@ match(struct magic_set *ms, struct magic *magic, uint32_t nmagic,
|
||||
* make sure that we have a separator first.
|
||||
*/
|
||||
if (*m->desc) {
|
||||
printed_something = 1;
|
||||
if ((e = handle_annotation(ms, m)) != 0)
|
||||
return e;
|
||||
if (print_sep(ms, firstline) == -1)
|
||||
return -1;
|
||||
if (!printed_something) {
|
||||
printed_something = 1;
|
||||
if (print_sep(ms, firstline)
|
||||
== -1)
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
/*
|
||||
* This continuation matched. Print
|
||||
@ -338,14 +341,13 @@ strndup(const char *str, size_t n)
|
||||
size_t len;
|
||||
char *copy;
|
||||
|
||||
len = strlen(str);
|
||||
if (len > n)
|
||||
len = n;
|
||||
if (!(copy = malloc(len + 1)))
|
||||
return (NULL);
|
||||
(void) memcpy(copy, str, len + 1);
|
||||
for (len = 0; len < n && str[len]; len++)
|
||||
continue;
|
||||
if ((copy = malloc(len + 1)) == NULL)
|
||||
return NULL;
|
||||
(void)memcpy(copy, str, len);
|
||||
copy[len] = '\0';
|
||||
return (copy);
|
||||
return copy;
|
||||
}
|
||||
#endif /* HAVE_STRNDUP */
|
||||
|
||||
|
58
contrib/file/strlcat.c
Normal file
58
contrib/file/strlcat.c
Normal file
@ -0,0 +1,58 @@
|
||||
/* $OpenBSD: strlcat.c,v 1.13 2005/08/08 08:05:37 espie Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* OPENBSD ORIGINAL: lib/libc/string/strlcat.c */
|
||||
#include "file.h"
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <string.h>
|
||||
|
||||
/*
|
||||
* Appends src to string dst of size siz (unlike strncat, siz is the
|
||||
* full size of dst, not space left). At most siz-1 characters
|
||||
* will be copied. Always NUL terminates (unless siz <= strlen(dst)).
|
||||
* Returns strlen(src) + MIN(siz, strlen(initial dst)).
|
||||
* If retval >= siz, truncation occurred.
|
||||
*/
|
||||
size_t
|
||||
strlcat(char *dst, const char *src, size_t siz)
|
||||
{
|
||||
char *d = dst;
|
||||
const char *s = src;
|
||||
size_t n = siz;
|
||||
size_t dlen;
|
||||
|
||||
/* Find the end of dst and adjust bytes left but don't go past end */
|
||||
while (n-- != 0 && *d != '\0')
|
||||
d++;
|
||||
dlen = d - dst;
|
||||
n = siz - dlen;
|
||||
|
||||
if (n == 0)
|
||||
return(dlen + strlen(s));
|
||||
while (*s != '\0') {
|
||||
if (n != 1) {
|
||||
*d++ = *s;
|
||||
n--;
|
||||
}
|
||||
s++;
|
||||
}
|
||||
*d = '\0';
|
||||
|
||||
return(dlen + (s - src)); /* count does not include NUL */
|
||||
}
|
54
contrib/file/strlcpy.c
Normal file
54
contrib/file/strlcpy.c
Normal file
@ -0,0 +1,54 @@
|
||||
/* $OpenBSD: strlcpy.c,v 1.10 2005/08/08 08:05:37 espie Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* OPENBSD ORIGINAL: lib/libc/string/strlcpy.c */
|
||||
#include "file.h"
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <string.h>
|
||||
|
||||
/*
|
||||
* Copy src to string dst of size siz. At most siz-1 characters
|
||||
* will be copied. Always NUL terminates (unless siz == 0).
|
||||
* Returns strlen(src); if retval >= siz, truncation occurred.
|
||||
*/
|
||||
size_t
|
||||
strlcpy(char *dst, const char *src, size_t siz)
|
||||
{
|
||||
char *d = dst;
|
||||
const char *s = src;
|
||||
size_t n = siz;
|
||||
|
||||
/* Copy as many bytes as will fit */
|
||||
if (n != 0 && --n != 0) {
|
||||
do {
|
||||
if ((*d++ = *s++) == 0)
|
||||
break;
|
||||
} while (--n != 0);
|
||||
}
|
||||
|
||||
/* Not enough room in dst, add NUL and traverse rest of src */
|
||||
if (n == 0) {
|
||||
if (siz != 0)
|
||||
*d = '\0'; /* NUL-terminate dst */
|
||||
while (*s++)
|
||||
;
|
||||
}
|
||||
|
||||
return(s - src - 1); /* count does not include NUL */
|
||||
}
|
@ -14,7 +14,6 @@
|
||||
|
||||
@SET_MAKE@
|
||||
VPATH = @srcdir@
|
||||
pkgdatadir = $(datadir)/@PACKAGE@
|
||||
pkglibdir = $(libdir)/@PACKAGE@
|
||||
pkgincludedir = $(includedir)/@PACKAGE@
|
||||
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
|
||||
@ -62,6 +61,7 @@ DIST_SOURCES = test.c
|
||||
ETAGS = etags
|
||||
CTAGS = ctags
|
||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||
pkgdatadir = @pkgdatadir@
|
||||
ACLOCAL = @ACLOCAL@
|
||||
AMTAR = @AMTAR@
|
||||
AR = @AR@
|
||||
@ -81,6 +81,7 @@ CXXFLAGS = @CXXFLAGS@
|
||||
CYGPATH_W = @CYGPATH_W@
|
||||
DEFS = @DEFS@
|
||||
DEPDIR = @DEPDIR@
|
||||
DSYMUTIL = @DSYMUTIL@
|
||||
ECHO = @ECHO@
|
||||
ECHO_C = @ECHO_C@
|
||||
ECHO_N = @ECHO_N@
|
||||
@ -103,6 +104,7 @@ LN_S = @LN_S@
|
||||
LTLIBOBJS = @LTLIBOBJS@
|
||||
MAKEINFO = @MAKEINFO@
|
||||
MKDIR_P = @MKDIR_P@
|
||||
NMEDIT = @NMEDIT@
|
||||
OBJEXT = @OBJEXT@
|
||||
PACKAGE = @PACKAGE@
|
||||
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
||||
@ -112,6 +114,7 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
||||
PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||
PATH_SEPARATOR = @PATH_SEPARATOR@
|
||||
RANLIB = @RANLIB@
|
||||
SED = @SED@
|
||||
SET_MAKE = @SET_MAKE@
|
||||
SHELL = @SHELL@
|
||||
STRIP = @STRIP@
|
||||
|
@ -726,7 +726,7 @@ st 24 0 0x220B
|
||||
product 24 0 0x220F
|
||||
coproduct 24 0 0x2210
|
||||
sum 24 0 0x2211
|
||||
\- 24 0 0x2212
|
||||
\- 24 0 0x002D
|
||||
mi "
|
||||
-+ 24 0 0x2213
|
||||
** 24 0 0x2217
|
||||
|
@ -1,285 +1,626 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Library General Public License instead.) You can apply it to
|
||||
The GNU General Public License is a free, copyleft license for
|
||||
software and other kinds of works.
|
||||
|
||||
The licenses for most software and other practical works are designed
|
||||
to take away your freedom to share and change the works. By contrast,
|
||||
the GNU General Public License is intended to guarantee your freedom to
|
||||
share and change all versions of a program--to make sure it remains free
|
||||
software for all its users. We, the Free Software Foundation, use the
|
||||
GNU General Public License for most of our software; it applies also to
|
||||
any other work released this way by its authors. You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
them if you wish), that you receive source code or can get it if you
|
||||
want it, that you can change the software or use pieces of it in new
|
||||
free programs, and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
To protect your rights, we need to prevent others from denying you
|
||||
these rights or asking you to surrender the rights. Therefore, you have
|
||||
certain responsibilities if you distribute copies of the software, or if
|
||||
you modify it: responsibilities to respect the freedom of others.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must show them these terms so they know their
|
||||
rights.
|
||||
gratis or for a fee, you must pass on to the recipients the same
|
||||
freedoms that you received. You must make sure that they, too, receive
|
||||
or can get the source code. And you must show them these terms so they
|
||||
know their rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
Developers that use the GNU GPL protect your rights with two steps:
|
||||
(1) assert copyright on the software, and (2) offer you this License
|
||||
giving you legal permission to copy, distribute and/or modify it.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
For the developers' and authors' protection, the GPL clearly explains
|
||||
that there is no warranty for this free software. For both users' and
|
||||
authors' sake, the GPL requires that modified versions be marked as
|
||||
changed, so that their problems will not be attributed erroneously to
|
||||
authors of previous versions.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
Some devices are designed to deny users access to install or run
|
||||
modified versions of the software inside them, although the manufacturer
|
||||
can do so. This is fundamentally incompatible with the aim of
|
||||
protecting users' freedom to change the software. The systematic
|
||||
pattern of such abuse occurs in the area of products for individuals to
|
||||
use, which is precisely where it is most unacceptable. Therefore, we
|
||||
have designed this version of the GPL to prohibit the practice for those
|
||||
products. If such problems arise substantially in other domains, we
|
||||
stand ready to extend this provision to those domains in future versions
|
||||
of the GPL, as needed to protect the freedom of users.
|
||||
|
||||
Finally, every program is threatened constantly by software patents.
|
||||
States should not allow patents to restrict development and use of
|
||||
software on general-purpose computers, but in those that do, we wish to
|
||||
avoid the special danger that patents applied to a free program could
|
||||
make it effectively proprietary. To prevent this, the GPL assures that
|
||||
patents cannot be used to render the program non-free.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
TERMS AND CONDITIONS
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
0. Definitions.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's
|
||||
source code as you receive it, in any medium, provided that you
|
||||
conspicuously and appropriately publish on each copy an appropriate
|
||||
copyright notice and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
"This License" refers to version 3 of the GNU General Public License.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||
works, such as semiconductor masks.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
"The Program" refers to any copyrightable work licensed under this
|
||||
License. Each licensee is addressed as "you". "Licensees" and
|
||||
"recipients" may be individuals or organizations.
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
To "modify" a work means to copy from or adapt all or part of the work
|
||||
in a fashion requiring copyright permission, other than the making of an
|
||||
exact copy. The resulting work is called a "modified version" of the
|
||||
earlier work or a work "based on" the earlier work.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
A "covered work" means either the unmodified Program or a work based
|
||||
on the Program.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
To "propagate" a work means to do anything with it that, without
|
||||
permission, would make you directly or secondarily liable for
|
||||
infringement under applicable copyright law, except executing it on a
|
||||
computer or modifying a private copy. Propagation includes copying,
|
||||
distribution (with or without modification), making available to the
|
||||
public, and in some countries other activities as well.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
To "convey" a work means any kind of propagation that enables other
|
||||
parties to make or receive copies. Mere interaction with a user through
|
||||
a computer network, with no transfer of a copy, is not conveying.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
An interactive user interface displays "Appropriate Legal Notices"
|
||||
to the extent that it includes a convenient and prominently visible
|
||||
feature that (1) displays an appropriate copyright notice, and (2)
|
||||
tells the user that there is no warranty for the work (except to the
|
||||
extent that warranties are provided), that licensees may convey the
|
||||
work under this License, and how to view a copy of this License. If
|
||||
the interface presents a list of user commands or options, such as a
|
||||
menu, a prominent item in the list meets this criterion.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
1. Source Code.
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
The "source code" for a work means the preferred form of the work
|
||||
for making modifications to it. "Object code" means any non-source
|
||||
form of a work.
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
A "Standard Interface" means an interface that either is an official
|
||||
standard defined by a recognized standards body, or, in the case of
|
||||
interfaces specified for a particular programming language, one that
|
||||
is widely used among developers working in that language.
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
The "System Libraries" of an executable work include anything, other
|
||||
than the work as a whole, that (a) is included in the normal form of
|
||||
packaging a Major Component, but which is not part of that Major
|
||||
Component, and (b) serves only to enable use of the work with that
|
||||
Major Component, or to implement a Standard Interface for which an
|
||||
implementation is available to the public in source code form. A
|
||||
"Major Component", in this context, means a major essential component
|
||||
(kernel, window system, and so on) of the specific operating system
|
||||
(if any) on which the executable work runs, or a compiler used to
|
||||
produce the work, or an object code interpreter used to run it.
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
The "Corresponding Source" for a work in object code form means all
|
||||
the source code needed to generate, install, and (for an executable
|
||||
work) run the object code and to modify the work, including scripts to
|
||||
control those activities. However, it does not include the work's
|
||||
System Libraries, or general-purpose tools or generally available free
|
||||
programs which are used unmodified in performing those activities but
|
||||
which are not part of the work. For example, Corresponding Source
|
||||
includes interface definition files associated with source files for
|
||||
the work, and the source code for shared libraries and dynamically
|
||||
linked subprograms that the work is specifically designed to require,
|
||||
such as by intimate data communication or control flow between those
|
||||
subprograms and other parts of the work.
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
The Corresponding Source need not include anything that users
|
||||
can regenerate automatically from other parts of the Corresponding
|
||||
Source.
|
||||
|
||||
5. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
The Corresponding Source for a work in source code form is that
|
||||
same work.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
2. Basic Permissions.
|
||||
|
||||
All rights granted under this License are granted for the term of
|
||||
copyright on the Program, and are irrevocable provided the stated
|
||||
conditions are met. This License explicitly affirms your unlimited
|
||||
permission to run the unmodified Program. The output from running a
|
||||
covered work is covered by this License only if the output, given its
|
||||
content, constitutes a covered work. This License acknowledges your
|
||||
rights of fair use or other equivalent, as provided by copyright law.
|
||||
|
||||
You may make, run and propagate covered works that you do not
|
||||
convey, without conditions so long as your license otherwise remains
|
||||
in force. You may convey covered works to others for the sole purpose
|
||||
of having them make modifications exclusively for you, or provide you
|
||||
with facilities for running those works, provided that you comply with
|
||||
the terms of this License in conveying all material for which you do
|
||||
not control copyright. Those thus making or running the covered works
|
||||
for you must do so exclusively on your behalf, under your direction
|
||||
and control, on terms that prohibit them from making any copies of
|
||||
your copyrighted material outside their relationship with you.
|
||||
|
||||
Conveying under any other circumstances is permitted solely under
|
||||
the conditions stated below. Sublicensing is not allowed; section 10
|
||||
makes it unnecessary.
|
||||
|
||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||
|
||||
No covered work shall be deemed part of an effective technological
|
||||
measure under any applicable law fulfilling obligations under article
|
||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||
similar laws prohibiting or restricting circumvention of such
|
||||
measures.
|
||||
|
||||
When you convey a covered work, you waive any legal power to forbid
|
||||
circumvention of technological measures to the extent such circumvention
|
||||
is effected by exercising rights under this License with respect to
|
||||
the covered work, and you disclaim any intention to limit operation or
|
||||
modification of the work as a means of enforcing, against the work's
|
||||
users, your or third parties' legal rights to forbid circumvention of
|
||||
technological measures.
|
||||
|
||||
4. Conveying Verbatim Copies.
|
||||
|
||||
You may convey verbatim copies of the Program's source code as you
|
||||
receive it, in any medium, provided that you conspicuously and
|
||||
appropriately publish on each copy an appropriate copyright notice;
|
||||
keep intact all notices stating that this License and any
|
||||
non-permissive terms added in accord with section 7 apply to the code;
|
||||
keep intact all notices of the absence of any warranty; and give all
|
||||
recipients a copy of this License along with the Program.
|
||||
|
||||
You may charge any price or no price for each copy that you convey,
|
||||
and you may offer support or warranty protection for a fee.
|
||||
|
||||
5. Conveying Modified Source Versions.
|
||||
|
||||
You may convey a work based on the Program, or the modifications to
|
||||
produce it from the Program, in the form of source code under the
|
||||
terms of section 4, provided that you also meet all of these conditions:
|
||||
|
||||
a) The work must carry prominent notices stating that you modified
|
||||
it, and giving a relevant date.
|
||||
|
||||
b) The work must carry prominent notices stating that it is
|
||||
released under this License and any conditions added under section
|
||||
7. This requirement modifies the requirement in section 4 to
|
||||
"keep intact all notices".
|
||||
|
||||
c) You must license the entire work, as a whole, under this
|
||||
License to anyone who comes into possession of a copy. This
|
||||
License will therefore apply, along with any applicable section 7
|
||||
additional terms, to the whole of the work, and all its parts,
|
||||
regardless of how they are packaged. This License gives no
|
||||
permission to license the work in any other way, but it does not
|
||||
invalidate such permission if you have separately received it.
|
||||
|
||||
d) If the work has interactive user interfaces, each must display
|
||||
Appropriate Legal Notices; however, if the Program has interactive
|
||||
interfaces that do not display Appropriate Legal Notices, your
|
||||
work need not make them do so.
|
||||
|
||||
A compilation of a covered work with other separate and independent
|
||||
works, which are not by their nature extensions of the covered work,
|
||||
and which are not combined with it such as to form a larger program,
|
||||
in or on a volume of a storage or distribution medium, is called an
|
||||
"aggregate" if the compilation and its resulting copyright are not
|
||||
used to limit the access or legal rights of the compilation's users
|
||||
beyond what the individual works permit. Inclusion of a covered work
|
||||
in an aggregate does not cause this License to apply to the other
|
||||
parts of the aggregate.
|
||||
|
||||
6. Conveying Non-Source Forms.
|
||||
|
||||
You may convey a covered work in object code form under the terms
|
||||
of sections 4 and 5, provided that you also convey the
|
||||
machine-readable Corresponding Source under the terms of this License,
|
||||
in one of these ways:
|
||||
|
||||
a) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by the
|
||||
Corresponding Source fixed on a durable physical medium
|
||||
customarily used for software interchange.
|
||||
|
||||
b) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by a
|
||||
written offer, valid for at least three years and valid for as
|
||||
long as you offer spare parts or customer support for that product
|
||||
model, to give anyone who possesses the object code either (1) a
|
||||
copy of the Corresponding Source for all the software in the
|
||||
product that is covered by this License, on a durable physical
|
||||
medium customarily used for software interchange, for a price no
|
||||
more than your reasonable cost of physically performing this
|
||||
conveying of source, or (2) access to copy the
|
||||
Corresponding Source from a network server at no charge.
|
||||
|
||||
c) Convey individual copies of the object code with a copy of the
|
||||
written offer to provide the Corresponding Source. This
|
||||
alternative is allowed only occasionally and noncommercially, and
|
||||
only if you received the object code with such an offer, in accord
|
||||
with subsection 6b.
|
||||
|
||||
d) Convey the object code by offering access from a designated
|
||||
place (gratis or for a charge), and offer equivalent access to the
|
||||
Corresponding Source in the same way through the same place at no
|
||||
further charge. You need not require recipients to copy the
|
||||
Corresponding Source along with the object code. If the place to
|
||||
copy the object code is a network server, the Corresponding Source
|
||||
may be on a different server (operated by you or a third party)
|
||||
that supports equivalent copying facilities, provided you maintain
|
||||
clear directions next to the object code saying where to find the
|
||||
Corresponding Source. Regardless of what server hosts the
|
||||
Corresponding Source, you remain obligated to ensure that it is
|
||||
available for as long as needed to satisfy these requirements.
|
||||
|
||||
e) Convey the object code using peer-to-peer transmission, provided
|
||||
you inform other peers where the object code and Corresponding
|
||||
Source of the work are being offered to the general public at no
|
||||
charge under subsection 6d.
|
||||
|
||||
A separable portion of the object code, whose source code is excluded
|
||||
from the Corresponding Source as a System Library, need not be
|
||||
included in conveying the object code work.
|
||||
|
||||
A "User Product" is either (1) a "consumer product", which means any
|
||||
tangible personal property which is normally used for personal, family,
|
||||
or household purposes, or (2) anything designed or sold for incorporation
|
||||
into a dwelling. In determining whether a product is a consumer product,
|
||||
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||
product received by a particular user, "normally used" refers to a
|
||||
typical or common use of that class of product, regardless of the status
|
||||
of the particular user or of the way in which the particular user
|
||||
actually uses, or expects or is expected to use, the product. A product
|
||||
is a consumer product regardless of whether the product has substantial
|
||||
commercial, industrial or non-consumer uses, unless such uses represent
|
||||
the only significant mode of use of the product.
|
||||
|
||||
"Installation Information" for a User Product means any methods,
|
||||
procedures, authorization keys, or other information required to install
|
||||
and execute modified versions of a covered work in that User Product from
|
||||
a modified version of its Corresponding Source. The information must
|
||||
suffice to ensure that the continued functioning of the modified object
|
||||
code is in no case prevented or interfered with solely because
|
||||
modification has been made.
|
||||
|
||||
If you convey an object code work under this section in, or with, or
|
||||
specifically for use in, a User Product, and the conveying occurs as
|
||||
part of a transaction in which the right of possession and use of the
|
||||
User Product is transferred to the recipient in perpetuity or for a
|
||||
fixed term (regardless of how the transaction is characterized), the
|
||||
Corresponding Source conveyed under this section must be accompanied
|
||||
by the Installation Information. But this requirement does not apply
|
||||
if neither you nor any third party retains the ability to install
|
||||
modified object code on the User Product (for example, the work has
|
||||
been installed in ROM).
|
||||
|
||||
The requirement to provide Installation Information does not include a
|
||||
requirement to continue to provide support service, warranty, or updates
|
||||
for a work that has been modified or installed by the recipient, or for
|
||||
the User Product in which it has been modified or installed. Access to a
|
||||
network may be denied when the modification itself materially and
|
||||
adversely affects the operation of the network or violates the rules and
|
||||
protocols for communication across the network.
|
||||
|
||||
Corresponding Source conveyed, and Installation Information provided,
|
||||
in accord with this section must be in a format that is publicly
|
||||
documented (and with an implementation available to the public in
|
||||
source code form), and must require no special password or key for
|
||||
unpacking, reading or copying.
|
||||
|
||||
7. Additional Terms.
|
||||
|
||||
"Additional permissions" are terms that supplement the terms of this
|
||||
License by making exceptions from one or more of its conditions.
|
||||
Additional permissions that are applicable to the entire Program shall
|
||||
be treated as though they were included in this License, to the extent
|
||||
that they are valid under applicable law. If additional permissions
|
||||
apply only to part of the Program, that part may be used separately
|
||||
under those permissions, but the entire Program remains governed by
|
||||
this License without regard to the additional permissions.
|
||||
|
||||
When you convey a copy of a covered work, you may at your option
|
||||
remove any additional permissions from that copy, or from any part of
|
||||
it. (Additional permissions may be written to require their own
|
||||
removal in certain cases when you modify the work.) You may place
|
||||
additional permissions on material, added by you to a covered work,
|
||||
for which you have or can give appropriate copyright permission.
|
||||
|
||||
Notwithstanding any other provision of this License, for material you
|
||||
add to a covered work, you may (if authorized by the copyright holders of
|
||||
that material) supplement the terms of this License with terms:
|
||||
|
||||
a) Disclaiming warranty or limiting liability differently from the
|
||||
terms of sections 15 and 16 of this License; or
|
||||
|
||||
b) Requiring preservation of specified reasonable legal notices or
|
||||
author attributions in that material or in the Appropriate Legal
|
||||
Notices displayed by works containing it; or
|
||||
|
||||
c) Prohibiting misrepresentation of the origin of that material, or
|
||||
requiring that modified versions of such material be marked in
|
||||
reasonable ways as different from the original version; or
|
||||
|
||||
d) Limiting the use for publicity purposes of names of licensors or
|
||||
authors of the material; or
|
||||
|
||||
e) Declining to grant rights under trademark law for use of some
|
||||
trade names, trademarks, or service marks; or
|
||||
|
||||
f) Requiring indemnification of licensors and authors of that
|
||||
material by anyone who conveys the material (or modified versions of
|
||||
it) with contractual assumptions of liability to the recipient, for
|
||||
any liability that these contractual assumptions directly impose on
|
||||
those licensors and authors.
|
||||
|
||||
All other non-permissive additional terms are considered "further
|
||||
restrictions" within the meaning of section 10. If the Program as you
|
||||
received it, or any part of it, contains a notice stating that it is
|
||||
governed by this License along with a term that is a further
|
||||
restriction, you may remove that term. If a license document contains
|
||||
a further restriction but permits relicensing or conveying under this
|
||||
License, you may add to a covered work material governed by the terms
|
||||
of that license document, provided that the further restriction does
|
||||
not survive such relicensing or conveying.
|
||||
|
||||
If you add terms to a covered work in accord with this section, you
|
||||
must place, in the relevant source files, a statement of the
|
||||
additional terms that apply to those files, or a notice indicating
|
||||
where to find the applicable terms.
|
||||
|
||||
Additional terms, permissive or non-permissive, may be stated in the
|
||||
form of a separately written license, or stated as exceptions;
|
||||
the above requirements apply either way.
|
||||
|
||||
8. Termination.
|
||||
|
||||
You may not propagate or modify a covered work except as expressly
|
||||
provided under this License. Any attempt otherwise to propagate or
|
||||
modify it is void, and will automatically terminate your rights under
|
||||
this License (including any patent licenses granted under the third
|
||||
paragraph of section 11).
|
||||
|
||||
However, if you cease all violation of this License, then your
|
||||
license from a particular copyright holder is reinstated (a)
|
||||
provisionally, unless and until the copyright holder explicitly and
|
||||
finally terminates your license, and (b) permanently, if the copyright
|
||||
holder fails to notify you of the violation by some reasonable means
|
||||
prior to 60 days after the cessation.
|
||||
|
||||
Moreover, your license from a particular copyright holder is
|
||||
reinstated permanently if the copyright holder notifies you of the
|
||||
violation by some reasonable means, this is the first time you have
|
||||
received notice of violation of this License (for any work) from that
|
||||
copyright holder, and you cure the violation prior to 30 days after
|
||||
your receipt of the notice.
|
||||
|
||||
Termination of your rights under this section does not terminate the
|
||||
licenses of parties who have received copies or rights from you under
|
||||
this License. If your rights have been terminated and not permanently
|
||||
reinstated, you do not qualify to receive new licenses for the same
|
||||
material under section 10.
|
||||
|
||||
9. Acceptance Not Required for Having Copies.
|
||||
|
||||
You are not required to accept this License in order to receive or
|
||||
run a copy of the Program. Ancillary propagation of a covered work
|
||||
occurring solely as a consequence of using peer-to-peer transmission
|
||||
to receive a copy likewise does not require acceptance. However,
|
||||
nothing other than this License grants you permission to propagate or
|
||||
modify any covered work. These actions infringe copyright if you do
|
||||
not accept this License. Therefore, by modifying or propagating a
|
||||
covered work, you indicate your acceptance of this License to do so.
|
||||
|
||||
10. Automatic Licensing of Downstream Recipients.
|
||||
|
||||
Each time you convey a covered work, the recipient automatically
|
||||
receives a license from the original licensors, to run, modify and
|
||||
propagate that work, subject to this License. You are not responsible
|
||||
for enforcing compliance by third parties with this License.
|
||||
|
||||
An "entity transaction" is a transaction transferring control of an
|
||||
organization, or substantially all assets of one, or subdividing an
|
||||
organization, or merging organizations. If propagation of a covered
|
||||
work results from an entity transaction, each party to that
|
||||
transaction who receives a copy of the work also receives whatever
|
||||
licenses to the work the party's predecessor in interest had or could
|
||||
give under the previous paragraph, plus a right to possession of the
|
||||
Corresponding Source of the work from the predecessor in interest, if
|
||||
the predecessor has it or can get it with reasonable efforts.
|
||||
|
||||
You may not impose any further restrictions on the exercise of the
|
||||
rights granted or affirmed under this License. For example, you may
|
||||
not impose a license fee, royalty, or other charge for exercise of
|
||||
rights granted under this License, and you may not initiate litigation
|
||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||
any patent claim is infringed by making, using, selling, offering for
|
||||
sale, or importing the Program or any portion of it.
|
||||
|
||||
11. Patents.
|
||||
|
||||
A "contributor" is a copyright holder who authorizes use under this
|
||||
License of the Program or a work on which the Program is based. The
|
||||
work thus licensed is called the contributor's "contributor version".
|
||||
|
||||
A contributor's "essential patent claims" are all patent claims
|
||||
owned or controlled by the contributor, whether already acquired or
|
||||
hereafter acquired, that would be infringed by some manner, permitted
|
||||
by this License, of making, using, or selling its contributor version,
|
||||
but do not include claims that would be infringed only as a
|
||||
consequence of further modification of the contributor version. For
|
||||
purposes of this definition, "control" includes the right to grant
|
||||
patent sublicenses in a manner consistent with the requirements of
|
||||
this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||
patent license under the contributor's essential patent claims, to
|
||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||
propagate the contents of its contributor version.
|
||||
|
||||
In the following three paragraphs, a "patent license" is any express
|
||||
agreement or commitment, however denominated, not to enforce a patent
|
||||
(such as an express permission to practice a patent or covenant not to
|
||||
sue for patent infringement). To "grant" such a patent license to a
|
||||
party means to make such an agreement or commitment not to enforce a
|
||||
patent against the party.
|
||||
|
||||
If you convey a covered work, knowingly relying on a patent license,
|
||||
and the Corresponding Source of the work is not available for anyone
|
||||
to copy, free of charge and under the terms of this License, through a
|
||||
publicly available network server or other readily accessible means,
|
||||
then you must either (1) cause the Corresponding Source to be so
|
||||
available, or (2) arrange to deprive yourself of the benefit of the
|
||||
patent license for this particular work, or (3) arrange, in a manner
|
||||
consistent with the requirements of this License, to extend the patent
|
||||
license to downstream recipients. "Knowingly relying" means you have
|
||||
actual knowledge that, but for the patent license, your conveying the
|
||||
covered work in a country, or your recipient's use of the covered work
|
||||
in a country, would infringe one or more identifiable patents in that
|
||||
country that you have reason to believe are valid.
|
||||
|
||||
If, pursuant to or in connection with a single transaction or
|
||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||
covered work, and grant a patent license to some of the parties
|
||||
receiving the covered work authorizing them to use, propagate, modify
|
||||
or convey a specific copy of the covered work, then the patent license
|
||||
you grant is automatically extended to all recipients of the covered
|
||||
work and works based on it.
|
||||
|
||||
A patent license is "discriminatory" if it does not include within
|
||||
the scope of its coverage, prohibits the exercise of, or is
|
||||
conditioned on the non-exercise of one or more of the rights that are
|
||||
specifically granted under this License. You may not convey a covered
|
||||
work if you are a party to an arrangement with a third party that is
|
||||
in the business of distributing software, under which you make payment
|
||||
to the third party based on the extent of your activity of conveying
|
||||
the work, and under which the third party grants, to any of the
|
||||
parties who would receive the covered work from you, a discriminatory
|
||||
patent license (a) in connection with copies of the covered work
|
||||
conveyed by you (or copies made from those copies), or (b) primarily
|
||||
for and in connection with specific products or compilations that
|
||||
contain the covered work, unless you entered into that arrangement,
|
||||
or that patent license was granted, prior to 28 March 2007.
|
||||
|
||||
Nothing in this License shall be construed as excluding or limiting
|
||||
any implied license or other defenses to infringement that may
|
||||
otherwise be available to you under applicable patent law.
|
||||
|
||||
12. No Surrender of Others' Freedom.
|
||||
|
||||
If conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
excuse you from the conditions of this License. If you cannot convey a
|
||||
covered work so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you may
|
||||
not convey it at all. For example, if you agree to terms that obligate you
|
||||
to collect a royalty for further conveying from those to whom you convey
|
||||
the Program, the only way you could satisfy both those terms and this
|
||||
License would be to refrain entirely from conveying the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
13. Use with the GNU Affero General Public License.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
Notwithstanding any other provision of this License, you have
|
||||
permission to link or combine any covered work with a work licensed
|
||||
under version 3 of the GNU Affero General Public License into a single
|
||||
combined work, and to convey the resulting work. The terms of this
|
||||
License will continue to apply to the part which is the covered work,
|
||||
but the special requirements of the GNU Affero General Public License,
|
||||
section 13, concerning interaction through a network will apply to the
|
||||
combination as such.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
14. Revised Versions of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the General Public License from time to time. Such new versions will
|
||||
The Free Software Foundation may publish revised and/or new versions of
|
||||
the GNU General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
Each version is given a distinguishing version number. If the
|
||||
Program specifies that a certain numbered version of the GNU General
|
||||
Public License "or any later version" applies to it, you have the
|
||||
option of following the terms and conditions either of that numbered
|
||||
version or of any later version published by the Free Software
|
||||
Foundation. If the Program does not specify a version number of the
|
||||
GNU General Public License, you may choose any version ever published
|
||||
by the Free Software Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
If the Program specifies that a proxy can decide which future
|
||||
versions of the GNU General Public License can be used, that proxy's
|
||||
public statement of acceptance of a version permanently authorizes you
|
||||
to choose that version for the Program.
|
||||
|
||||
NO WARRANTY
|
||||
Later license versions may give you additional or different
|
||||
permissions. However, no additional obligations are imposed on any
|
||||
author or copyright holder as a result of your choosing to follow a
|
||||
later version.
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
15. Disclaimer of Warranty.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
16. Limitation of Liability.
|
||||
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGES.
|
||||
|
||||
17. Interpretation of Sections 15 and 16.
|
||||
|
||||
If the disclaimer of warranty and limitation of liability provided
|
||||
above cannot be given local legal effect according to their terms,
|
||||
reviewing courts shall apply local law that most closely approximates
|
||||
an absolute waiver of all civil liability in connection with the
|
||||
Program, unless a warranty or assumption of liability accompanies a
|
||||
copy of the Program in return for a fee.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
@ -287,15 +628,15 @@ free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least
|
||||
state the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
@ -304,37 +645,30 @@ the "copyright" line and a pointer to where the full notice is found.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program is interactive, make it output a short notice like this
|
||||
when it starts in an interactive mode:
|
||||
If the program does terminal interaction, make it output a short
|
||||
notice like this when it starts in an interactive mode:
|
||||
|
||||
Gnomovision version 69, Copyright (C) year name of author
|
||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
<program> Copyright (C) <year> <name of author>
|
||||
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, the commands you use may
|
||||
be called something other than `show w' and `show c'; they could even be
|
||||
mouse-clicks or menu items--whatever suits your program.
|
||||
parts of the General Public License. Of course, your program's commands
|
||||
might be different; for a GUI interface, you would use an "about box".
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
You should also get your employer (if you work as a programmer) or school,
|
||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||
For more information on this, and how to apply and follow the GNU GPL, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1989
|
||||
Ty Coon, President of Vice
|
||||
|
||||
This General Public License does not permit incorporating your program into
|
||||
proprietary programs. If your program is a subroutine library, you may
|
||||
consider it more useful to permit linking proprietary applications with the
|
||||
library. If this is what you want to do, use the GNU Library General
|
||||
Public License instead of this License.
|
||||
The GNU General Public License does not permit incorporating your program
|
||||
into proprietary programs. If your program is a subroutine library, you
|
||||
may consider it more useful to permit linking proprietary applications with
|
||||
the library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License. But first, please read
|
||||
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
|
||||
|
@ -2,23 +2,26 @@ $FreeBSD$
|
||||
|
||||
1. Download latest less(1) tarball. The homepage of less(1) is at:
|
||||
http://www.greenwoodsoftware.com/less/
|
||||
2. Export the tarball into a directory, (say "v-less").
|
||||
3. Checkout our contrib/less code into another directory (say "f-less"),
|
||||
with -rLESS.
|
||||
4. Copy v-less/ files over f-less, check if there is any files that is
|
||||
removed by vendor, or newly added, note them.
|
||||
5. do cvs up -A in f-less, resolve the conflicts.
|
||||
6. Regenerate defines.h:
|
||||
2. Checkout $FSVN/vendor/less/ into less/
|
||||
3. Extract new code to, say, less/lessv429
|
||||
4. cd less/dist
|
||||
5. svn list -R | grep -v '/$' | sort >../old
|
||||
6. cd ../lessv429
|
||||
7. find . -type f | cut -c 3- | sort >../new
|
||||
8. tar cf - . | tar xf - -C ../dist
|
||||
9. cd ../dist
|
||||
10. comm -23 ../old ../new | xargs svn rm
|
||||
11. comm -13 ../old ../new | xargs svn add
|
||||
12. Check svn status output and make sure that all changes are appropriate.
|
||||
13. Commit and tag the result.
|
||||
14. Resolve any conflicts that happen in head/contrib/less.
|
||||
15. Regenerate defines.h:
|
||||
./configure --prefix=/ --bindir=/usr/bin --sbindir=/usr/sbin \
|
||||
--libexecdir=/usr/libexec --datarootdir=/usr/share
|
||||
7. Manually merge changes into src/usr.bin/less/defines.h; adjust
|
||||
16. Manually merge changes into src/usr.bin/less/defines.h; adjust
|
||||
Makefile glue to reflect added/removed files.
|
||||
8. Replace your src/contrib/less with the merged copy, and do a ``make
|
||||
17. Replace your src/contrib/less with the merged copy, and do a ``make
|
||||
universe'' to make sure that nothing was broken;
|
||||
9. If everything goes well, do the actual import from v-less:
|
||||
cvs -n import src/contrib/less LESS v<version>
|
||||
Seems everything is fine? Go with:
|
||||
cvs import src/contrib/less LESS v<version>
|
||||
10. Resolve the conflicts with the patchset found in step 5.
|
||||
18. Commit the result.
|
||||
|
||||
delphij@FreeBSD.org - Nov 13th, 2007
|
||||
delphij@FreeBSD.org - May 08, 2009
|
||||
|
@ -2,7 +2,7 @@
|
||||
------------
|
||||
|
||||
Less
|
||||
Copyright (C) 1984-2007 Mark Nudelman
|
||||
Copyright (C) 1984-2008 Mark Nudelman
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
|
@ -14,6 +14,7 @@ CFLAGS = @CFLAGS@
|
||||
CFLAGS_COMPILE_ONLY = -c
|
||||
LDFLAGS = @LDFLAGS@
|
||||
CPPFLAGS = @CPPFLAGS@
|
||||
EXEEXT = @EXEEXT@
|
||||
O=o
|
||||
|
||||
LIBS = @LIBS@
|
||||
@ -49,23 +50,23 @@ OBJ = main.${O} screen.${O} brac.${O} ch.${O} charset.${O} cmdbuf.${O} \
|
||||
output.${O} position.${O} prompt.${O} search.${O} signal.${O} \
|
||||
tags.${O} ttyin.${O} version.${O} @REGEX_O@
|
||||
|
||||
all: less lesskey lessecho
|
||||
all: less$(EXEEXT) lesskey$(EXEEXT) lessecho$(EXEEXT)
|
||||
|
||||
less: ${OBJ}
|
||||
less$(EXEEXT): ${OBJ}
|
||||
${CC} ${LDFLAGS} -o $@ ${OBJ} ${LIBS}
|
||||
|
||||
lesskey: lesskey.${O} version.${O}
|
||||
lesskey$(EXEEXT): lesskey.${O} version.${O}
|
||||
${CC} ${LDFLAGS} -o $@ lesskey.${O} version.${O}
|
||||
|
||||
lessecho: lessecho.${O} version.${O}
|
||||
lessecho$(EXEEXT): lessecho.${O} version.${O}
|
||||
${CC} ${LDFLAGS} -o $@ lessecho.${O} version.${O}
|
||||
|
||||
${OBJ}: ${srcdir}/less.h ${srcdir}/funcs.h defines.h
|
||||
|
||||
install: all ${srcdir}/less.nro ${srcdir}/lesskey.nro ${srcdir}/lessecho.nro installdirs
|
||||
${INSTALL_PROGRAM} less ${DESTDIR}${bindir}/${binprefix}less
|
||||
${INSTALL_PROGRAM} lesskey ${DESTDIR}${bindir}/${binprefix}lesskey
|
||||
${INSTALL_PROGRAM} lessecho ${DESTDIR}${bindir}/${binprefix}lessecho
|
||||
${INSTALL_PROGRAM} less$(EXEEXT) ${DESTDIR}${bindir}/${binprefix}less$(EXEEXT)
|
||||
${INSTALL_PROGRAM} lesskey$(EXEEXT) ${DESTDIR}${bindir}/${binprefix}lesskey$(EXEEXT)
|
||||
${INSTALL_PROGRAM} lessecho$(EXEEXT) ${DESTDIR}${bindir}/${binprefix}lessecho$(EXEEXT)
|
||||
${INSTALL_DATA} ${srcdir}/less.nro ${DESTDIR}${mandir}/man${manext}/${manprefix}less.${manext}
|
||||
${INSTALL_DATA} ${srcdir}/lesskey.nro ${DESTDIR}${mandir}/man${manext}/${manprefix}lesskey.${manext}
|
||||
${INSTALL_DATA} ${srcdir}/lessecho.nro ${DESTDIR}${mandir}/man${manext}/${manprefix}lessecho.${manext}
|
||||
@ -77,9 +78,9 @@ installdirs: mkinstalldirs
|
||||
${srcdir}/mkinstalldirs ${DESTDIR}${bindir} ${DESTDIR}${mandir}/man${manext}
|
||||
|
||||
uninstall:
|
||||
rm -f ${DESTDIR}${bindir}/${binprefix}less
|
||||
rm -f ${DESTDIR}${bindir}/${binprefix}lesskey
|
||||
rm -f ${DESTDIR}${bindir}/${binprefix}lessecho
|
||||
rm -f ${DESTDIR}${bindir}/${binprefix}less$(EXEEXT)
|
||||
rm -f ${DESTDIR}${bindir}/${binprefix}lesskey$(EXEEXT)
|
||||
rm -f ${DESTDIR}${bindir}/${binprefix}lessecho$(EXEEXT)
|
||||
rm -f ${DESTDIR}${mandir}/man${manext}/${manprefix}less.${manext}
|
||||
rm -f ${DESTDIR}${mandir}/man${manext}/${manprefix}lesskey.${manext}
|
||||
rm -f ${DESTDIR}${mandir}/man${manext}/${manprefix}lessecho.${manext}
|
||||
@ -108,7 +109,7 @@ ${srcdir}/configure: ${srcdir}/configure.ac
|
||||
cd ${srcdir}; autoheader; autoconf
|
||||
|
||||
clean:
|
||||
rm -f *.${O} core less lesskey lessecho
|
||||
rm -f *.${O} core less$(EXEEXT) lesskey$(EXEEXT) lessecho$(EXEEXT)
|
||||
|
||||
mostlyclean: clean
|
||||
|
||||
|
@ -12,6 +12,62 @@
|
||||
|
||||
======================================================================
|
||||
|
||||
Major changes between "less" versions 424 and 429
|
||||
|
||||
* LESSOPEN pipe will now be used on standard input, if the LESSOPEN
|
||||
environment variable begins with "|-".
|
||||
|
||||
* The -D option with one number now means use the normal background color.
|
||||
|
||||
* Don't change permissions on history file if it is not a regular file.
|
||||
|
||||
* Fix non-ANSI-compliant code that caused problems with some compilers.
|
||||
|
||||
* Fix binary file detection in UTF-8 mode.
|
||||
|
||||
* Fix display problems with long lines on "ignaw" terminals.
|
||||
|
||||
* Fix problem interrupting the line number calculation for initial prompt.
|
||||
|
||||
* Fix SGR emulation when dealing with multiple attributes (eg. bold+underline).
|
||||
|
||||
* Fix highlight bug when searching for underlined/overstruck text.
|
||||
|
||||
======================================================================
|
||||
|
||||
Major changes between "less" versions 418 and 424
|
||||
|
||||
* New "&" command allows filtering of lines based on a pattern.
|
||||
|
||||
* Status column now displays a search match, even if the matched
|
||||
string is scrolled off screen because -S is in effect.
|
||||
|
||||
* Improve behavior of -F option.
|
||||
|
||||
* Allow CSI character (0x9B) to work in UTF-8 mode.
|
||||
|
||||
* Output carriage return at startup in case terminal doesn't default
|
||||
to column 1.
|
||||
|
||||
* Fix bug in '' (quote, quote) command after G command.
|
||||
|
||||
======================================================================
|
||||
|
||||
Major changes between "less" versions 416 and 418
|
||||
|
||||
* Color escape sequences are now supported in WIN32 build.
|
||||
|
||||
* Makefile now uses EXEEXT feature of autoconf.
|
||||
|
||||
* Fix search bug when using -R and text contains ANSI color escape sequences.
|
||||
|
||||
* Fix crash when using -r with UTF-8 text containing 0x9B bytes.
|
||||
|
||||
* Fix display bug when using ' command to move less than one page forward.
|
||||
|
||||
* Update GPL to version 3.
|
||||
|
||||
======================================================================
|
||||
|
||||
Major changes between "less" versions 409 and 416
|
||||
|
||||
|
@ -1,26 +1,20 @@
|
||||
|
||||
Less, version 416
|
||||
Less, version 429
|
||||
|
||||
This is the distribution of less, version 416, released 22 Nov 2007.
|
||||
This is the distribution of less, version 429, released 11 Apr 2009.
|
||||
This program is part of the GNU project (http://www.gnu.org).
|
||||
|
||||
This program is free software. You may redistribute it and/or
|
||||
modify it under the terms of either:
|
||||
|
||||
1. The GNU General Public License, as published by the Free
|
||||
Software Foundation; either version 2, or (at your option) any
|
||||
Software Foundation; either version 3, or (at your option) any
|
||||
later version. A copy of this license is in the file COPYING.
|
||||
or
|
||||
2. The Less License, in the file LICENSE.
|
||||
|
||||
Please report any problems to bug-less@gnu.org or markn@greenwoodsoftware.com.
|
||||
See http://www.greenwoodsoftware.com/less for the latest info.
|
||||
You may also contact the author at:
|
||||
Mark Nudelman
|
||||
Greenwood Software
|
||||
PO Box 2402
|
||||
El Granada, CA 94018
|
||||
USA
|
||||
|
||||
=========================================================================
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2007 Mark Nudelman
|
||||
* Copyright (C) 1984-2008 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2007 Mark Nudelman
|
||||
* Copyright (C) 1984-2008 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
@ -37,20 +37,19 @@ public int ignore_eoi;
|
||||
* in order from most- to least-recently used.
|
||||
* The circular list is anchored by the file state "thisfile".
|
||||
*/
|
||||
struct bufnode {
|
||||
struct bufnode *next, *prev;
|
||||
struct bufnode *hnext, *hprev;
|
||||
};
|
||||
|
||||
#define LBUFSIZE 8192
|
||||
struct buf {
|
||||
struct buf *next, *prev;
|
||||
struct buf *hnext, *hprev;
|
||||
struct bufnode node;
|
||||
BLOCKNUM block;
|
||||
unsigned int datasize;
|
||||
unsigned char data[LBUFSIZE];
|
||||
};
|
||||
|
||||
struct buflist {
|
||||
/* -- Following members must match struct buf */
|
||||
struct buf *buf_next, *buf_prev;
|
||||
struct buf *buf_hnext, *buf_hprev;
|
||||
};
|
||||
#define bufnode_buf(bn) ((struct buf *) bn)
|
||||
|
||||
/*
|
||||
* The file state is maintained in a filestate structure.
|
||||
@ -58,8 +57,8 @@ struct buflist {
|
||||
*/
|
||||
#define BUFHASH_SIZE 64
|
||||
struct filestate {
|
||||
struct buf *buf_next, *buf_prev;
|
||||
struct buflist hashtbl[BUFHASH_SIZE];
|
||||
struct bufnode buflist;
|
||||
struct bufnode hashtbl[BUFHASH_SIZE];
|
||||
int file;
|
||||
int flags;
|
||||
POSITION fpos;
|
||||
@ -69,8 +68,8 @@ struct filestate {
|
||||
POSITION fsize;
|
||||
};
|
||||
|
||||
#define ch_bufhead thisfile->buf_next
|
||||
#define ch_buftail thisfile->buf_prev
|
||||
#define ch_bufhead thisfile->buflist.next
|
||||
#define ch_buftail thisfile->buflist.prev
|
||||
#define ch_nbufs thisfile->nbufs
|
||||
#define ch_block thisfile->block
|
||||
#define ch_offset thisfile->offset
|
||||
@ -79,23 +78,48 @@ struct filestate {
|
||||
#define ch_flags thisfile->flags
|
||||
#define ch_file thisfile->file
|
||||
|
||||
#define END_OF_CHAIN ((struct buf *)&thisfile->buf_next)
|
||||
#define END_OF_HCHAIN(h) ((struct buf *)&thisfile->hashtbl[h])
|
||||
#define END_OF_CHAIN (&thisfile->buflist)
|
||||
#define END_OF_HCHAIN(h) (&thisfile->hashtbl[h])
|
||||
#define BUFHASH(blk) ((blk) & (BUFHASH_SIZE-1))
|
||||
|
||||
#define FOR_BUFS_IN_CHAIN(h,bp) \
|
||||
for (bp = thisfile->hashtbl[h].buf_hnext; \
|
||||
bp != END_OF_HCHAIN(h); bp = bp->hnext)
|
||||
/*
|
||||
* Macros to manipulate the list of buffers in thisfile->buflist.
|
||||
*/
|
||||
#define FOR_BUFS(bn) \
|
||||
for (bn = ch_bufhead; bn != END_OF_CHAIN; bn = bn->next)
|
||||
|
||||
#define HASH_RM(bp) \
|
||||
(bp)->hnext->hprev = (bp)->hprev; \
|
||||
(bp)->hprev->hnext = (bp)->hnext;
|
||||
#define BUF_RM(bn) \
|
||||
(bn)->next->prev = (bn)->prev; \
|
||||
(bn)->prev->next = (bn)->next;
|
||||
|
||||
#define HASH_INS(bp,h) \
|
||||
(bp)->hnext = thisfile->hashtbl[h].buf_hnext; \
|
||||
(bp)->hprev = END_OF_HCHAIN(h); \
|
||||
thisfile->hashtbl[h].buf_hnext->hprev = (bp); \
|
||||
thisfile->hashtbl[h].buf_hnext = (bp);
|
||||
#define BUF_INS_HEAD(bn) \
|
||||
(bn)->next = ch_bufhead; \
|
||||
(bn)->prev = END_OF_CHAIN; \
|
||||
ch_bufhead->prev = (bn); \
|
||||
ch_bufhead = (bn);
|
||||
|
||||
#define BUF_INS_TAIL(bn) \
|
||||
(bn)->next = END_OF_CHAIN; \
|
||||
(bn)->prev = ch_buftail; \
|
||||
ch_buftail->next = (bn); \
|
||||
ch_buftail = (bn);
|
||||
|
||||
/*
|
||||
* Macros to manipulate the list of buffers in thisfile->hashtbl[n].
|
||||
*/
|
||||
#define FOR_BUFS_IN_CHAIN(h,bn) \
|
||||
for (bn = thisfile->hashtbl[h].hnext; \
|
||||
bn != END_OF_HCHAIN(h); bn = bn->hnext)
|
||||
|
||||
#define BUF_HASH_RM(bn) \
|
||||
(bn)->hnext->hprev = (bn)->hprev; \
|
||||
(bn)->hprev->hnext = (bn)->hnext;
|
||||
|
||||
#define BUF_HASH_INS(bn,h) \
|
||||
(bn)->hnext = thisfile->hashtbl[h].hnext; \
|
||||
(bn)->hprev = END_OF_HCHAIN(h); \
|
||||
thisfile->hashtbl[h].hnext->hprev = (bn); \
|
||||
thisfile->hashtbl[h].hnext = (bn);
|
||||
|
||||
static struct filestate *thisfile;
|
||||
static int ch_ungotchar = -1;
|
||||
@ -119,17 +143,12 @@ static int ch_addbuf();
|
||||
|
||||
/*
|
||||
* Get the character pointed to by the read pointer.
|
||||
* ch_get() is a macro which is more efficient to call
|
||||
* than fch_get (the function), in the usual case
|
||||
* that the block desired is at the head of the chain.
|
||||
*/
|
||||
#define ch_get() ((ch_block == ch_bufhead->block && \
|
||||
ch_offset < ch_bufhead->datasize) ? \
|
||||
ch_bufhead->data[ch_offset] : fch_get())
|
||||
int
|
||||
fch_get()
|
||||
ch_get()
|
||||
{
|
||||
register struct buf *bp;
|
||||
register struct bufnode *bn;
|
||||
register int n;
|
||||
register int slept;
|
||||
register int h;
|
||||
@ -139,52 +158,69 @@ fch_get()
|
||||
if (thisfile == NULL)
|
||||
return (EOI);
|
||||
|
||||
/*
|
||||
* Quick check for the common case where
|
||||
* the desired char is in the head buffer.
|
||||
*/
|
||||
if (ch_bufhead != END_OF_CHAIN)
|
||||
{
|
||||
bp = bufnode_buf(ch_bufhead);
|
||||
if (ch_block == bp->block && ch_offset < bp->datasize)
|
||||
return bp->data[ch_offset];
|
||||
}
|
||||
|
||||
slept = FALSE;
|
||||
|
||||
/*
|
||||
* Look for a buffer holding the desired block.
|
||||
*/
|
||||
h = BUFHASH(ch_block);
|
||||
FOR_BUFS_IN_CHAIN(h, bp)
|
||||
FOR_BUFS_IN_CHAIN(h, bn)
|
||||
{
|
||||
bp = bufnode_buf(bn);
|
||||
if (bp->block == ch_block)
|
||||
{
|
||||
if (ch_offset >= bp->datasize)
|
||||
/*
|
||||
* Need more data in this buffer.
|
||||
*/
|
||||
goto read_more;
|
||||
break;
|
||||
goto found;
|
||||
}
|
||||
}
|
||||
/*
|
||||
* Block is not in a buffer.
|
||||
* Take the least recently used buffer
|
||||
* and read the desired block into it.
|
||||
* If the LRU buffer has data in it,
|
||||
* then maybe allocate a new buffer.
|
||||
*/
|
||||
if (ch_buftail == END_OF_CHAIN || ch_buftail->block != -1)
|
||||
if (bn == END_OF_HCHAIN(h))
|
||||
{
|
||||
/*
|
||||
* There is no empty buffer to use.
|
||||
* Allocate a new buffer if:
|
||||
* 1. We can't seek on this file and -b is not in effect; or
|
||||
* 2. We haven't allocated the max buffers for this file yet.
|
||||
* Block is not in a buffer.
|
||||
* Take the least recently used buffer
|
||||
* and read the desired block into it.
|
||||
* If the LRU buffer has data in it,
|
||||
* then maybe allocate a new buffer.
|
||||
*/
|
||||
if ((autobuf && !(ch_flags & CH_CANSEEK)) ||
|
||||
(maxbufs < 0 || ch_nbufs < maxbufs))
|
||||
if (ch_addbuf())
|
||||
/*
|
||||
* Allocation failed: turn off autobuf.
|
||||
*/
|
||||
autobuf = OPT_OFF;
|
||||
if (ch_buftail == END_OF_CHAIN ||
|
||||
bufnode_buf(ch_buftail)->block != -1)
|
||||
{
|
||||
/*
|
||||
* There is no empty buffer to use.
|
||||
* Allocate a new buffer if:
|
||||
* 1. We can't seek on this file and -b is not in effect; or
|
||||
* 2. We haven't allocated the max buffers for this file yet.
|
||||
*/
|
||||
if ((autobuf && !(ch_flags & CH_CANSEEK)) ||
|
||||
(maxbufs < 0 || ch_nbufs < maxbufs))
|
||||
if (ch_addbuf())
|
||||
/*
|
||||
* Allocation failed: turn off autobuf.
|
||||
*/
|
||||
autobuf = OPT_OFF;
|
||||
}
|
||||
bn = ch_buftail;
|
||||
bp = bufnode_buf(bn);
|
||||
BUF_HASH_RM(bn); /* Remove from old hash chain. */
|
||||
bp->block = ch_block;
|
||||
bp->datasize = 0;
|
||||
BUF_HASH_INS(bn, h); /* Insert into new hash chain. */
|
||||
}
|
||||
bp = ch_buftail;
|
||||
HASH_RM(bp); /* Remove from old hash chain. */
|
||||
bp->block = ch_block;
|
||||
bp->datasize = 0;
|
||||
HASH_INS(bp, h); /* Insert into new hash chain. */
|
||||
|
||||
read_more:
|
||||
pos = (ch_block * LBUFSIZE) + bp->datasize;
|
||||
@ -309,24 +345,20 @@ fch_get()
|
||||
}
|
||||
|
||||
found:
|
||||
if (ch_bufhead != bp)
|
||||
if (ch_bufhead != bn)
|
||||
{
|
||||
/*
|
||||
* Move the buffer to the head of the buffer chain.
|
||||
* This orders the buffer chain, most- to least-recently used.
|
||||
*/
|
||||
bp->next->prev = bp->prev;
|
||||
bp->prev->next = bp->next;
|
||||
bp->next = ch_bufhead;
|
||||
bp->prev = END_OF_CHAIN;
|
||||
ch_bufhead->prev = bp;
|
||||
ch_bufhead = bp;
|
||||
BUF_RM(bn);
|
||||
BUF_INS_HEAD(bn);
|
||||
|
||||
/*
|
||||
* Move to head of hash chain too.
|
||||
*/
|
||||
HASH_RM(bp);
|
||||
HASH_INS(bp, h);
|
||||
BUF_HASH_RM(bn);
|
||||
BUF_HASH_INS(bn, h);
|
||||
}
|
||||
|
||||
if (ch_offset >= bp->datasize)
|
||||
@ -386,6 +418,7 @@ end_logfile()
|
||||
sync_logfile()
|
||||
{
|
||||
register struct buf *bp;
|
||||
register struct bufnode *bn;
|
||||
int warned = FALSE;
|
||||
BLOCKNUM block;
|
||||
BLOCKNUM nblocks;
|
||||
@ -393,24 +426,23 @@ sync_logfile()
|
||||
nblocks = (ch_fpos + LBUFSIZE - 1) / LBUFSIZE;
|
||||
for (block = 0; block < nblocks; block++)
|
||||
{
|
||||
for (bp = ch_bufhead; ; bp = bp->next)
|
||||
int wrote = FALSE;
|
||||
FOR_BUFS(bn)
|
||||
{
|
||||
if (bp == END_OF_CHAIN)
|
||||
{
|
||||
if (!warned)
|
||||
{
|
||||
error("Warning: log file is incomplete",
|
||||
NULL_PARG);
|
||||
warned = TRUE;
|
||||
}
|
||||
break;
|
||||
}
|
||||
bp = bufnode_buf(bn);
|
||||
if (bp->block == block)
|
||||
{
|
||||
write(logfile, (char *) bp->data, bp->datasize);
|
||||
wrote = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!wrote && !warned)
|
||||
{
|
||||
error("Warning: log file is incomplete",
|
||||
NULL_PARG);
|
||||
warned = TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -424,11 +456,13 @@ buffered(block)
|
||||
BLOCKNUM block;
|
||||
{
|
||||
register struct buf *bp;
|
||||
register struct bufnode *bn;
|
||||
register int h;
|
||||
|
||||
h = BUFHASH(block);
|
||||
FOR_BUFS_IN_CHAIN(h, bp)
|
||||
FOR_BUFS_IN_CHAIN(h, bn)
|
||||
{
|
||||
bp = bufnode_buf(bn);
|
||||
if (bp->block == block)
|
||||
return (TRUE);
|
||||
}
|
||||
@ -510,7 +544,8 @@ ch_end_seek()
|
||||
public int
|
||||
ch_beg_seek()
|
||||
{
|
||||
register struct buf *bp, *firstbp;
|
||||
register struct bufnode *bn;
|
||||
register struct bufnode *firstbn;
|
||||
|
||||
/*
|
||||
* Try a plain ch_seek first.
|
||||
@ -522,13 +557,15 @@ ch_beg_seek()
|
||||
* Can't get to position 0.
|
||||
* Look thru the buffers for the one closest to position 0.
|
||||
*/
|
||||
firstbp = bp = ch_bufhead;
|
||||
if (bp == END_OF_CHAIN)
|
||||
firstbn = ch_bufhead;
|
||||
if (firstbn == END_OF_CHAIN)
|
||||
return (1);
|
||||
while ((bp = bp->next) != END_OF_CHAIN)
|
||||
if (bp->block < firstbp->block)
|
||||
firstbp = bp;
|
||||
ch_block = firstbp->block;
|
||||
FOR_BUFS(bn)
|
||||
{
|
||||
if (bufnode_buf(bn)->block < bufnode_buf(firstbn)->block)
|
||||
firstbn = bn;
|
||||
}
|
||||
ch_block = bufnode_buf(firstbn)->block;
|
||||
ch_offset = 0;
|
||||
return (0);
|
||||
}
|
||||
@ -628,7 +665,7 @@ ch_setbufspace(bufspace)
|
||||
public void
|
||||
ch_flush()
|
||||
{
|
||||
register struct buf *bp;
|
||||
register struct bufnode *bn;
|
||||
|
||||
if (thisfile == NULL)
|
||||
return;
|
||||
@ -646,8 +683,10 @@ ch_flush()
|
||||
/*
|
||||
* Initialize all the buffers.
|
||||
*/
|
||||
for (bp = ch_bufhead; bp != END_OF_CHAIN; bp = bp->next)
|
||||
bp->block = -1;
|
||||
FOR_BUFS(bn)
|
||||
{
|
||||
bufnode_buf(bn)->block = -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Figure out the size of the file, if we can.
|
||||
@ -694,6 +733,7 @@ ch_flush()
|
||||
ch_addbuf()
|
||||
{
|
||||
register struct buf *bp;
|
||||
register struct bufnode *bn;
|
||||
|
||||
/*
|
||||
* Allocate and initialize a new buffer and link it
|
||||
@ -704,11 +744,10 @@ ch_addbuf()
|
||||
return (1);
|
||||
ch_nbufs++;
|
||||
bp->block = -1;
|
||||
bp->next = END_OF_CHAIN;
|
||||
bp->prev = ch_buftail;
|
||||
ch_buftail->next = bp;
|
||||
ch_buftail = bp;
|
||||
HASH_INS(bp, 0);
|
||||
bn = &bp->node;
|
||||
|
||||
BUF_INS_TAIL(bn);
|
||||
BUF_HASH_INS(bn, 0);
|
||||
return (0);
|
||||
}
|
||||
|
||||
@ -722,8 +761,8 @@ init_hashtbl()
|
||||
|
||||
for (h = 0; h < BUFHASH_SIZE; h++)
|
||||
{
|
||||
thisfile->hashtbl[h].buf_hnext = END_OF_HCHAIN(h);
|
||||
thisfile->hashtbl[h].buf_hprev = END_OF_HCHAIN(h);
|
||||
thisfile->hashtbl[h].hnext = END_OF_HCHAIN(h);
|
||||
thisfile->hashtbl[h].hprev = END_OF_HCHAIN(h);
|
||||
}
|
||||
}
|
||||
|
||||
@ -733,14 +772,13 @@ init_hashtbl()
|
||||
static void
|
||||
ch_delbufs()
|
||||
{
|
||||
register struct buf *bp;
|
||||
register struct bufnode *bn;
|
||||
|
||||
while (ch_bufhead != END_OF_CHAIN)
|
||||
{
|
||||
bp = ch_bufhead;
|
||||
bp->next->prev = bp->prev;
|
||||
bp->prev->next = bp->next;
|
||||
free(bp);
|
||||
bn = ch_bufhead;
|
||||
BUF_RM(bn);
|
||||
free(bufnode_buf(bn));
|
||||
}
|
||||
ch_nbufs = 0;
|
||||
init_hashtbl();
|
||||
@ -786,7 +824,7 @@ ch_init(f, flags)
|
||||
*/
|
||||
thisfile = (struct filestate *)
|
||||
calloc(1, sizeof(struct filestate));
|
||||
thisfile->buf_next = thisfile->buf_prev = END_OF_CHAIN;
|
||||
thisfile->buflist.next = thisfile->buflist.prev = END_OF_CHAIN;
|
||||
thisfile->nbufs = 0;
|
||||
thisfile->flags = 0;
|
||||
thisfile->fpos = 0;
|
||||
@ -867,6 +905,7 @@ ch_getflags()
|
||||
ch_dump(struct filestate *fs)
|
||||
{
|
||||
struct buf *bp;
|
||||
struct bufnode *bn;
|
||||
unsigned char *s;
|
||||
|
||||
if (fs == NULL)
|
||||
@ -878,8 +917,9 @@ ch_dump(struct filestate *fs)
|
||||
fs->file, fs->flags, fs->fpos,
|
||||
fs->fsize, fs->block, fs->offset);
|
||||
printf(" %d bufs:\n", fs->nbufs);
|
||||
for (bp = fs->buf_next; bp != (struct buf *)fs; bp = bp->next)
|
||||
for (bn = fs->next; bn != &fs->buflist; bn = bn->next)
|
||||
{
|
||||
bp = bufnode_buf(bn);
|
||||
printf("%x: blk %x, size %x \"",
|
||||
bp, bp->block, bp->datasize);
|
||||
for (s = bp->data; s < bp->data + 30; s++)
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2007 Mark Nudelman
|
||||
* Copyright (C) 1984-2008 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
@ -393,8 +393,10 @@ init_charset()
|
||||
*/
|
||||
public int
|
||||
binary_char(c)
|
||||
unsigned char c;
|
||||
LWCHAR c;
|
||||
{
|
||||
if (utf_mode)
|
||||
return (is_ubin_char(c));
|
||||
c &= 0377;
|
||||
return (chardef[c] & IS_BINARY_CHAR);
|
||||
}
|
||||
@ -404,7 +406,7 @@ binary_char(c)
|
||||
*/
|
||||
public int
|
||||
control_char(c)
|
||||
int c;
|
||||
LWCHAR c;
|
||||
{
|
||||
c &= 0377;
|
||||
return (chardef[c] & IS_CONTROL_CHAR);
|
||||
@ -416,7 +418,7 @@ control_char(c)
|
||||
*/
|
||||
public char *
|
||||
prchar(c)
|
||||
int c;
|
||||
LWCHAR c;
|
||||
{
|
||||
/* {{ This buffer can be overrun if LESSBINFMT is a long string. }} */
|
||||
static char buf[32];
|
||||
@ -811,7 +813,11 @@ static struct wchar_range comb_table[] = {
|
||||
* dated 2005-11-30T00:58:48Z
|
||||
*/
|
||||
static struct wchar_range ubin_table[] = {
|
||||
{ 0x0000, 0x001F} /* Cc */, { 0x007F, 0x009F} /* Cc */,
|
||||
{ 0x0000, 0x0007} /* Cc */,
|
||||
{ 0x000B, 0x000C} /* Cc */,
|
||||
{ 0x000E, 0x001A} /* Cc */,
|
||||
{ 0x001C, 0x001F} /* Cc */,
|
||||
{ 0x007F, 0x009F} /* Cc */,
|
||||
#if 0
|
||||
{ 0x00AD, 0x00AD} /* Cf */,
|
||||
#endif
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2005-2007 Mark Nudelman
|
||||
* Copyright (C) 2005-2008 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2007 Mark Nudelman
|
||||
* Copyright (C) 1984-2008 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
@ -65,6 +65,7 @@
|
||||
#define A_REMOVE_FILE 52
|
||||
#define A_NEXT_TAG 53
|
||||
#define A_PREV_TAG 54
|
||||
#define A_FILTER 55
|
||||
|
||||
#define A_INVALID 100
|
||||
#define A_NOACTION 101
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2007 Mark Nudelman
|
||||
* Copyright (C) 1984-2008 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
@ -662,12 +662,14 @@ set_mlist(mlist, cmdflags)
|
||||
void *mlist;
|
||||
int cmdflags;
|
||||
{
|
||||
#if CMD_HISTORY
|
||||
curr_mlist = (struct mlist *) mlist;
|
||||
curr_cmdflags = cmdflags;
|
||||
|
||||
/* Make sure the next up-arrow moves to the last string in the mlist. */
|
||||
if (curr_mlist != NULL)
|
||||
curr_mlist->curr_mp = curr_mlist;
|
||||
#endif
|
||||
}
|
||||
|
||||
#if CMD_HISTORY
|
||||
@ -1303,6 +1305,7 @@ get_cmdbuf()
|
||||
return (cmdbuf);
|
||||
}
|
||||
|
||||
#if CMD_HISTORY
|
||||
/*
|
||||
* Return the last (most recent) string in the current command history.
|
||||
*/
|
||||
@ -1313,6 +1316,7 @@ cmd_lastpattern()
|
||||
return (NULL);
|
||||
return (curr_mlist->curr_mp->prev->string);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if CMD_HISTORY
|
||||
/*
|
||||
@ -1465,8 +1469,19 @@ save_cmdhist()
|
||||
if (f == NULL)
|
||||
return;
|
||||
#if HAVE_FCHMOD
|
||||
{
|
||||
/* Make history file readable only by owner. */
|
||||
fchmod(fileno(f), 0600);
|
||||
int do_chmod = 1;
|
||||
#if HAVE_STAT
|
||||
struct stat statbuf;
|
||||
int r = fstat(fileno(f), &statbuf);
|
||||
if (r < 0 || !S_ISREG(statbuf.st_mode))
|
||||
/* Don't chmod if not a regular file. */
|
||||
do_chmod = 0;
|
||||
#endif
|
||||
if (do_chmod)
|
||||
fchmod(fileno(f), 0600);
|
||||
}
|
||||
#endif
|
||||
|
||||
fprintf(f, "%s\n", HISTFILE_FIRST_LINE);
|
||||
|
@ -1,6 +1,6 @@
|
||||
/* $FreeBSD$ */
|
||||
/*
|
||||
* Copyright (C) 1984-2007 Mark Nudelman
|
||||
* Copyright (C) 1984-2008 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
@ -26,7 +26,6 @@ extern int erase_char, erase2_char, kill_char;
|
||||
extern int sigs;
|
||||
extern int quit_if_one_screen;
|
||||
extern int squished;
|
||||
extern int hit_eof;
|
||||
extern int sc_width;
|
||||
extern int sc_height;
|
||||
extern int swindow;
|
||||
@ -86,7 +85,9 @@ static void multi_search();
|
||||
static void
|
||||
cmd_exec()
|
||||
{
|
||||
#if HILITE_SEARCH
|
||||
clear_attn();
|
||||
#endif
|
||||
clear_bot();
|
||||
flush();
|
||||
}
|
||||
@ -120,6 +121,11 @@ in_mca()
|
||||
static void
|
||||
mca_search()
|
||||
{
|
||||
#if HILITE_SEARCH
|
||||
if (search_type & SRCH_FILTER)
|
||||
mca = A_FILTER;
|
||||
else
|
||||
#endif
|
||||
if (search_type & SRCH_FORW)
|
||||
mca = A_F_SEARCH;
|
||||
else
|
||||
@ -139,6 +145,11 @@ mca_search()
|
||||
if (search_type & SRCH_NO_REGEX)
|
||||
cmd_putstr("Regex-off ");
|
||||
|
||||
#if HILITE_SEARCH
|
||||
if (search_type & SRCH_FILTER)
|
||||
cmd_putstr("&/");
|
||||
else
|
||||
#endif
|
||||
if (search_type & SRCH_FORW)
|
||||
cmd_putstr("/");
|
||||
else
|
||||
@ -197,6 +208,12 @@ exec_mca()
|
||||
case A_B_SEARCH:
|
||||
multi_search(cbuf, (int) number);
|
||||
break;
|
||||
#if HILITE_SEARCH
|
||||
case A_FILTER:
|
||||
search_type ^= SRCH_NO_MATCH;
|
||||
set_filter_pattern(cbuf, search_type);
|
||||
break;
|
||||
#endif
|
||||
case A_FIRSTCMD:
|
||||
/*
|
||||
* Skip leading spaces or + signs in the string.
|
||||
@ -469,6 +486,7 @@ mca_char(c)
|
||||
|
||||
case A_F_SEARCH:
|
||||
case A_B_SEARCH:
|
||||
case A_FILTER:
|
||||
/*
|
||||
* Special case for search commands.
|
||||
* Certain characters as the first char of
|
||||
@ -490,16 +508,19 @@ mca_char(c)
|
||||
if (less_is_more)
|
||||
break;
|
||||
case CONTROL('E'): /* ignore END of file */
|
||||
flag = SRCH_PAST_EOF;
|
||||
if (mca != A_FILTER)
|
||||
flag = SRCH_PAST_EOF;
|
||||
break;
|
||||
case '@':
|
||||
if (less_is_more)
|
||||
break;
|
||||
case CONTROL('F'): /* FIRST file */
|
||||
flag = SRCH_FIRST_FILE;
|
||||
if (mca != A_FILTER)
|
||||
flag = SRCH_FIRST_FILE;
|
||||
break;
|
||||
case CONTROL('K'): /* KEEP position */
|
||||
flag = SRCH_NO_MOVE;
|
||||
if (mca != A_FILTER)
|
||||
flag = SRCH_NO_MOVE;
|
||||
break;
|
||||
case CONTROL('R'): /* Don't use REGULAR EXPRESSIONS */
|
||||
flag = SRCH_NO_REGEX;
|
||||
@ -636,25 +657,20 @@ prompt()
|
||||
bottompos = position(BOTTOM_PLUS_ONE);
|
||||
|
||||
/*
|
||||
* If we've hit EOF on the last file, and the -E flag is set
|
||||
* (or -F is set and this is the first prompt), then quit.
|
||||
* {{ Relying on "first prompt" to detect a single-screen file
|
||||
* fails if +G is used, for example. }}
|
||||
* If we've hit EOF on the last file and the -E flag is set, quit.
|
||||
*/
|
||||
if ((get_quit_at_eof() == OPT_ONPLUS || quit_if_one_screen) &&
|
||||
hit_eof && !(ch_getflags() & CH_HELPFILE) &&
|
||||
if (get_quit_at_eof() == OPT_ONPLUS &&
|
||||
eof_displayed() && !(ch_getflags() & CH_HELPFILE) &&
|
||||
next_ifile(curr_ifile) == NULL_IFILE)
|
||||
quit(QUIT_OK);
|
||||
quit_if_one_screen = FALSE;
|
||||
#if 0 /* This doesn't work well because some "te"s clear the screen. */
|
||||
|
||||
/*
|
||||
* If the -e flag is set and we've hit EOF on the last file,
|
||||
* and the file is squished (shorter than the screen), quit.
|
||||
* If the entire file is displayed and the -F flag is set, quit.
|
||||
*/
|
||||
if (get_quit_at_eof() && squished &&
|
||||
if (quit_if_one_screen &&
|
||||
entire_file_displayed() && !(ch_getflags() & CH_HELPFILE) &&
|
||||
next_ifile(curr_ifile) == NULL_IFILE)
|
||||
quit(QUIT_OK);
|
||||
#endif
|
||||
|
||||
#if MSDOS_COMPILER==WIN32C
|
||||
/*
|
||||
@ -681,6 +697,8 @@ prompt()
|
||||
clear_cmd();
|
||||
forw_prompt = 0;
|
||||
p = pr_string();
|
||||
if (is_filtering())
|
||||
putstr("& ");
|
||||
if (p == NULL || *p == '\0')
|
||||
putchr(':');
|
||||
else
|
||||
@ -1137,7 +1155,6 @@ commands()
|
||||
cmd_exec();
|
||||
jump_forw();
|
||||
ignore_eoi = 1;
|
||||
hit_eof = 0;
|
||||
while (!sigs)
|
||||
{
|
||||
make_display();
|
||||
@ -1314,6 +1331,17 @@ commands()
|
||||
c = getcc();
|
||||
goto again;
|
||||
|
||||
case A_FILTER:
|
||||
#if HILITE_SEARCH
|
||||
search_type = SRCH_FORW | SRCH_FILTER;
|
||||
mca_search();
|
||||
c = getcc();
|
||||
goto again;
|
||||
#else
|
||||
error("Command not available", NULL_PARG);
|
||||
break;
|
||||
#endif
|
||||
|
||||
case A_AGAIN_SEARCH:
|
||||
/*
|
||||
* Repeat previous search.
|
||||
@ -1438,7 +1466,7 @@ commands()
|
||||
number = 1;
|
||||
if (edit_next((int) number))
|
||||
{
|
||||
if (get_quit_at_eof() && hit_eof &&
|
||||
if (get_quit_at_eof() && eof_displayed() &&
|
||||
!(ch_getflags() & CH_HELPFILE))
|
||||
quit(QUIT_OK);
|
||||
parg.p_string = (number > 1) ? "(N-th) " : "";
|
||||
@ -1602,6 +1630,7 @@ commands()
|
||||
if (c == erase_char || c == erase2_char ||
|
||||
c == kill_char || c == '\n' || c == '\r')
|
||||
break;
|
||||
cmd_exec();
|
||||
gomark(c);
|
||||
break;
|
||||
|
||||
|
3445
contrib/less/configure
vendored
3445
contrib/less/configure
vendored
File diff suppressed because it is too large
Load Diff
@ -1,6 +1,6 @@
|
||||
# Process this file with autoconf to produce a configure script.
|
||||
|
||||
# Copyright (C) 1984-2007 Mark Nudelman
|
||||
# Copyright (C) 1984-2008 Mark Nudelman
|
||||
#
|
||||
# You may distribute under the terms of either the GNU General Public
|
||||
# License or the Less License, as specified in the README file.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2007 Mark Nudelman
|
||||
* Copyright (C) 1984-2008 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
@ -133,6 +133,7 @@ static unsigned char cmdtable[] =
|
||||
ESC,'n',0, A_T_AGAIN_SEARCH,
|
||||
'N',0, A_REVERSE_SEARCH,
|
||||
ESC,'N',0, A_T_REVERSE_SEARCH,
|
||||
'&',0, A_FILTER,
|
||||
'm',0, A_SETMARK,
|
||||
'\'',0, A_GOMARK,
|
||||
CONTROL('X'),CONTROL('X'),0, A_GOMARK,
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2007 Mark Nudelman
|
||||
* Copyright (C) 1984-2008 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2007 Mark Nudelman
|
||||
* Copyright (C) 1984-2008 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2007 Mark Nudelman
|
||||
* Copyright (C) 1984-2008 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2007 Mark Nudelman
|
||||
* Copyright (C) 1984-2008 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2007 Mark Nudelman
|
||||
* Copyright (C) 1984-2008 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2007 Mark Nudelman
|
||||
* Copyright (C) 1984-2008 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
@ -52,6 +52,7 @@ extern int force_open;
|
||||
extern int secure;
|
||||
extern int use_lessopen;
|
||||
extern int ctldisp;
|
||||
extern int utf_mode;
|
||||
extern IFILE curr_ifile;
|
||||
extern IFILE old_ifile;
|
||||
#if SPACES_IN_FILENAMES
|
||||
@ -469,23 +470,26 @@ fcomplete(s)
|
||||
bin_file(f)
|
||||
int f;
|
||||
{
|
||||
int i;
|
||||
int n;
|
||||
int bin_count = 0;
|
||||
unsigned char data[256];
|
||||
char data[256];
|
||||
char* p;
|
||||
char* pend;
|
||||
|
||||
if (!seekable(f))
|
||||
return (0);
|
||||
if (lseek(f, (off_t)0, SEEK_SET) == BAD_LSEEK)
|
||||
return (0);
|
||||
n = read(f, data, sizeof(data));
|
||||
for (i = 0; i < n; i++)
|
||||
pend = &data[n];
|
||||
for (p = data; p < pend; )
|
||||
{
|
||||
char c = data[i];
|
||||
LWCHAR c = step_char(&p, +1, pend);
|
||||
if (ctldisp == OPT_ONPLUS && IS_CSI_START(c))
|
||||
{
|
||||
while (++i < n && is_ansi_middle(data[i]))
|
||||
continue;
|
||||
do {
|
||||
c = step_char(&p, +1, pend);
|
||||
} while (p < pend && is_ansi_middle(c));
|
||||
} else if (binary_char(c))
|
||||
bin_count++;
|
||||
}
|
||||
@ -827,20 +831,27 @@ open_altfile(filename, pf, pfd)
|
||||
ch_ungetchar(-1);
|
||||
if ((lessopen = lgetenv("LESSOPEN")) == NULL)
|
||||
return (NULL);
|
||||
if (strcmp(filename, "-") == 0)
|
||||
return (NULL);
|
||||
if (*lessopen == '|')
|
||||
{
|
||||
/*
|
||||
* If LESSOPEN starts with a |, it indicates
|
||||
* a "pipe preprocessor".
|
||||
*/
|
||||
#if HAVE_FILENO
|
||||
lessopen++;
|
||||
returnfd = 1;
|
||||
#else
|
||||
#if !HAVE_FILENO
|
||||
error("LESSOPEN pipe is not supported", NULL_PARG);
|
||||
return (NULL);
|
||||
#else
|
||||
lessopen++;
|
||||
returnfd = 1;
|
||||
if (*lessopen == '-') {
|
||||
/*
|
||||
* Lessopen preprocessor will accept "-" as a filename.
|
||||
*/
|
||||
lessopen++;
|
||||
} else {
|
||||
if (strcmp(filename, "-") == 0)
|
||||
return (NULL);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
/* $FreeBSD$ */
|
||||
/*
|
||||
* Copyright (C) 1984-2007 Mark Nudelman
|
||||
* Copyright (C) 1984-2008 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
@ -18,7 +18,6 @@
|
||||
#include "less.h"
|
||||
#include "position.h"
|
||||
|
||||
public int hit_eof; /* Keeps track of how many times we hit end of file */
|
||||
public int screen_trashed;
|
||||
public int squished;
|
||||
public int no_back_scroll = 0;
|
||||
@ -53,25 +52,47 @@ eof_bell()
|
||||
}
|
||||
|
||||
/*
|
||||
* Check to see if the end of file is currently "displayed".
|
||||
* Check to see if the end of file is currently displayed.
|
||||
*/
|
||||
static void
|
||||
eof_check()
|
||||
public int
|
||||
eof_displayed()
|
||||
{
|
||||
POSITION pos;
|
||||
|
||||
if (ignore_eoi)
|
||||
return;
|
||||
if (ABORT_SIGS())
|
||||
return;
|
||||
return (0);
|
||||
|
||||
if (ch_length() == NULL_POSITION)
|
||||
/*
|
||||
* If the file length is not known,
|
||||
* we can't possibly be displaying EOF.
|
||||
*/
|
||||
return (0);
|
||||
|
||||
/*
|
||||
* If the bottom line is empty, we are at EOF.
|
||||
* If the bottom line ends at the file length,
|
||||
* we must be just at EOF.
|
||||
*/
|
||||
pos = position(BOTTOM_PLUS_ONE);
|
||||
if (pos == NULL_POSITION || pos == ch_length())
|
||||
hit_eof++;
|
||||
return (pos == NULL_POSITION || pos == ch_length());
|
||||
}
|
||||
|
||||
/*
|
||||
* Check to see if the entire file is currently displayed.
|
||||
*/
|
||||
public int
|
||||
entire_file_displayed()
|
||||
{
|
||||
POSITION pos;
|
||||
|
||||
/* Make sure last line of file is displayed. */
|
||||
if (!eof_displayed())
|
||||
return (0);
|
||||
|
||||
/* Make sure first line of file is displayed. */
|
||||
pos = position(0);
|
||||
return (pos == NULL_POSITION || pos == 0);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -256,12 +277,6 @@ forw(n, pos, force, only_last, nblank)
|
||||
forw_prompt = 1;
|
||||
}
|
||||
|
||||
if (ignore_eoi)
|
||||
hit_eof = 0;
|
||||
else if (eof && !ABORT_SIGS())
|
||||
hit_eof++;
|
||||
else
|
||||
eof_check();
|
||||
if (nlines == 0)
|
||||
eof_bell();
|
||||
else if (do_repaint)
|
||||
@ -285,7 +300,6 @@ back(n, pos, force, only_last)
|
||||
|
||||
squish_check();
|
||||
do_repaint = (n > get_back_scroll() || (only_last && n > sc_height-1));
|
||||
hit_eof = 0;
|
||||
while (--n >= 0)
|
||||
{
|
||||
/*
|
||||
@ -314,7 +328,6 @@ back(n, pos, force, only_last)
|
||||
}
|
||||
}
|
||||
|
||||
eof_check();
|
||||
if (nlines == 0)
|
||||
eof_bell();
|
||||
else if (do_repaint)
|
||||
@ -336,7 +349,7 @@ forward(n, force, only_last)
|
||||
{
|
||||
POSITION pos;
|
||||
|
||||
if (get_quit_at_eof() && hit_eof && !(ch_getflags() & CH_HELPFILE))
|
||||
if (get_quit_at_eof() && eof_displayed() && !(ch_getflags() & CH_HELPFILE))
|
||||
{
|
||||
/*
|
||||
* If the -e flag is set and we're trying to go
|
||||
@ -370,7 +383,6 @@ forward(n, force, only_last)
|
||||
} else
|
||||
{
|
||||
eof_bell();
|
||||
hit_eof++;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -30,6 +30,8 @@
|
||||
public void backspace ();
|
||||
public void putbs ();
|
||||
public char WIN32getch ();
|
||||
public void WIN32setcolors ();
|
||||
public void WIN32textout ();
|
||||
public void match_brac ();
|
||||
public void ch_ungetchar ();
|
||||
public void end_logfile ();
|
||||
@ -122,6 +124,8 @@
|
||||
public char * bad_file ();
|
||||
public POSITION filesize ();
|
||||
public char * shell_coption ();
|
||||
public int eof_displayed ();
|
||||
public int entire_file_displayed ();
|
||||
public void squish_check ();
|
||||
public void forw ();
|
||||
public void back ();
|
||||
@ -164,6 +168,7 @@
|
||||
public int pappend ();
|
||||
public int pflushmbc ();
|
||||
public void pdone ();
|
||||
public void set_status_col ();
|
||||
public int gline ();
|
||||
public void null_line ();
|
||||
public POSITION forw_raw_line ();
|
||||
@ -246,12 +251,17 @@
|
||||
public void repaint_hilite ();
|
||||
public void clear_attn ();
|
||||
public void undo_search ();
|
||||
public void clr_hlist ();
|
||||
public void clr_hilite ();
|
||||
public void clr_filter ();
|
||||
public int is_filtered ();
|
||||
public int is_hilited ();
|
||||
public void chg_caseless ();
|
||||
public void chg_hilite ();
|
||||
public int search ();
|
||||
public void prep_hilite ();
|
||||
public void set_filter_pattern ();
|
||||
public int is_filtering ();
|
||||
public RETSIGTYPE winch ();
|
||||
public RETSIGTYPE winch ();
|
||||
public void init_signals ();
|
||||
|
@ -41,6 +41,7 @@ constant char helpdata[] = {
|
||||
' ',' ','E','S','C','-','n',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','*',' ',' ','R','e','p','e','a','t',' ','p','r','e','v','i','o','u','s',' ','s','e','a','r','c','h',',',' ','s','p','a','n','n','i','n','g',' ','f','i','l','e','s','.','\n',
|
||||
' ',' ','E','S','C','-','N',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','*',' ',' ','R','e','p','e','a','t',' ','p','r','e','v','i','o','u','s',' ','s','e','a','r','c','h',',',' ','r','e','v','e','r','s','e',' ','d','i','r','.',' ','&',' ','s','p','a','n','n','i','n','g',' ','f','i','l','e','s','.','\n',
|
||||
' ',' ','E','S','C','-','u',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','U','n','d','o',' ','(','t','o','g','g','l','e',')',' ','s','e','a','r','c','h',' ','h','i','g','h','l','i','g','h','t','i','n','g','.','\n',
|
||||
' ',' ','&','_','\b','p','_','\b','a','_','\b','t','_','\b','t','_','\b','e','_','\b','r','_','\b','n',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','*',' ',' ','D','i','s','p','l','a','y',' ','o','n','l','y',' ','m','a','t','c','h','i','n','g',' ','l','i','n','e','s','\n',
|
||||
' ',' ',' ',' ',' ',' ',' ',' ','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','\n',
|
||||
' ',' ',' ',' ',' ',' ',' ',' ','S','e','a','r','c','h',' ','p','a','t','t','e','r','n','s',' ','m','a','y',' ','b','e',' ','m','o','d','i','f','i','e','d',' ','b','y',' ','o','n','e',' ','o','r',' ','m','o','r','e',' ','o','f',':','\n',
|
||||
' ',' ',' ',' ',' ',' ',' ',' ','^','N',' ','o','r',' ','!',' ',' ','S','e','a','r','c','h',' ','f','o','r',' ','N','O','N','-','m','a','t','c','h','i','n','g',' ','l','i','n','e','s','.','\n',
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2007 Mark Nudelman
|
||||
* Copyright (C) 1984-2008 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2007 Mark Nudelman
|
||||
* Copyright (C) 1984-2008 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
@ -53,13 +53,14 @@ forw_line(curr_pos)
|
||||
int endline;
|
||||
int backchars;
|
||||
|
||||
get_forw_line:
|
||||
if (curr_pos == NULL_POSITION)
|
||||
{
|
||||
null_line();
|
||||
return (NULL_POSITION);
|
||||
}
|
||||
#if HILITE_SEARCH
|
||||
if (hilite_search == OPT_ONPLUS || status_col)
|
||||
if (hilite_search == OPT_ONPLUS || is_filtering() || status_col)
|
||||
/*
|
||||
* If we are ignoring EOI (command F), only prepare
|
||||
* one line ahead, to avoid getting stuck waiting for
|
||||
@ -76,6 +77,9 @@ forw_line(curr_pos)
|
||||
return (NULL_POSITION);
|
||||
}
|
||||
|
||||
/*
|
||||
* Step back to the beginning of the line.
|
||||
*/
|
||||
base_pos = curr_pos;
|
||||
for (;;)
|
||||
{
|
||||
@ -95,10 +99,14 @@ forw_line(curr_pos)
|
||||
--base_pos;
|
||||
}
|
||||
|
||||
/*
|
||||
* Read forward again to the position we should start at.
|
||||
*/
|
||||
prewind();
|
||||
plinenum(base_pos);
|
||||
(void) ch_seek(base_pos);
|
||||
while (base_pos < curr_pos)
|
||||
new_pos = base_pos;
|
||||
while (new_pos < curr_pos)
|
||||
{
|
||||
if (ABORT_SIGS())
|
||||
{
|
||||
@ -106,12 +114,12 @@ forw_line(curr_pos)
|
||||
return (NULL_POSITION);
|
||||
}
|
||||
c = ch_forw_get();
|
||||
backchars = pappend(c, base_pos);
|
||||
base_pos++;
|
||||
backchars = pappend(c, new_pos);
|
||||
new_pos++;
|
||||
if (backchars > 0)
|
||||
{
|
||||
pshift_all();
|
||||
base_pos -= backchars;
|
||||
new_pos -= backchars;
|
||||
while (--backchars >= 0)
|
||||
(void) ch_back_get();
|
||||
}
|
||||
@ -119,6 +127,9 @@ forw_line(curr_pos)
|
||||
(void) pflushmbc();
|
||||
pshift_all();
|
||||
|
||||
/*
|
||||
* Read the first character to display.
|
||||
*/
|
||||
c = ch_forw_get();
|
||||
if (c == EOI)
|
||||
{
|
||||
@ -127,6 +138,9 @@ forw_line(curr_pos)
|
||||
}
|
||||
blankline = (c == '\n' || c == '\r');
|
||||
|
||||
/*
|
||||
* Read each character in the line and append to the line buffer.
|
||||
*/
|
||||
for (;;)
|
||||
{
|
||||
if (ABORT_SIGS())
|
||||
@ -181,7 +195,23 @@ forw_line(curr_pos)
|
||||
}
|
||||
c = ch_forw_get();
|
||||
}
|
||||
pdone(endline);
|
||||
|
||||
pdone(endline, c);
|
||||
|
||||
#if HILITE_SEARCH
|
||||
if (is_filtered(base_pos))
|
||||
{
|
||||
/*
|
||||
* We don't want to display this line.
|
||||
* Get the next line.
|
||||
*/
|
||||
curr_pos = new_pos;
|
||||
goto get_forw_line;
|
||||
}
|
||||
|
||||
if (status_col && is_hilited(base_pos, ch_tell()-1, 1, NULL))
|
||||
set_status_col('*');
|
||||
#endif
|
||||
|
||||
if (squeeze && blankline)
|
||||
{
|
||||
@ -215,18 +245,19 @@ forw_line(curr_pos)
|
||||
back_line(curr_pos)
|
||||
POSITION curr_pos;
|
||||
{
|
||||
POSITION new_pos, begin_new_pos;
|
||||
POSITION new_pos, begin_new_pos, base_pos;
|
||||
int c;
|
||||
int endline;
|
||||
int backchars;
|
||||
|
||||
get_back_line:
|
||||
if (curr_pos == NULL_POSITION || curr_pos <= ch_zero())
|
||||
{
|
||||
null_line();
|
||||
return (NULL_POSITION);
|
||||
}
|
||||
#if HILITE_SEARCH
|
||||
if (hilite_search == OPT_ONPLUS || status_col)
|
||||
if (hilite_search == OPT_ONPLUS || is_filtering() || status_col)
|
||||
prep_hilite((curr_pos < 3*size_linebuf) ?
|
||||
0 : curr_pos - 3*size_linebuf, curr_pos, -1);
|
||||
#endif
|
||||
@ -241,9 +272,9 @@ back_line(curr_pos)
|
||||
/*
|
||||
* Find out if the "current" line was blank.
|
||||
*/
|
||||
(void) ch_forw_get(); /* Skip the newline */
|
||||
c = ch_forw_get(); /* First char of "current" line */
|
||||
(void) ch_back_get(); /* Restore our position */
|
||||
(void) ch_forw_get(); /* Skip the newline */
|
||||
c = ch_forw_get(); /* First char of "current" line */
|
||||
(void) ch_back_get(); /* Restore our position */
|
||||
(void) ch_back_get();
|
||||
|
||||
if (c == '\n' || c == '\r')
|
||||
@ -285,7 +316,7 @@ back_line(curr_pos)
|
||||
* This is the newline ending the previous line.
|
||||
* We have hit the beginning of the line.
|
||||
*/
|
||||
new_pos = ch_tell() + 1;
|
||||
base_pos = ch_tell() + 1;
|
||||
break;
|
||||
}
|
||||
if (c == EOI)
|
||||
@ -295,7 +326,7 @@ back_line(curr_pos)
|
||||
* This must be the first line in the file.
|
||||
* This must, of course, be the beginning of the line.
|
||||
*/
|
||||
new_pos = ch_tell();
|
||||
base_pos = ch_tell();
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -309,6 +340,7 @@ back_line(curr_pos)
|
||||
* are much longer than the screen width,
|
||||
* but I don't know of any better way. }}
|
||||
*/
|
||||
new_pos = base_pos;
|
||||
if (ch_seek(new_pos))
|
||||
{
|
||||
null_line();
|
||||
@ -366,7 +398,22 @@ back_line(curr_pos)
|
||||
}
|
||||
} while (new_pos < curr_pos);
|
||||
|
||||
pdone(endline);
|
||||
pdone(endline, ch_forw_get());
|
||||
|
||||
#if HILITE_SEARCH
|
||||
if (is_filtered(base_pos))
|
||||
{
|
||||
/*
|
||||
* We don't want to display this line.
|
||||
* Get the previous line.
|
||||
*/
|
||||
curr_pos = begin_new_pos;
|
||||
goto get_back_line;
|
||||
}
|
||||
|
||||
if (status_col && is_hilited(base_pos, ch_tell()-1, 1, NULL))
|
||||
set_status_col('*');
|
||||
#endif
|
||||
|
||||
return (begin_new_pos);
|
||||
}
|
||||
|
@ -97,7 +97,7 @@ fi
|
||||
# Make a temp file name in the proper directory.
|
||||
|
||||
dstdir=`dirname $dst`
|
||||
dsttmp=$dstdir/#inst.$$#
|
||||
dsttmp=$dstdir/_inst.$$_
|
||||
|
||||
# Move or copy the file name to the temp name
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2007 Mark Nudelman
|
||||
* Copyright (C) 1984-2008 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
@ -16,7 +16,6 @@
|
||||
#include "less.h"
|
||||
#include "position.h"
|
||||
|
||||
extern int hit_eof;
|
||||
extern int jump_sline;
|
||||
extern int squished;
|
||||
extern int screen_trashed;
|
||||
@ -38,6 +37,12 @@ jump_forw()
|
||||
error("Cannot seek to end of file", NULL_PARG);
|
||||
return;
|
||||
}
|
||||
/*
|
||||
* Note; lastmark will be called later by jump_loc, but it fails
|
||||
* because the position table has been cleared by pos_clear below.
|
||||
* So call it here before calling pos_clear.
|
||||
*/
|
||||
lastmark();
|
||||
/*
|
||||
* Position the last line in the file at the last screen line.
|
||||
* Go back one line from the end of the file
|
||||
@ -194,8 +199,10 @@ jump_loc(pos, sline)
|
||||
forw(nline, position(BOTTOM_PLUS_ONE), 1, 0, 0);
|
||||
else
|
||||
back(-nline, position(TOP), 1, 0);
|
||||
#if HILITE_SEARCH
|
||||
if (show_attn)
|
||||
repaint_hilite(1);
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
@ -233,8 +240,10 @@ jump_loc(pos, sline)
|
||||
* that we can just scroll there after all.
|
||||
*/
|
||||
forw(sc_height-sline+nline-1, bpos, 1, 0, 0);
|
||||
#if HILITE_SEARCH
|
||||
if (show_attn)
|
||||
repaint_hilite(1);
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
pos = back_line(pos);
|
||||
@ -250,7 +259,6 @@ jump_loc(pos, sline)
|
||||
}
|
||||
}
|
||||
lastmark();
|
||||
hit_eof = 0;
|
||||
squished = 0;
|
||||
screen_trashed = 0;
|
||||
forw(sc_height-1, pos, 1, 0, sline-nline);
|
||||
@ -282,8 +290,10 @@ jump_loc(pos, sline)
|
||||
* that we can just scroll there after all.
|
||||
*/
|
||||
back(nline+1, tpos, 1, 0);
|
||||
#if HILITE_SEARCH
|
||||
if (show_attn)
|
||||
repaint_hilite(1);
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
/* $FreeBSD$ */
|
||||
/*
|
||||
* Copyright (C) 1984-2007 Mark Nudelman
|
||||
* Copyright (C) 1984-2008 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
@ -160,7 +160,7 @@ void free();
|
||||
#define IS_DIGIT(c) ((c) >= '0' && (c) <= '9')
|
||||
#endif
|
||||
|
||||
#define IS_CSI_START(c) ((c) == ESC || ((unsigned char)(c)) == CSI)
|
||||
#define IS_CSI_START(c) (((LWCHAR)(c)) == ESC || (((LWCHAR)(c)) == CSI))
|
||||
|
||||
#ifndef NULL
|
||||
#define NULL 0
|
||||
@ -336,14 +336,15 @@ struct textlist
|
||||
#define BS_CONTROL 2 /* \b treated as control char; prints as ^H */
|
||||
|
||||
/* How should we search? */
|
||||
#define SRCH_FORW (1 << 0) /* Search forward from current position */
|
||||
#define SRCH_BACK (1 << 1) /* Search backward from current position */
|
||||
#define SRCH_NO_MOVE (1 << 2) /* Highlight, but don't move */
|
||||
#define SRCH_FIND_ALL (1 << 4) /* Find and highlight all matches */
|
||||
#define SRCH_NO_MATCH (1 << 8) /* Search for non-matching lines */
|
||||
#define SRCH_PAST_EOF (1 << 9) /* Search past end-of-file, into next file */
|
||||
#define SRCH_FIRST_FILE (1 << 10) /* Search starting at the first file */
|
||||
#define SRCH_NO_REGEX (1 << 12) /* Don't use regular expressions */
|
||||
#define SRCH_FORW (1 << 0) /* Search forward from current position */
|
||||
#define SRCH_BACK (1 << 1) /* Search backward from current position */
|
||||
#define SRCH_NO_MOVE (1 << 2) /* Highlight, but don't move */
|
||||
#define SRCH_FIND_ALL (1 << 4) /* Find and highlight all matches */
|
||||
#define SRCH_NO_MATCH (1 << 8) /* Search for non-matching lines */
|
||||
#define SRCH_PAST_EOF (1 << 9) /* Search past end-of-file, into next file */
|
||||
#define SRCH_FIRST_FILE (1 << 10) /* Search starting at the first file */
|
||||
#define SRCH_NO_REGEX (1 << 12) /* Don't use regular expressions */
|
||||
#define SRCH_FILTER (1 << 13) /* Search is for '&' (filter) command */
|
||||
|
||||
#define SRCH_REVERSE(t) (((t) & SRCH_FORW) ? \
|
||||
(((t) & ~SRCH_FORW) | SRCH_BACK) : \
|
||||
|
@ -38,6 +38,7 @@
|
||||
ESC-n * Repeat previous search, spanning files.
|
||||
ESC-N * Repeat previous search, reverse dir. & spanning files.
|
||||
ESC-u Undo (toggle) search highlighting.
|
||||
&_p_a_t_t_e_r_n * Display only matching lines
|
||||
---------------------------------------------------
|
||||
Search patterns may be modified by one or more of:
|
||||
^N or ! Search for NON-matching lines.
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,4 +1,4 @@
|
||||
.TH LESS 1 "Version 416: 22 Nov 2007"
|
||||
.TH LESS 1 "Version 429: 11 Apr 2009"
|
||||
.SH NAME
|
||||
less \- opposite of more
|
||||
.SH SYNOPSIS
|
||||
@ -256,6 +256,23 @@ turn highlighting back on.
|
||||
Any search command will also turn highlighting back on.
|
||||
(Highlighting can also be disabled by toggling the \-G option;
|
||||
in that case search commands do not turn highlighting back on.)
|
||||
.IP "&pattern"
|
||||
Display only lines which match the pattern;
|
||||
lines which do not match the pattern are not displayed.
|
||||
If pattern is empty (if you type & immediately followed by ENTER),
|
||||
any filtering is turned off, and all lines are displayed.
|
||||
While filtering is in effect, an ampersand is displayed at the
|
||||
beginning of the prompt,
|
||||
as a reminder that some lines in the file may be hidden.
|
||||
.sp
|
||||
Certain characters are special as in the / command:
|
||||
.RS
|
||||
.IP "^N or !"
|
||||
Display only lines which do NOT match the pattern.
|
||||
.IP "^R"
|
||||
Don't interpret regular expression metacharacters;
|
||||
that is, do a simple textual comparison.
|
||||
.RE
|
||||
.IP ":e [filename]"
|
||||
Examine a new file.
|
||||
If the filename is missing, the "current" file (see the :n and :p commands
|
||||
@ -498,7 +515,9 @@ being set: n=normal, s=standout, d=bold, u=underlined, k=blink.
|
||||
\fIcolor\fP is a pair of numbers separated by a period.
|
||||
The first number selects the foreground color and the second selects
|
||||
the background color of the text.
|
||||
A single number \fIN\fP is the same as \fIN.0\fP.
|
||||
A single number \fIN\fP is the same as \fIN.M\fP,
|
||||
where \fIM\fP is the normal background color.
|
||||
|
||||
.IP "\-e or \-\-quit-at-eof"
|
||||
Causes
|
||||
.I less
|
||||
@ -890,7 +909,8 @@ or the pattern for a search command),
|
||||
certain keys can be used to manipulate the command line.
|
||||
Most commands have an alternate form in [ brackets ] which can be used if
|
||||
a key does not exist on a particular keyboard.
|
||||
(The bracketed forms do not work in the MS-DOS version.)
|
||||
(Note that the forms beginning with ESC do not work
|
||||
in some MS-DOS and Windows systems because ESC is the line erase character.)
|
||||
Any of these special keys may be entered literally by preceding
|
||||
it with the "literal" character, either ^V or ^A.
|
||||
A backslash itself may also be entered literally by entering two backslashes.
|
||||
@ -1126,6 +1146,14 @@ but it is usually not necessary since there is no replacement file
|
||||
to clean up.
|
||||
In this case, the replacement file name passed to the LESSCLOSE
|
||||
postprocessor is "\-".
|
||||
.PP
|
||||
For compatibility with previous versions of
|
||||
.I less,
|
||||
the input pipe is not used if
|
||||
.I less
|
||||
is viewing standard input.
|
||||
However, if the character after the vertical bar is a dash (\-),
|
||||
the input pipe is used on standard input as well as other files.
|
||||
|
||||
.SH "NATIONAL CHARACTER SETS"
|
||||
There are three types of characters in the input file:
|
||||
@ -1174,7 +1202,7 @@ It is the only character set that supports multi-byte characters.
|
||||
.IP windows
|
||||
Selects a character set appropriate for Microsoft Windows (cp 1251).
|
||||
.PP
|
||||
In special cases, it may be desired to tailor
|
||||
In rare cases, it may be desired to tailor
|
||||
.I less
|
||||
to use a character set other than the ones definable by LESSCHARSET.
|
||||
In this case, the environment variable LESSCHARDEF can be used
|
||||
@ -1620,45 +1648,8 @@ The name of the editor (used for the v command).
|
||||
.SH "SEE ALSO"
|
||||
lesskey(1)
|
||||
|
||||
.SH WARNINGS
|
||||
The = command and prompts (unless changed by \-P)
|
||||
report the line numbers of the lines at the top and bottom of the screen,
|
||||
but the byte and percent of the line after the one at the bottom of the screen.
|
||||
.PP
|
||||
On certain older terminals (the so-called "magic cookie" terminals),
|
||||
search highlighting will cause an erroneous display.
|
||||
On such terminals, search highlighting is disabled by default
|
||||
to avoid possible problems.
|
||||
.PP
|
||||
When searching in a binary file, text which follows a null byte
|
||||
may not be found.
|
||||
This problem does not occur when searching with regular expressions turned
|
||||
off via ^R, and also does not occur when
|
||||
.I less
|
||||
is compiled to use the PCRE regular expression library.
|
||||
.PP
|
||||
In certain cases, when search highlighting is enabled and
|
||||
a search pattern begins with a ^,
|
||||
more text than the matching string may be highlighted.
|
||||
(This problem does not occur when less is compiled to use the POSIX
|
||||
regular expression package.)
|
||||
.PP
|
||||
On some systems,
|
||||
.I setlocale
|
||||
claims that ASCII characters 0 thru 31 are control characters
|
||||
rather than binary characters.
|
||||
This causes
|
||||
.I less
|
||||
to treat some binary files as ordinary, non-binary files.
|
||||
To workaround this problem, set the environment variable
|
||||
LESSCHARSET to "ascii" (or whatever character set is appropriate).
|
||||
.PP
|
||||
This manual is too long.
|
||||
.PP
|
||||
See http://www.greenwoodsoftware.com/less for the latest list of known bugs in less.
|
||||
|
||||
.SH COPYRIGHT
|
||||
Copyright (C) 1984-2007 Mark Nudelman
|
||||
Copyright (C) 1984-2008 Mark Nudelman
|
||||
.PP
|
||||
less is part of the GNU project and is free software.
|
||||
You can redistribute it and/or modify it
|
||||
@ -1683,6 +1674,8 @@ See the GNU General Public License for more details.
|
||||
.PP
|
||||
Mark Nudelman <markn@greenwoodsoftware.com>
|
||||
.br
|
||||
See http://www.greenwoodsoftware.com/less/bugs.html for the latest list of known bugs in less.
|
||||
.br
|
||||
Send bug reports or comments to the above address or to
|
||||
.br
|
||||
bug-less@gnu.org.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2007 Mark Nudelman
|
||||
* Copyright (C) 1984-2008 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
@ -28,7 +28,7 @@
|
||||
|
||||
#include "less.h"
|
||||
|
||||
static char *version = "$Revision: 1.11 $";
|
||||
static char *version = "$Revision: 1.12 $";
|
||||
|
||||
static int quote_all = 0;
|
||||
static char openquote = '"';
|
||||
|
@ -46,4 +46,4 @@ LESSECHO(1) LESSECHO(1)
|
||||
|
||||
|
||||
|
||||
Version 416: 22 Nov 2007 LESSECHO(1)
|
||||
Version 429: 11 Apr 2009 LESSECHO(1)
|
||||
|
@ -1,4 +1,4 @@
|
||||
.TH LESSECHO 1 "Version 416: 22 Nov 2007"
|
||||
.TH LESSECHO 1 "Version 429: 11 Apr 2009"
|
||||
.SH NAME
|
||||
lessecho \- expand metacharacters
|
||||
.SH SYNOPSIS
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2007 Mark Nudelman
|
||||
* Copyright (C) 1984-2008 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
@ -93,63 +93,64 @@ struct cmdname
|
||||
|
||||
struct cmdname cmdnames[] =
|
||||
{
|
||||
{ "back-bracket", A_B_BRACKET },
|
||||
{ "back-line", A_B_LINE },
|
||||
{ "back-line-force", A_BF_LINE },
|
||||
{ "back-screen", A_B_SCREEN },
|
||||
{ "back-scroll", A_B_SCROLL },
|
||||
{ "back-search", A_B_SEARCH },
|
||||
{ "back-window", A_B_WINDOW },
|
||||
{ "debug", A_DEBUG },
|
||||
{ "digit", A_DIGIT },
|
||||
{ "display-flag", A_DISP_OPTION },
|
||||
{ "display-option", A_DISP_OPTION },
|
||||
{ "end", A_GOEND },
|
||||
{ "examine", A_EXAMINE },
|
||||
{ "first-cmd", A_FIRSTCMD },
|
||||
{ "firstcmd", A_FIRSTCMD },
|
||||
{ "flush-repaint", A_FREPAINT },
|
||||
{ "forw-bracket", A_F_BRACKET },
|
||||
{ "forw-forever", A_F_FOREVER },
|
||||
{ "forw-line", A_F_LINE },
|
||||
{ "forw-line-force", A_FF_LINE },
|
||||
{ "forw-screen", A_F_SCREEN },
|
||||
{ "forw-screen-force", A_FF_SCREEN },
|
||||
{ "forw-scroll", A_F_SCROLL },
|
||||
{ "forw-search", A_F_SEARCH },
|
||||
{ "forw-window", A_F_WINDOW },
|
||||
{ "goto-end", A_GOEND },
|
||||
{ "goto-line", A_GOLINE },
|
||||
{ "goto-mark", A_GOMARK },
|
||||
{ "help", A_HELP },
|
||||
{ "index-file", A_INDEX_FILE },
|
||||
{ "invalid", A_UINVALID },
|
||||
{ "left-scroll", A_LSHIFT },
|
||||
{ "next-file", A_NEXT_FILE },
|
||||
{ "next-tag", A_NEXT_TAG },
|
||||
{ "noaction", A_NOACTION },
|
||||
{ "percent", A_PERCENT },
|
||||
{ "pipe", A_PIPE },
|
||||
{ "prev-file", A_PREV_FILE },
|
||||
{ "prev-tag", A_PREV_TAG },
|
||||
{ "quit", A_QUIT },
|
||||
{ "remove-file", A_REMOVE_FILE },
|
||||
{ "repaint", A_REPAINT },
|
||||
{ "repaint-flush", A_FREPAINT },
|
||||
{ "repeat-search", A_AGAIN_SEARCH },
|
||||
{ "repeat-search-all", A_T_AGAIN_SEARCH },
|
||||
{ "reverse-search", A_REVERSE_SEARCH },
|
||||
{ "reverse-search-all", A_T_REVERSE_SEARCH },
|
||||
{ "right-scroll", A_RSHIFT },
|
||||
{ "set-mark", A_SETMARK },
|
||||
{ "shell", A_SHELL },
|
||||
{ "status", A_STAT },
|
||||
{ "toggle-flag", A_OPT_TOGGLE },
|
||||
{ "toggle-option", A_OPT_TOGGLE },
|
||||
{ "undo-hilite", A_UNDO_SEARCH },
|
||||
{ "version", A_VERSION },
|
||||
{ "visual", A_VISUAL },
|
||||
{ NULL, 0 }
|
||||
{ "back-bracket", A_B_BRACKET },
|
||||
{ "back-line", A_B_LINE },
|
||||
{ "back-line-force", A_BF_LINE },
|
||||
{ "back-screen", A_B_SCREEN },
|
||||
{ "back-scroll", A_B_SCROLL },
|
||||
{ "back-search", A_B_SEARCH },
|
||||
{ "back-window", A_B_WINDOW },
|
||||
{ "debug", A_DEBUG },
|
||||
{ "digit", A_DIGIT },
|
||||
{ "display-flag", A_DISP_OPTION },
|
||||
{ "display-option", A_DISP_OPTION },
|
||||
{ "end", A_GOEND },
|
||||
{ "examine", A_EXAMINE },
|
||||
{ "filter", A_FILTER },
|
||||
{ "first-cmd", A_FIRSTCMD },
|
||||
{ "firstcmd", A_FIRSTCMD },
|
||||
{ "flush-repaint", A_FREPAINT },
|
||||
{ "forw-bracket", A_F_BRACKET },
|
||||
{ "forw-forever", A_F_FOREVER },
|
||||
{ "forw-line", A_F_LINE },
|
||||
{ "forw-line-force", A_FF_LINE },
|
||||
{ "forw-screen", A_F_SCREEN },
|
||||
{ "forw-screen-force", A_FF_SCREEN },
|
||||
{ "forw-scroll", A_F_SCROLL },
|
||||
{ "forw-search", A_F_SEARCH },
|
||||
{ "forw-window", A_F_WINDOW },
|
||||
{ "goto-end", A_GOEND },
|
||||
{ "goto-line", A_GOLINE },
|
||||
{ "goto-mark", A_GOMARK },
|
||||
{ "help", A_HELP },
|
||||
{ "index-file", A_INDEX_FILE },
|
||||
{ "invalid", A_UINVALID },
|
||||
{ "left-scroll", A_LSHIFT },
|
||||
{ "next-file", A_NEXT_FILE },
|
||||
{ "next-tag", A_NEXT_TAG },
|
||||
{ "noaction", A_NOACTION },
|
||||
{ "percent", A_PERCENT },
|
||||
{ "pipe", A_PIPE },
|
||||
{ "prev-file", A_PREV_FILE },
|
||||
{ "prev-tag", A_PREV_TAG },
|
||||
{ "quit", A_QUIT },
|
||||
{ "remove-file", A_REMOVE_FILE },
|
||||
{ "repaint", A_REPAINT },
|
||||
{ "repaint-flush", A_FREPAINT },
|
||||
{ "repeat-search", A_AGAIN_SEARCH },
|
||||
{ "repeat-search-all", A_T_AGAIN_SEARCH },
|
||||
{ "reverse-search", A_REVERSE_SEARCH },
|
||||
{ "reverse-search-all", A_T_REVERSE_SEARCH },
|
||||
{ "right-scroll", A_RSHIFT },
|
||||
{ "set-mark", A_SETMARK },
|
||||
{ "shell", A_SHELL },
|
||||
{ "status", A_STAT },
|
||||
{ "toggle-flag", A_OPT_TOGGLE },
|
||||
{ "toggle-option", A_OPT_TOGGLE },
|
||||
{ "undo-hilite", A_UNDO_SEARCH },
|
||||
{ "version", A_VERSION },
|
||||
{ "visual", A_VISUAL },
|
||||
{ NULL, 0 }
|
||||
};
|
||||
|
||||
struct cmdname editnames[] =
|
||||
@ -539,7 +540,7 @@ add_cmd_str(s)
|
||||
control_line(s)
|
||||
char *s;
|
||||
{
|
||||
#define PREFIX(str,pat) (strncmp(str,pat,strlen(pat)-1) == 0)
|
||||
#define PREFIX(str,pat) (strncmp(str,pat,strlen(pat)) == 0)
|
||||
|
||||
if (PREFIX(s, "#line-edit"))
|
||||
{
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2007 Mark Nudelman
|
||||
* Copyright (C) 1984-2008 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
|
@ -183,6 +183,7 @@ LESSKEY(1) LESSKEY(1)
|
||||
\en repeat-search-all
|
||||
N reverse-search
|
||||
\eN reverse-search-all
|
||||
& filter
|
||||
m set-mark
|
||||
' goto-mark
|
||||
^X^X goto-mark
|
||||
@ -332,7 +333,7 @@ LESSKEY(1) LESSKEY(1)
|
||||
|
||||
|
||||
[1mCOPYRIGHT[0m
|
||||
Copyright (C) 2000-2007 Mark Nudelman
|
||||
Copyright (C) 2000-2008 Mark Nudelman
|
||||
|
||||
lesskey is part of the GNU project and is free software; you can redis-
|
||||
tribute it and/or modify it under the terms of the GNU General Public
|
||||
@ -357,4 +358,4 @@ LESSKEY(1) LESSKEY(1)
|
||||
|
||||
|
||||
|
||||
Version 416: 22 Nov 2007 LESSKEY(1)
|
||||
Version 429: 11 Apr 2009 LESSKEY(1)
|
||||
|
@ -1,4 +1,4 @@
|
||||
.TH LESSKEY 1 "Version 416: 22 Nov 2007"
|
||||
.TH LESSKEY 1 "Version 429: 11 Apr 2009"
|
||||
.SH NAME
|
||||
lesskey \- specify key bindings for less
|
||||
.SH SYNOPSIS
|
||||
@ -200,6 +200,7 @@ default command keys used by less:
|
||||
\een repeat-search-all
|
||||
N reverse-search
|
||||
\eeN reverse-search-all
|
||||
& filter
|
||||
m set-mark
|
||||
' goto-mark
|
||||
^X^X goto-mark
|
||||
@ -358,7 +359,7 @@ which start with a NUL character (0).
|
||||
This NUL character should be represented as \e340 in a lesskey file.
|
||||
|
||||
.SH COPYRIGHT
|
||||
Copyright (C) 2000-2007 Mark Nudelman
|
||||
Copyright (C) 2000-2008 Mark Nudelman
|
||||
.PP
|
||||
lesskey is part of the GNU project and is free software;
|
||||
you can redistribute it and/or modify it
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2007 Mark Nudelman
|
||||
* Copyright (C) 1984-2008 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
|
@ -1,6 +1,6 @@
|
||||
/* $FreeBSD$ */
|
||||
/*
|
||||
* Copyright (C) 1984-2007 Mark Nudelman
|
||||
* Copyright (C) 1984-2008 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
@ -36,7 +36,6 @@ static int overstrike; /* Next char should overstrike previous char */
|
||||
static int last_overstrike = AT_NORMAL;
|
||||
static int is_null_line; /* There is no current line */
|
||||
static int lmargin; /* Left margin */
|
||||
static int line_matches; /* Number of search matches in this line */
|
||||
static char pendc;
|
||||
static POSITION pendpos;
|
||||
static char *end_ansi_chars;
|
||||
@ -60,7 +59,6 @@ extern int bl_s_width, bl_e_width;
|
||||
extern int so_s_width, so_e_width;
|
||||
extern int sc_width, sc_height;
|
||||
extern int utf_mode;
|
||||
extern int oldbot;
|
||||
extern POSITION start_attnpos;
|
||||
extern POSITION end_attnpos;
|
||||
|
||||
@ -163,9 +161,6 @@ prewind()
|
||||
lmargin = 0;
|
||||
if (status_col)
|
||||
lmargin += 1;
|
||||
#if HILITE_SEARCH
|
||||
line_matches = 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
@ -593,7 +588,6 @@ store_char(ch, a, rep, pos)
|
||||
if (a != AT_ANSI)
|
||||
a |= AT_HILITE;
|
||||
}
|
||||
line_matches += matches;
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -601,11 +595,12 @@ store_char(ch, a, rep, pos)
|
||||
{
|
||||
if (!is_ansi_end(ch) && !is_ansi_middle(ch)) {
|
||||
/* Remove whole unrecognized sequence. */
|
||||
while (curr) {
|
||||
--curr;
|
||||
if (IS_CSI_START(linebuf[curr]))
|
||||
break;
|
||||
}
|
||||
char *p = &linebuf[curr];
|
||||
LWCHAR bch;
|
||||
do {
|
||||
bch = step_char(&p, -1, linebuf);
|
||||
} while (p > linebuf && !IS_CSI_START(bch));
|
||||
curr = p - linebuf;
|
||||
return 0;
|
||||
}
|
||||
a = AT_ANSI; /* Will force re-AT_'ing around it. */
|
||||
@ -995,8 +990,9 @@ pflushmbc()
|
||||
* Terminate the line in the line buffer.
|
||||
*/
|
||||
public void
|
||||
pdone(endline)
|
||||
pdone(endline, nextc)
|
||||
int endline;
|
||||
int nextc;
|
||||
{
|
||||
int nl;
|
||||
|
||||
@ -1040,43 +1036,44 @@ pdone(endline)
|
||||
* the next line is blank. In that case the single newline output for
|
||||
* that blank line would be ignored!)
|
||||
*/
|
||||
if (!oldbot)
|
||||
nl = (column < sc_width || !auto_wrap || (endline && ignaw) || ctldisp == OPT_ON);
|
||||
else
|
||||
nl = (column < sc_width || !auto_wrap || ignaw || ctldisp == OPT_ON);
|
||||
if (nl)
|
||||
if (column < sc_width || !auto_wrap || (endline && ignaw) || ctldisp == OPT_ON)
|
||||
{
|
||||
linebuf[curr] = '\n';
|
||||
attr[curr] = AT_NORMAL;
|
||||
curr++;
|
||||
}
|
||||
else if (ignaw && !auto_wrap && column >= sc_width)
|
||||
else if (ignaw && column >= sc_width)
|
||||
{
|
||||
/*
|
||||
* Big horrible kludge.
|
||||
* No-wrap terminals are too hard to deal with when they get in
|
||||
* the state where a full screen width of characters have been
|
||||
* output but the cursor is sitting on the right edge instead
|
||||
* of at the start of the next line.
|
||||
* So after we output a full line, we output an extra
|
||||
* space and backspace to force the cursor to the
|
||||
* beginning of the next line, like a sane terminal.
|
||||
* Terminals with "ignaw" don't wrap until they *really* need
|
||||
* to, i.e. when the character *after* the last one to fit on a
|
||||
* line is output. But they are too hard to deal with when they
|
||||
* get in the state where a full screen width of characters
|
||||
* have been output but the cursor is sitting on the right edge
|
||||
* instead of at the start of the next line.
|
||||
* So we nudge them into wrapping by outputting the next
|
||||
* character plus a backspace. (This wouldn't be right for
|
||||
* "!auto_wrap" terminals, but they always end up in the
|
||||
* branch above.)
|
||||
*/
|
||||
linebuf[curr] = ' ';
|
||||
linebuf[curr] = nextc;
|
||||
attr[curr++] = AT_NORMAL;
|
||||
linebuf[curr] = '\b';
|
||||
attr[curr++] = AT_NORMAL;
|
||||
}
|
||||
linebuf[curr] = '\0';
|
||||
attr[curr] = AT_NORMAL;
|
||||
}
|
||||
|
||||
#if HILITE_SEARCH
|
||||
if (status_col && line_matches > 0)
|
||||
{
|
||||
linebuf[0] = '*';
|
||||
attr[0] = AT_NORMAL|AT_HILITE;
|
||||
}
|
||||
#endif
|
||||
/*
|
||||
*
|
||||
*/
|
||||
public void
|
||||
set_status_col(c)
|
||||
char c;
|
||||
{
|
||||
linebuf[0] = c;
|
||||
attr[0] = AT_NORMAL|AT_HILITE;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2007 Mark Nudelman
|
||||
* Copyright (C) 1984-2008 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
@ -56,12 +56,10 @@ struct linenum_info
|
||||
* when we have a new one to insert and the table is full.
|
||||
*/
|
||||
|
||||
#define NPOOL 50 /* Size of line number pool */
|
||||
#define NPOOL 200 /* Size of line number pool */
|
||||
|
||||
#define LONGTIME (2) /* In seconds */
|
||||
|
||||
public int lnloop = 0; /* Are we in the line num loop? */
|
||||
|
||||
static struct linenum_info anchor; /* Anchor of the list */
|
||||
static struct linenum_info *freelist; /* Anchor of the unused entries */
|
||||
static struct linenum_info pool[NPOOL]; /* The pool itself */
|
||||
@ -70,6 +68,7 @@ static struct linenum_info *spare; /* We always keep one spare entry */
|
||||
extern int linenums;
|
||||
extern int sigs;
|
||||
extern int sc_height;
|
||||
extern int screen_trashed;
|
||||
|
||||
/*
|
||||
* Initialize the line number structures.
|
||||
@ -214,12 +213,6 @@ add_lnum(linenum, pos)
|
||||
longloopmessage()
|
||||
{
|
||||
ierror("Calculating line numbers", NULL_PARG);
|
||||
/*
|
||||
* Set the lnloop flag here, so if the user interrupts while
|
||||
* we are calculating line numbers, the signal handler will
|
||||
* turn off line numbers (linenums=0).
|
||||
*/
|
||||
lnloop = 1;
|
||||
}
|
||||
|
||||
static int loopcount;
|
||||
@ -249,6 +242,22 @@ longish()
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* Turn off line numbers because the user has interrupted
|
||||
* a lengthy line number calculation.
|
||||
*/
|
||||
static void
|
||||
abort_long()
|
||||
{
|
||||
if (linenums == OPT_ONPLUS)
|
||||
/*
|
||||
* We were displaying line numbers, so need to repaint.
|
||||
*/
|
||||
screen_trashed = 1;
|
||||
linenums = 0;
|
||||
error("Line numbers turned off", NULL_PARG);
|
||||
}
|
||||
|
||||
/*
|
||||
* Find the line number associated with a given position.
|
||||
* Return 0 if we can't figure it out.
|
||||
@ -315,11 +324,14 @@ find_linenum(pos)
|
||||
* Allow a signal to abort this loop.
|
||||
*/
|
||||
cpos = forw_raw_line(cpos, (char **)NULL, (int *)NULL);
|
||||
if (ABORT_SIGS() || cpos == NULL_POSITION)
|
||||
if (ABORT_SIGS()) {
|
||||
abort_long();
|
||||
return (0);
|
||||
}
|
||||
if (cpos == NULL_POSITION)
|
||||
return (0);
|
||||
longish();
|
||||
}
|
||||
lnloop = 0;
|
||||
/*
|
||||
* We might as well cache it.
|
||||
*/
|
||||
@ -344,11 +356,14 @@ find_linenum(pos)
|
||||
* Allow a signal to abort this loop.
|
||||
*/
|
||||
cpos = back_raw_line(cpos, (char **)NULL, (int *)NULL);
|
||||
if (ABORT_SIGS() || cpos == NULL_POSITION)
|
||||
if (ABORT_SIGS()) {
|
||||
abort_long();
|
||||
return (0);
|
||||
}
|
||||
if (cpos == NULL_POSITION)
|
||||
return (0);
|
||||
longish();
|
||||
}
|
||||
lnloop = 0;
|
||||
/*
|
||||
* We might as well cache it.
|
||||
*/
|
||||
@ -399,7 +414,9 @@ find_pos(linenum)
|
||||
* Allow a signal to abort this loop.
|
||||
*/
|
||||
cpos = forw_raw_line(cpos, (char **)NULL, (int *)NULL);
|
||||
if (ABORT_SIGS() || cpos == NULL_POSITION)
|
||||
if (ABORT_SIGS())
|
||||
return (NULL_POSITION);
|
||||
if (cpos == NULL_POSITION)
|
||||
return (NULL_POSITION);
|
||||
}
|
||||
} else
|
||||
@ -415,7 +432,9 @@ find_pos(linenum)
|
||||
* Allow a signal to abort this loop.
|
||||
*/
|
||||
cpos = back_raw_line(cpos, (char **)NULL, (int *)NULL);
|
||||
if (ABORT_SIGS() || cpos == NULL_POSITION)
|
||||
if (ABORT_SIGS())
|
||||
return (NULL_POSITION);
|
||||
if (cpos == NULL_POSITION)
|
||||
return (NULL_POSITION);
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2007 Mark Nudelman
|
||||
* Copyright (C) 1984-2008 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
@ -49,7 +49,7 @@ lsystem(cmd, donemsg)
|
||||
register char *p;
|
||||
#endif
|
||||
IFILE save_ifile;
|
||||
#if MSDOS_COMPILER
|
||||
#if MSDOS_COMPILER && MSDOS_COMPILER!=WIN32C
|
||||
char cwd[FILENAME_MAX+1];
|
||||
#endif
|
||||
|
||||
@ -68,6 +68,10 @@ lsystem(cmd, donemsg)
|
||||
}
|
||||
|
||||
#if MSDOS_COMPILER
|
||||
#if MSDOS_COMPILER==WIN32C
|
||||
if (*cmd == '\0')
|
||||
cmd = getenv("COMSPEC");
|
||||
#else
|
||||
/*
|
||||
* Working directory is global on MSDOS.
|
||||
* The child might change the working directory, so we
|
||||
@ -76,6 +80,7 @@ lsystem(cmd, donemsg)
|
||||
* try to "reedit_ifile" it.
|
||||
*/
|
||||
getcwd(cwd, FILENAME_MAX);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
@ -192,7 +197,7 @@ lsystem(cmd, donemsg)
|
||||
init();
|
||||
screen_trashed = 1;
|
||||
|
||||
#if MSDOS_COMPILER
|
||||
#if MSDOS_COMPILER && MSDOS_COMPILER!=WIN32C
|
||||
/*
|
||||
* Restore the previous directory (possibly
|
||||
* changed by the child program we just ran).
|
||||
|
@ -1,6 +1,6 @@
|
||||
/* $FreeBSD$ */
|
||||
/*
|
||||
* Copyright (C) 1984-2007 Mark Nudelman
|
||||
* Copyright (C) 1984-2008 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 1984-2007 Mark Nudelman
|
||||
* Copyright (C) 1984-2008 Mark Nudelman
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Less License, as specified in the README file.
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user