Fix printing multibyte printing when performing a networked finger(1) request

MFC after:	1 week
This commit is contained in:
Baptiste Daroussin 2016-01-18 20:47:04 +00:00
parent f3750b35c4
commit 410df9fd8d
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=294293

View file

@ -42,7 +42,7 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/socket.h>
#include <sys/uio.h>
#include <ctype.h>
#include <wctype.h>
#include <db.h>
#include <err.h>
#include <netdb.h>
@ -52,6 +52,7 @@ __FBSDID("$FreeBSD$");
#include <string.h>
#include <unistd.h>
#include <utmpx.h>
#include <wchar.h>
#include "finger.h"
static void cleanup(int sig);
@ -108,7 +109,7 @@ do_protocol(const char *name, const struct addrinfo *ai)
{
int cnt, line_len, s;
FILE *fp;
int c, lastc;
wint_t c, lastc;
struct iovec iov[3];
struct msghdr msg;
static char slash_w[] = "/W ";
@ -168,7 +169,7 @@ do_protocol(const char *name, const struct addrinfo *ai)
if ((fp = fdopen(s, "r")) != NULL) {
cnt = 0;
line_len = 0;
while ((c = getc(fp)) != EOF) {
while ((c = getwc(fp)) != EOF) {
if (++cnt > OUTPUT_MAX) {
printf("\n\n Output truncated at %d bytes...\n",
cnt - 1);
@ -180,7 +181,7 @@ do_protocol(const char *name, const struct addrinfo *ai)
c = '\n';
lastc = '\r';
} else {
if (!isprint(c) && !isspace(c)) {
if (!iswprint(c) && !iswspace(c)) {
c &= 0x7f;
c |= 0x40;
}
@ -191,7 +192,7 @@ do_protocol(const char *name, const struct addrinfo *ai)
continue;
}
}
putchar(c);
putwchar(c);
if (c != '\n' && ++line_len > _POSIX2_LINE_MAX) {
putchar('\\');
putchar('\n');
@ -206,7 +207,7 @@ do_protocol(const char *name, const struct addrinfo *ai)
*/
warn("reading from network");
}
if (lastc != '\n')
if (lastc != L'\n')
putchar('\n');
fclose(fp);