Revert "last(1): unbreak for 8-bit locales"
This reverts commits8e67c427b5
(unbreak for 8-bit locales),0ca58ca151
(correction after r351413), andf424ec1b80
(fix style after r351459). A simpler fix can be done by using the h modifier for strings that are encoded with the current locale. Reviewed by: eugen, philip Differential Revision: https://reviews.freebsd.org/D32437
This commit is contained in:
parent
4f556830de
commit
902cde5d0a
@ -92,7 +92,6 @@ static const char *crmsg; /* cause of last reboot */
|
|||||||
static time_t currentout; /* current logout value */
|
static time_t currentout; /* current logout value */
|
||||||
static long maxrec; /* records to display */
|
static long maxrec; /* records to display */
|
||||||
static const char *file = NULL; /* utx.log file */
|
static const char *file = NULL; /* utx.log file */
|
||||||
static int noctfix = 0; /* locale is C or UTF-8 */
|
|
||||||
static int sflag = 0; /* show delta in seconds */
|
static int sflag = 0; /* show delta in seconds */
|
||||||
static int width = 5; /* show seconds in delta */
|
static int width = 5; /* show seconds in delta */
|
||||||
static int yflag; /* show year */
|
static int yflag; /* show year */
|
||||||
@ -104,7 +103,6 @@ static time_t snaptime; /* if != 0, we will only
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
static void addarg(int, char *);
|
static void addarg(int, char *);
|
||||||
static const char *ctf(const char *);
|
|
||||||
static time_t dateconv(char *);
|
static time_t dateconv(char *);
|
||||||
static void doentry(struct utmpx *);
|
static void doentry(struct utmpx *);
|
||||||
static void hostconv(char *);
|
static void hostconv(char *);
|
||||||
@ -114,31 +112,6 @@ static int want(struct utmpx *);
|
|||||||
static void usage(void);
|
static void usage(void);
|
||||||
static void wtmp(void);
|
static void wtmp(void);
|
||||||
|
|
||||||
static const char*
|
|
||||||
ctf(const char *fmt) {
|
|
||||||
static char buf[31];
|
|
||||||
const char *src, *end;
|
|
||||||
char *dst;
|
|
||||||
|
|
||||||
if (noctfix)
|
|
||||||
return (fmt);
|
|
||||||
|
|
||||||
end = buf + sizeof(buf);
|
|
||||||
for (src = fmt, dst = buf; dst < end; *dst++ = *src++) {
|
|
||||||
if (*src == '\0') {
|
|
||||||
*dst = '\0';
|
|
||||||
break;
|
|
||||||
} else if (*src == '%' && *(src+1) == 's') {
|
|
||||||
*dst++ = '%';
|
|
||||||
*dst++ = 'h';
|
|
||||||
*dst++ = 's';
|
|
||||||
strlcpy(dst, src+2, end - dst);
|
|
||||||
return (buf);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return (buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
usage(void)
|
usage(void)
|
||||||
{
|
{
|
||||||
@ -157,11 +130,6 @@ main(int argc, char *argv[])
|
|||||||
(void) setlocale(LC_TIME, "");
|
(void) setlocale(LC_TIME, "");
|
||||||
d_first = (*nl_langinfo(D_MD_ORDER) == 'd');
|
d_first = (*nl_langinfo(D_MD_ORDER) == 'd');
|
||||||
|
|
||||||
(void) setlocale(LC_CTYPE, "");
|
|
||||||
p = nl_langinfo(CODESET);
|
|
||||||
if (strcmp(p, "UTF-8") == 0 || strcmp(p, "US-ASCII") == 0)
|
|
||||||
noctfix = 1;
|
|
||||||
|
|
||||||
argc = xo_parse_args(argc, argv);
|
argc = xo_parse_args(argc, argv);
|
||||||
if (argc < 0)
|
if (argc < 0)
|
||||||
exit(1);
|
exit(1);
|
||||||
@ -294,7 +262,7 @@ wtmp(void)
|
|||||||
(void) strftime(ct, sizeof(ct), "%+", tm);
|
(void) strftime(ct, sizeof(ct), "%+", tm);
|
||||||
xo_emit("\n{:utxdb/%s}", (file == NULL) ? "utx.log" : file);
|
xo_emit("\n{:utxdb/%s}", (file == NULL) ? "utx.log" : file);
|
||||||
xo_attr("seconds", "%lu", (unsigned long) t);
|
xo_attr("seconds", "%lu", (unsigned long) t);
|
||||||
xo_emit(ctf(" begins {:begins/%s}\n"), ct);
|
xo_emit(" begins {:begins/%s}\n", ct);
|
||||||
xo_close_container("last-information");
|
xo_close_container("last-information");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -411,7 +379,7 @@ printentry(struct utmpx *bp, struct idtab *tt)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
xo_attr("seconds", "%lu", (unsigned long)t);
|
xo_attr("seconds", "%lu", (unsigned long)t);
|
||||||
xo_emit(ctf(" {:login-time/%s%c/%s}"), ct, tt == NULL ? '\n' : ' ');
|
xo_emit(" {:login-time/%s%c/%s}", ct, tt == NULL ? '\n' : ' ');
|
||||||
if (tt == NULL)
|
if (tt == NULL)
|
||||||
goto end;
|
goto end;
|
||||||
if (!tt->logout) {
|
if (!tt->logout) {
|
||||||
@ -425,7 +393,7 @@ printentry(struct utmpx *bp, struct idtab *tt)
|
|||||||
tm = localtime(&tt->logout);
|
tm = localtime(&tt->logout);
|
||||||
(void) strftime(ct, sizeof(ct), "%R", tm);
|
(void) strftime(ct, sizeof(ct), "%R", tm);
|
||||||
xo_attr("seconds", "%lu", (unsigned long)tt->logout);
|
xo_attr("seconds", "%lu", (unsigned long)tt->logout);
|
||||||
xo_emit(ctf("- {:logout-time/%s}"), ct);
|
xo_emit("- {:logout-time/%s}", ct);
|
||||||
}
|
}
|
||||||
delta = tt->logout - bp->ut_tv.tv_sec;
|
delta = tt->logout - bp->ut_tv.tv_sec;
|
||||||
xo_attr("seconds", "%ld", (long)delta);
|
xo_attr("seconds", "%ld", (long)delta);
|
||||||
@ -435,9 +403,9 @@ printentry(struct utmpx *bp, struct idtab *tt)
|
|||||||
tm = gmtime(&delta);
|
tm = gmtime(&delta);
|
||||||
(void) strftime(ct, sizeof(ct), width >= 8 ? "%T" : "%R", tm);
|
(void) strftime(ct, sizeof(ct), width >= 8 ? "%T" : "%R", tm);
|
||||||
if (delta < 86400)
|
if (delta < 86400)
|
||||||
xo_emit(ctf(" ({:session-length/%s})\n"), ct);
|
xo_emit(" ({:session-length/%s})\n", ct);
|
||||||
else
|
else
|
||||||
xo_emit(ctf(" ({:session-length/%ld+%s})\n"),
|
xo_emit(" ({:session-length/%ld+%s})\n",
|
||||||
(long)delta / 86400, ct);
|
(long)delta / 86400, ct);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user