aboutsummaryrefslogtreecommitdiffstats
path: root/common
diff options
context:
space:
mode:
authorBaptiste Daroussin <bapt@FreeBSD.org>2020-10-01 04:25:54 +0000
committerBaptiste Daroussin <bapt@FreeBSD.org>2020-10-01 04:25:54 +0000
commitb4ed613595432ece6802d09bfabad18e09aa26f3 (patch)
treebd2db6b09b756624c1b2babdd12ea05a9dffcdaf /common
parent7cef6c685d23e4dcdf3f64b0b2ea92151e652db6 (diff)
downloadsrc-vendor/nvi.tar.gz
src-vendor/nvi.zip
Import nvi 2.2.0-05ed8b9vendor/nvi/2.2.0-05ed8b9vendor/nvi
This snapshot just brings a bunch of fixes in particular a fix for vi -w PR: 241985 Reported by: fernape
Notes
Notes: svn path=/vendor/nvi/dist/; revision=366307 svn path=/vendor/nvi/2.2.0-05ed8b9/; revision=366308; tag=vendor/nvi/2.2.0-05ed8b9
Diffstat (limited to 'common')
-rw-r--r--common/common.h8
-rw-r--r--common/cut.h4
-rw-r--r--common/exf.c17
-rw-r--r--common/key.c4
-rw-r--r--common/log.c4
-rw-r--r--common/main.c11
-rw-r--r--common/mark.c3
-rw-r--r--common/mem.h60
-rw-r--r--common/msg.c4
-rw-r--r--common/options.c20
-rw-r--r--common/put.c3
-rw-r--r--common/recover.c9
-rw-r--r--common/util.c10
13 files changed, 94 insertions, 63 deletions
diff --git a/common/common.h b/common/common.h
index ad559a5a2267..dc4155610225 100644
--- a/common/common.h
+++ b/common/common.h
@@ -7,7 +7,15 @@
* See the LICENSE file for redistribution information.
*/
+#ifndef TCSASOFT
+#define TCSASOFT 0
+#endif
+
+#ifdef __linux__
+#include "/usr/include/db1/db.h" /* Only include db1. */
+#else
#include "/usr/include/db.h" /* Only include db1. */
+#endif
#include <regex.h> /* May refer to the bundled regex. */
/*
diff --git a/common/cut.h b/common/cut.h
index d220cd8cc69c..a94c3f9ce58d 100644
--- a/common/cut.h
+++ b/common/cut.h
@@ -63,13 +63,13 @@ struct _text { /* Text: a linked list of lines. */
* Get named buffer 'name'.
* Translate upper-case buffer names to lower-case buffer names.
*/
-#define CBNAME(sp, cbp, nch) { \
+#define CBNAME(sp, cbp, nch) do { \
CHAR_T L__name; \
L__name = isupper(nch) ? tolower(nch) : (nch); \
SLIST_FOREACH(cbp, sp->gp->cutq, q) \
if (cbp->name == L__name) \
break; \
-}
+} while (0)
/* Flags to the cut() routine. */
#define CUT_LINEMODE 0x01 /* Cut in line mode. */
diff --git a/common/exf.c b/common/exf.c
index ccfa66ef4089..f9eb2150276d 100644
--- a/common/exf.c
+++ b/common/exf.c
@@ -199,7 +199,7 @@ file_init(SCR *sp, FREF *frp, char *rcv_name, int flags)
if (!LF_ISSET(FS_OPENERR))
F_SET(frp, FR_NEWFILE);
- ep->mtim = sb.st_mtimespec;
+ ep->mtim = sb.st_mtim;
} else {
/*
* XXX
@@ -218,7 +218,7 @@ file_init(SCR *sp, FREF *frp, char *rcv_name, int flags)
ep->mdev = sb.st_dev;
ep->minode = sb.st_ino;
- ep->mtim = sb.st_mtimespec;
+ ep->mtim = sb.st_mtim;
if (!S_ISREG(sb.st_mode))
msgq_str(sp, M_ERR, oname,
@@ -796,7 +796,7 @@ file_write(SCR *sp, MARK *fm, MARK *tm, char *name, int flags)
if (noname && !LF_ISSET(FS_FORCE | FS_APPEND) &&
((F_ISSET(ep, F_DEVSET) &&
(sb.st_dev != ep->mdev || sb.st_ino != ep->minode)) ||
- timespeccmp(&sb.st_mtimespec, &ep->mtim, !=))) {
+ timespeccmp(&sb.st_mtim, &ep->mtim, !=))) {
msgq_str(sp, M_ERR, name, LF_ISSET(FS_POSSIBLE) ?
"250|%s: file modified more recently than this copy; use ! to override" :
"251|%s: file modified more recently than this copy");
@@ -887,7 +887,7 @@ success_open:
* we re-init the time. That way the user can clean up the disk
* and rewrite without having to force it.
*/
- if (noname)
+ if (noname) {
if (stat(name, &sb))
timepoint_system(&ep->mtim);
else {
@@ -895,8 +895,9 @@ success_open:
ep->mdev = sb.st_dev;
ep->minode = sb.st_ino;
- ep->mtim = sb.st_mtimespec;
+ ep->mtim = sb.st_mtim;
}
+ }
/*
* If the write failed, complain loudly. ex_writefp() has already
@@ -925,11 +926,12 @@ success_open:
*/
if (LF_ISSET(FS_ALL) && !LF_ISSET(FS_APPEND)) {
F_CLR(ep, F_MODIFIED);
- if (F_ISSET(frp, FR_TMPFILE))
+ if (F_ISSET(frp, FR_TMPFILE)) {
if (noname)
F_SET(frp, FR_TMPEXIT);
else
F_CLR(frp, FR_TMPEXIT);
+ }
}
p = msg_print(sp, name, &nf);
@@ -1290,7 +1292,7 @@ file_m1(SCR *sp, int force, int flags)
* unless force is also set. Otherwise, we fail unless forced or
* there's another open screen on this file.
*/
- if (F_ISSET(ep, F_MODIFIED))
+ if (F_ISSET(ep, F_MODIFIED)) {
if (O_ISSET(sp, O_AUTOWRITE)) {
if (!force && file_aw(sp, flags))
return (1);
@@ -1300,6 +1302,7 @@ file_m1(SCR *sp, int force, int flags)
"263|File modified since last complete write; write or use :edit! to override");
return (1);
}
+ }
return (file_m3(sp, force));
}
diff --git a/common/key.c b/common/key.c
index 23da0498a757..e71396893fd4 100644
--- a/common/key.c
+++ b/common/key.c
@@ -424,12 +424,12 @@ v_event_append(SCR *sp, EVENT *argp)
}
/* Remove events from the queue. */
-#define QREM(len) { \
+#define QREM(len) do { \
if ((gp->i_cnt -= len) == 0) \
gp->i_next = 0; \
else \
gp->i_next += len; \
-}
+} while (0)
/*
* v_event_get --
diff --git a/common/log.c b/common/log.c
index 5dcd9a2945fc..96b246efad02 100644
--- a/common/log.c
+++ b/common/log.c
@@ -69,10 +69,10 @@ static int apply_with(int (*)(SCR *, recno_t, CHAR_T *, size_t),
SCR *, recno_t, u_char *, size_t);
/* Try and restart the log on failure, i.e. if we run out of memory. */
-#define LOG_ERR { \
+#define LOG_ERR do { \
log_err(sp, __FILE__, __LINE__); \
return (1); \
-}
+} while (0)
/* offset of CHAR_T string in log needs to be aligned on some systems
* because it is passed to db_set as a string
diff --git a/common/main.c b/common/main.c
index c0b81960bd55..a7e60f1af806 100644
--- a/common/main.c
+++ b/common/main.c
@@ -48,8 +48,8 @@ editor(GS *gp, int argc, char *argv[])
size_t len;
u_int flags;
int ch, flagchk, lflag, secure, startup, readonly, rval, silent;
- char *tag_f, *wsizearg, path[256];
- CHAR_T *w;
+ char *tag_f, *wsizearg;
+ CHAR_T *w, path[256];
size_t wlen;
/* Initialize the busy routine, if not defined by the screen. */
@@ -242,9 +242,9 @@ editor(GS *gp, int argc, char *argv[])
}
if (wsizearg != NULL) {
ARGS *av[2], a, b;
- (void)snprintf(path, sizeof(path), "window=%s", wsizearg);
+ (void)SPRINTF(path, SIZE(path), L("window=%s"), wsizearg);
a.bp = (CHAR_T *)path;
- a.len = strlen(path);
+ a.len = SIZE(path);
b.bp = NULL;
b.len = 0;
av[0] = &a;
@@ -533,7 +533,7 @@ v_obsolete(char *argv[])
argv[0][1] = 'c';
(void)strlcpy(argv[0] + 2, p + 1, len);
}
- } else if (argv[0][0] == '-')
+ } else if (argv[0][0] == '-') {
if (argv[0][1] == '\0') {
argv[0] = strdup("-s");
if (argv[0] == NULL) {
@@ -545,6 +545,7 @@ nomem: warn(NULL);
argv[0][1] == 't' || argv[0][1] == 'w') &&
argv[0][2] == '\0')
++argv;
+ }
return (0);
}
diff --git a/common/mark.c b/common/mark.c
index 9af4612cb22a..86e3cb8ea6d9 100644
--- a/common/mark.c
+++ b/common/mark.c
@@ -216,12 +216,13 @@ mark_insdel(SCR *sp, lnop_t op, recno_t lno)
abort();
case LINE_DELETE:
SLIST_FOREACH(lmp, sp->ep->marks, q)
- if (lmp->lno >= lno)
+ if (lmp->lno >= lno) {
if (lmp->lno == lno) {
F_SET(lmp, MARK_DELETED);
(void)log_mark(sp, lmp);
} else
--lmp->lno;
+ }
break;
case LINE_INSERT:
/*
diff --git a/common/mem.h b/common/mem.h
index 1e26a6ea6549..d24ec0b50b09 100644
--- a/common/mem.h
+++ b/common/mem.h
@@ -17,7 +17,7 @@
/* Increase the size of a malloc'd buffer. Two versions, one that
* returns, one that jumps to an error label.
*/
-#define BINC_GOTO(sp, type, lp, llen, nlen) { \
+#define BINC_GOTO(sp, type, lp, llen, nlen) do { \
CHECK_TYPE(type *, lp) \
void *L__bincp; \
if ((nlen) > llen) { \
@@ -29,12 +29,12 @@
*/ \
lp = L__bincp; \
} \
-}
+} while (0)
#define BINC_GOTOC(sp, lp, llen, nlen) \
BINC_GOTO(sp, char, lp, llen, nlen)
#define BINC_GOTOW(sp, lp, llen, nlen) \
BINC_GOTO(sp, CHAR_T, lp, llen, (nlen) * sizeof(CHAR_T))
-#define BINC_RET(sp, type, lp, llen, nlen) { \
+#define BINC_RET(sp, type, lp, llen, nlen) do { \
CHECK_TYPE(type *, lp) \
void *L__bincp; \
if ((nlen) > llen) { \
@@ -46,7 +46,7 @@
*/ \
lp = L__bincp; \
} \
-}
+} while (0)
#define BINC_RETC(sp, lp, llen, nlen) \
BINC_RET(sp, char, lp, llen, nlen)
#define BINC_RETW(sp, lp, llen, nlen) \
@@ -57,7 +57,7 @@
* from a malloc'd buffer otherwise. Two versions, one that returns, one
* that jumps to an error label.
*/
-#define GET_SPACE_GOTO(sp, type, bp, blen, nlen) { \
+#define GET_SPACE_GOTO(sp, type, bp, blen, nlen) do { \
CHECK_TYPE(type *, bp) \
GS *L__gp = (sp) == NULL ? NULL : (sp)->gp; \
if (L__gp == NULL || F_ISSET(L__gp, G_TMP_INUSE)) { \
@@ -70,12 +70,12 @@
blen = L__gp->tmp_blen; \
F_SET(L__gp, G_TMP_INUSE); \
} \
-}
+} while (0)
#define GET_SPACE_GOTOC(sp, bp, blen, nlen) \
GET_SPACE_GOTO(sp, char, bp, blen, nlen)
#define GET_SPACE_GOTOW(sp, bp, blen, nlen) \
GET_SPACE_GOTO(sp, CHAR_T, bp, blen, (nlen) * sizeof(CHAR_T))
-#define GET_SPACE_RET(sp, type, bp, blen, nlen) { \
+#define GET_SPACE_RET(sp, type, bp, blen, nlen) do { \
CHECK_TYPE(type *, bp) \
GS *L__gp = (sp) == NULL ? NULL : (sp)->gp; \
if (L__gp == NULL || F_ISSET(L__gp, G_TMP_INUSE)) { \
@@ -88,7 +88,7 @@
blen = L__gp->tmp_blen; \
F_SET(L__gp, G_TMP_INUSE); \
} \
-}
+} while (0)
#define GET_SPACE_RETC(sp, bp, blen, nlen) \
GET_SPACE_RET(sp, char, bp, blen, nlen)
#define GET_SPACE_RETW(sp, bp, blen, nlen) \
@@ -98,7 +98,7 @@
* Add space to a GET_SPACE returned buffer. Two versions, one that
* returns, one that jumps to an error label.
*/
-#define ADD_SPACE_GOTO(sp, type, bp, blen, nlen) { \
+#define ADD_SPACE_GOTO(sp, type, bp, blen, nlen) do { \
CHECK_TYPE(type *, bp) \
GS *L__gp = (sp) == NULL ? NULL : (sp)->gp; \
if (L__gp == NULL || bp == (type *)L__gp->tmp_bp) { \
@@ -109,12 +109,12 @@
F_SET(L__gp, G_TMP_INUSE); \
} else \
BINC_GOTO(sp, type, bp, blen, nlen); \
-}
+} while (0)
#define ADD_SPACE_GOTOC(sp, bp, blen, nlen) \
ADD_SPACE_GOTO(sp, char, bp, blen, nlen)
#define ADD_SPACE_GOTOW(sp, bp, blen, nlen) \
ADD_SPACE_GOTO(sp, CHAR_T, bp, blen, (nlen) * sizeof(CHAR_T))
-#define ADD_SPACE_RET(sp, type, bp, blen, nlen) { \
+#define ADD_SPACE_RET(sp, type, bp, blen, nlen) do { \
CHECK_TYPE(type *, bp) \
GS *L__gp = (sp) == NULL ? NULL : (sp)->gp; \
if (L__gp == NULL || bp == (type *)L__gp->tmp_bp) { \
@@ -125,70 +125,70 @@
F_SET(L__gp, G_TMP_INUSE); \
} else \
BINC_RET(sp, type, bp, blen, nlen); \
-}
+} while (0)
#define ADD_SPACE_RETC(sp, bp, blen, nlen) \
ADD_SPACE_RET(sp, char, bp, blen, nlen)
#define ADD_SPACE_RETW(sp, bp, blen, nlen) \
ADD_SPACE_RET(sp, CHAR_T, bp, blen, (nlen) * sizeof(CHAR_T))
/* Free a GET_SPACE returned buffer. */
-#define FREE_SPACE(sp, bp, blen) { \
+#define FREE_SPACE(sp, bp, blen) do { \
GS *L__gp = (sp) == NULL ? NULL : (sp)->gp; \
if (L__gp != NULL && bp == L__gp->tmp_bp) \
F_CLR(L__gp, G_TMP_INUSE); \
else \
free(bp); \
-}
-#define FREE_SPACEW(sp, bp, blen) { \
+} while (0)
+#define FREE_SPACEW(sp, bp, blen) do { \
CHECK_TYPE(CHAR_T *, bp) \
FREE_SPACE(sp, (char *)bp, blen); \
-}
+} while (0)
/*
* Malloc a buffer, casting the return pointer. Various versions.
*/
-#define CALLOC(sp, p, nmemb, size) { \
+#define CALLOC(sp, p, nmemb, size) do { \
if ((p = calloc(nmemb, size)) == NULL) \
msgq(sp, M_SYSERR, NULL); \
-}
-#define CALLOC_GOTO(sp, p, nmemb, size) { \
+} while (0)
+#define CALLOC_GOTO(sp, p, nmemb, size) do { \
if ((p = calloc(nmemb, size)) == NULL) \
goto alloc_err; \
-}
-#define CALLOC_RET(sp, p, nmemb, size) { \
+} while (0)
+#define CALLOC_RET(sp, p, nmemb, size) do { \
if ((p = calloc(nmemb, size)) == NULL) { \
msgq(sp, M_SYSERR, NULL); \
return (1); \
} \
-}
+} while (0)
-#define MALLOC(sp, p, size) { \
+#define MALLOC(sp, p, size) do { \
if ((p = malloc(size)) == NULL) \
msgq(sp, M_SYSERR, NULL); \
-}
-#define MALLOC_GOTO(sp, p, size) { \
+} while (0)
+#define MALLOC_GOTO(sp, p, size) do { \
if ((p = malloc(size)) == NULL) \
goto alloc_err; \
-}
-#define MALLOC_RET(sp, p, size) { \
+} while (0)
+#define MALLOC_RET(sp, p, size) do { \
if ((p = malloc(size)) == NULL) { \
msgq(sp, M_SYSERR, NULL); \
return (1); \
} \
-}
+} while (0)
/*
* Resize a buffer, free any already held memory if we can't get more.
* FreeBSD's reallocf(3) does the same thing, but it's not portable yet.
*/
-#define REALLOC(sp, p, cast, size) { \
+#define REALLOC(sp, p, cast, size) do { \
cast newp; \
if ((newp = realloc(p, size)) == NULL) { \
free(p); \
msgq(sp, M_SYSERR, NULL); \
} \
p = newp; \
-}
+} while (0)
/*
* p2roundup --
diff --git a/common/msg.c b/common/msg.c
index d2463a3ecccd..7499f451be59 100644
--- a/common/msg.c
+++ b/common/msg.c
@@ -731,7 +731,11 @@ msg_open(SCR *sp, char *file)
* corrupt catalog file. Errno == 0 is not rare; add
* EFTYPE, which is seen on FreeBSD, for a good measure.
*/
+#ifdef EFTYPE
if (errno == 0 || errno == EFTYPE)
+#else
+ if (errno == 0)
+#endif
msgq_str(sp, M_ERR, p,
"030|The file %s is not a message catalog");
else
diff --git a/common/options.c b/common/options.c
index 25b10fe67012..d5c039f97228 100644
--- a/common/options.c
+++ b/common/options.c
@@ -20,6 +20,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <unctrl.h>
#include <unistd.h>
#include "common.h"
@@ -312,7 +313,7 @@ opts_init(SCR *sp, int *oargs)
argv[1] = &b;
/* Set numeric and string default values. */
-#define OI(indx, str) { \
+#define OI(indx, str) do { \
a.len = STRLEN(str); \
if ((CHAR_T*)str != b2) /* GCC puts strings in text-space. */ \
(void)MEMCPY(b2, str, a.len+1); \
@@ -320,7 +321,7 @@ opts_init(SCR *sp, int *oargs)
optindx = indx; \
goto err; \
} \
-}
+} while (0)
/*
* Indirect global options to global space. Specifically, set up
* terminal, lines, columns first, they're used by other options.
@@ -366,7 +367,7 @@ opts_init(SCR *sp, int *oargs)
OI(O_PARAGRAPHS, L("paragraphs=IPLPPPQPP LIpplpipbp"));
(void)SPRINTF(b2, SIZE(b2), L("path=%s"), "");
OI(O_PATH, b2);
- (void)SPRINTF(b2, SIZE(b2), L("recdir=%s"), _PATH_PRESERVE);
+ (void)SPRINTF(b2, SIZE(b2), L("recdir=%s"), NVI_PATH_PRESERVE);
OI(O_RECDIR, b2);
OI(O_SECTIONS, L("sections=NHSHH HUnhsh"));
(void)SPRINTF(b2, SIZE(b2),
@@ -573,13 +574,14 @@ opts_set(SCR *sp, ARGS *argv[], char *usage)
* functions can be expensive.
*/
isset = !turnoff;
- if (!F_ISSET(op, OPT_ALWAYS))
+ if (!F_ISSET(op, OPT_ALWAYS)) {
if (isset) {
if (O_ISSET(sp, offset))
break;
} else
if (!O_ISSET(sp, offset))
break;
+ }
/* Report to subsystems. */
if ((op->func != NULL &&
@@ -945,6 +947,7 @@ static int
opts_print(SCR *sp, OPTLIST const *op)
{
int curlen, offset;
+ const char *p;
curlen = 0;
offset = op - optlist;
@@ -958,8 +961,13 @@ opts_print(SCR *sp, OPTLIST const *op)
curlen += ex_printf(sp, WS"=%ld", op->name, O_VAL(sp, offset));
break;
case OPT_STR:
- curlen += ex_printf(sp, WS"=\"%s\"", op->name,
- O_STR(sp, offset) == NULL ? "" : O_STR(sp, offset));
+ curlen += ex_printf(sp, WS"=\"", op->name);
+ p = O_STR(sp, offset);
+ /* Keep correct count for unprintable character sequences */
+ if (p != NULL)
+ for (; *p != '\0'; ++p)
+ curlen += ex_puts(sp, unctrl(*p));
+ curlen += ex_puts(sp, "\"");
break;
}
return (curlen);
diff --git a/common/put.c b/common/put.c
index 26a67ac8711c..f39948808e7d 100644
--- a/common/put.c
+++ b/common/put.c
@@ -39,7 +39,7 @@ put(SCR *sp, CB *cbp, CHAR_T *namep, MARK *cp, MARK *rp, int append)
CHAR_T *bp, *t;
CHAR_T *p;
- if (cbp == NULL)
+ if (cbp == NULL) {
if (namep == NULL) {
cbp = sp->gp->dcbp;
if (cbp == NULL) {
@@ -56,6 +56,7 @@ put(SCR *sp, CB *cbp, CHAR_T *namep, MARK *cp, MARK *rp, int append)
return (1);
}
}
+ }
tp = TAILQ_FIRST(cbp->textq);
/*
diff --git a/common/recover.c b/common/recover.c
index 89f25a4146e9..120cf4f60b19 100644
--- a/common/recover.c
+++ b/common/recover.c
@@ -421,7 +421,7 @@ rcv_mailfile(SCR *sp, int issync, char *cp_path)
getprogname(), " -r ", qt);
free(qt);
free(host);
- if (buf == NULL) {
+ if (len == -1) {
msgq(sp, M_SYSERR, NULL);
goto err;
}
@@ -701,7 +701,7 @@ rcv_read(SCR *sp, FREF *frp)
/* If we've found more than one, take the most recent. */
(void)fstat(fileno(fp), &sb);
if (recp == NULL ||
- timespeccmp(&rec_mtim, &sb.st_mtimespec, <)) {
+ timespeccmp(&rec_mtim, &sb.st_mtim, <)) {
p = recp;
t = pathp;
recp = recpath;
@@ -710,7 +710,7 @@ rcv_read(SCR *sp, FREF *frp)
free(p);
free(t);
}
- rec_mtim = sb.st_mtimespec;
+ rec_mtim = sb.st_mtim;
if (sv_fd != -1)
(void)close(sv_fd);
sv_fd = dup(fileno(fp));
@@ -813,8 +813,7 @@ rcv_email(SCR *sp, char *fname)
{
char *buf;
- (void)asprintf(&buf, _PATH_SENDMAIL " -odb -t < %s", fname);
- if (buf == NULL) {
+ if (asprintf(&buf, _PATH_SENDMAIL " -odb -t < %s", fname) == -1) {
msgq_str(sp, M_ERR, strerror(errno),
"071|not sending email: %s");
return;
diff --git a/common/util.c b/common/util.c
index 1e87c6293550..8046ce373016 100644
--- a/common/util.c
+++ b/common/util.c
@@ -111,8 +111,9 @@ join(char *path1, char *path2)
if (path1[0] == '\0' || path2[0] == '/')
return strdup(path2);
- (void)asprintf(&p, path1[strlen(path1)-1] == '/' ?
- "%s%s" : "%s/%s", path1, path2);
+ if (asprintf(&p, path1[strlen(path1)-1] == '/' ?
+ "%s%s" : "%s/%s", path1, path2) == -1)
+ return NULL;
return p;
}
@@ -140,8 +141,13 @@ expanduser(char *str)
continue;
if (t == p) {
/* ~ */
+#ifdef __GLIBC__
+ extern char *secure_getenv(const char *);
+ if ((h = secure_getenv("HOME")) == NULL) {
+#else
if (issetugid() != 0 ||
(h = getenv("HOME")) == NULL) {
+#endif
if (((h = getlogin()) != NULL &&
(pwd = getpwnam(h)) != NULL) ||
(pwd = getpwuid(getuid())) != NULL)