mirror of
https://github.com/sheumann/hush.git
synced 2025-02-03 23:34:27 +00:00
Disable functionality for printing the time in the shell's prompt. This required strftime(), which is missing in GNO 2.0.6.
It would have been possible to add a version of strftime(), but it didn't seem worth it for this little bit of functionality. It should also be possible to get similar functionality by invoking an external program like "date" in PS1.
This commit is contained in:
parent
c7f9c18893
commit
d583686459
@ -1867,6 +1867,7 @@ static void parse_and_put_prompt(const char *prmt_ptr)
|
||||
case '$':
|
||||
c = (geteuid() == 0 ? '#' : '$');
|
||||
break;
|
||||
#ifndef __GNO__
|
||||
case 'T': /* 12-hour HH:MM:SS format */
|
||||
case '@': /* 12-hour am/pm format */
|
||||
case 'A': /* 24-hour HH:MM format */
|
||||
@ -1875,6 +1876,7 @@ static void parse_and_put_prompt(const char *prmt_ptr)
|
||||
strftime_HHMMSS(timebuf, sizeof(timebuf), NULL)[-3] = '\0';
|
||||
pbuf = timebuf;
|
||||
break;
|
||||
#endif
|
||||
# if ENABLE_USERNAME_OR_HOMEDIR
|
||||
case 'w': /* current dir */
|
||||
case 'W': /* basename of cur dir */
|
||||
|
202
libbb/time.c
202
libbb/time.c
@ -8,205 +8,7 @@
|
||||
*/
|
||||
#include "libbb.h"
|
||||
|
||||
void FAST_FUNC parse_datestr(const char *date_str, struct tm *ptm)
|
||||
{
|
||||
char end = '\0';
|
||||
const char *last_colon = strrchr(date_str, ':');
|
||||
|
||||
if (last_colon != NULL) {
|
||||
/* Parse input and assign appropriately to ptm */
|
||||
#if ENABLE_DESKTOP
|
||||
const char *endp;
|
||||
#endif
|
||||
|
||||
/* HH:MM */
|
||||
if (sscanf(date_str, "%u:%u%c",
|
||||
&ptm->tm_hour,
|
||||
&ptm->tm_min,
|
||||
&end) >= 2
|
||||
) {
|
||||
/* no adjustments needed */
|
||||
} else
|
||||
/* mm.dd-HH:MM */
|
||||
if (sscanf(date_str, "%u.%u-%u:%u%c",
|
||||
&ptm->tm_mon, &ptm->tm_mday,
|
||||
&ptm->tm_hour, &ptm->tm_min,
|
||||
&end) >= 4
|
||||
) {
|
||||
/* Adjust month from 1-12 to 0-11 */
|
||||
ptm->tm_mon -= 1;
|
||||
} else
|
||||
/* yyyy.mm.dd-HH:MM */
|
||||
if (sscanf(date_str, "%u.%u.%u-%u:%u%c", &ptm->tm_year,
|
||||
&ptm->tm_mon, &ptm->tm_mday,
|
||||
&ptm->tm_hour, &ptm->tm_min,
|
||||
&end) >= 5
|
||||
/* yyyy-mm-dd HH:MM */
|
||||
|| sscanf(date_str, "%u-%u-%u %u:%u%c", &ptm->tm_year,
|
||||
&ptm->tm_mon, &ptm->tm_mday,
|
||||
&ptm->tm_hour, &ptm->tm_min,
|
||||
&end) >= 5
|
||||
) {
|
||||
ptm->tm_year -= 1900; /* Adjust years */
|
||||
ptm->tm_mon -= 1; /* Adjust month from 1-12 to 0-11 */
|
||||
} else
|
||||
#if ENABLE_DESKTOP /* strptime is BIG: ~1k in uclibc, ~10k in glibc */
|
||||
/* month_name d HH:MM:SS YYYY. Supported by GNU date */
|
||||
if ((endp = strptime(date_str, "%b %d %T %Y", ptm)) != NULL
|
||||
&& *endp == '\0'
|
||||
) {
|
||||
return; /* don't fall through to end == ":" check */
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
bb_error_msg_and_die(bb_msg_invalid_date, date_str);
|
||||
}
|
||||
if (end == ':') {
|
||||
/* xxx:SS */
|
||||
if (sscanf(last_colon + 1, "%u%c", &ptm->tm_sec, &end) == 1)
|
||||
end = '\0';
|
||||
/* else end != NUL and we error out */
|
||||
}
|
||||
} else
|
||||
if (strchr(date_str, '-')
|
||||
/* Why strchr('-') check?
|
||||
* sscanf below will trash ptm->tm_year, this breaks
|
||||
* if parse_str is "10101010" (iow, "MMddhhmm" form)
|
||||
* because we destroy year. Do these sscanf
|
||||
* only if we saw a dash in parse_str.
|
||||
*/
|
||||
/* yyyy-mm-dd HH */
|
||||
&& (sscanf(date_str, "%u-%u-%u %u%c", &ptm->tm_year,
|
||||
&ptm->tm_mon, &ptm->tm_mday,
|
||||
&ptm->tm_hour,
|
||||
&end) >= 4
|
||||
/* yyyy-mm-dd */
|
||||
|| sscanf(date_str, "%u-%u-%u%c", &ptm->tm_year,
|
||||
&ptm->tm_mon, &ptm->tm_mday,
|
||||
&end) >= 3
|
||||
)
|
||||
) {
|
||||
ptm->tm_year -= 1900; /* Adjust years */
|
||||
ptm->tm_mon -= 1; /* Adjust month from 1-12 to 0-11 */
|
||||
} else
|
||||
if (date_str[0] == '@') {
|
||||
time_t t = bb_strtol(date_str + 1, NULL, 10);
|
||||
if (!errno) {
|
||||
struct tm *lt = localtime(&t);
|
||||
if (lt) {
|
||||
*ptm = *lt;
|
||||
return;
|
||||
}
|
||||
}
|
||||
end = '1';
|
||||
} else {
|
||||
/* Googled the following on an old date manpage:
|
||||
*
|
||||
* The canonical representation for setting the date/time is:
|
||||
* cc Century (either 19 or 20)
|
||||
* yy Year in abbreviated form (e.g. 89, 06)
|
||||
* mm Numeric month, a number from 1 to 12
|
||||
* dd Day, a number from 1 to 31
|
||||
* HH Hour, a number from 0 to 23
|
||||
* MM Minutes, a number from 0 to 59
|
||||
* .SS Seconds, a number from 0 to 61 (with leap seconds)
|
||||
* Everything but the minutes is optional
|
||||
*
|
||||
* "touch -t DATETIME" format: [[[[[YY]YY]MM]DD]hh]mm[.ss]
|
||||
* Some, but not all, Unix "date DATETIME" commands
|
||||
* move [[YY]YY] past minutes mm field (!).
|
||||
* Coreutils date does it, and SUS mandates it.
|
||||
* (date -s DATETIME does not support this format. lovely!)
|
||||
* In bbox, this format is special-cased in date applet
|
||||
* (IOW: this function assumes "touch -t" format).
|
||||
*/
|
||||
unsigned cur_year = ptm->tm_year;
|
||||
int len = strchrnul(date_str, '.') - date_str;
|
||||
|
||||
/* MM[.SS] */
|
||||
if (len == 2 && sscanf(date_str, "%2u%2u%2u%2u""%2u%c" + 12,
|
||||
&ptm->tm_min,
|
||||
&end) >= 1) {
|
||||
} else
|
||||
/* HHMM[.SS] */
|
||||
if (len == 4 && sscanf(date_str, "%2u%2u%2u""%2u%2u%c" + 9,
|
||||
&ptm->tm_hour,
|
||||
&ptm->tm_min,
|
||||
&end) >= 2) {
|
||||
} else
|
||||
/* ddHHMM[.SS] */
|
||||
if (len == 6 && sscanf(date_str, "%2u%2u""%2u%2u%2u%c" + 6,
|
||||
&ptm->tm_mday,
|
||||
&ptm->tm_hour,
|
||||
&ptm->tm_min,
|
||||
&end) >= 3) {
|
||||
} else
|
||||
/* mmddHHMM[.SS] */
|
||||
if (len == 8 && sscanf(date_str, "%2u""%2u%2u%2u%2u%c" + 3,
|
||||
&ptm->tm_mon,
|
||||
&ptm->tm_mday,
|
||||
&ptm->tm_hour,
|
||||
&ptm->tm_min,
|
||||
&end) >= 4) {
|
||||
/* Adjust month from 1-12 to 0-11 */
|
||||
ptm->tm_mon -= 1;
|
||||
} else
|
||||
/* yymmddHHMM[.SS] */
|
||||
if (len == 10 && sscanf(date_str, "%2u%2u%2u%2u%2u%c",
|
||||
&ptm->tm_year,
|
||||
&ptm->tm_mon,
|
||||
&ptm->tm_mday,
|
||||
&ptm->tm_hour,
|
||||
&ptm->tm_min,
|
||||
&end) >= 5) {
|
||||
/* Adjust month from 1-12 to 0-11 */
|
||||
ptm->tm_mon -= 1;
|
||||
if ((int)cur_year >= 50) { /* >= 1950 */
|
||||
/* Adjust year: */
|
||||
/* 1. Put it in the current century */
|
||||
ptm->tm_year += (cur_year / 100) * 100;
|
||||
/* 2. If too far in the past, +100 years */
|
||||
if (ptm->tm_year < cur_year - 50)
|
||||
ptm->tm_year += 100;
|
||||
/* 3. If too far in the future, -100 years */
|
||||
if (ptm->tm_year > cur_year + 50)
|
||||
ptm->tm_year -= 100;
|
||||
}
|
||||
} else
|
||||
/* ccyymmddHHMM[.SS] */
|
||||
if (len == 12 && sscanf(date_str, "%4u%2u%2u%2u%2u%c",
|
||||
&ptm->tm_year,
|
||||
&ptm->tm_mon,
|
||||
&ptm->tm_mday,
|
||||
&ptm->tm_hour,
|
||||
&ptm->tm_min,
|
||||
&end) >= 5) {
|
||||
ptm->tm_year -= 1900; /* Adjust years */
|
||||
ptm->tm_mon -= 1; /* Adjust month from 1-12 to 0-11 */
|
||||
} else {
|
||||
bb_error_msg_and_die(bb_msg_invalid_date, date_str);
|
||||
}
|
||||
if (end == '.') {
|
||||
/* xxx.SS */
|
||||
if (sscanf(strchr(date_str, '.') + 1, "%u%c",
|
||||
&ptm->tm_sec, &end) == 1)
|
||||
end = '\0';
|
||||
/* else end != NUL and we error out */
|
||||
}
|
||||
}
|
||||
if (end != '\0') {
|
||||
bb_error_msg_and_die(bb_msg_invalid_date, date_str);
|
||||
}
|
||||
}
|
||||
|
||||
time_t FAST_FUNC validate_tm_time(const char *date_str, struct tm *ptm)
|
||||
{
|
||||
time_t t = mktime(ptm);
|
||||
if (t == (time_t) -1L) {
|
||||
bb_error_msg_and_die(bb_msg_invalid_date, date_str);
|
||||
}
|
||||
return t;
|
||||
}
|
||||
#ifndef __GNO__
|
||||
|
||||
static char* strftime_fmt(char *buf, unsigned len, time_t *tp, const char *fmt)
|
||||
{
|
||||
@ -229,6 +31,8 @@ char* FAST_FUNC strftime_YYYYMMDDHHMMSS(char *buf, unsigned len, time_t *tp)
|
||||
return strftime_fmt(buf, len, tp, "%Y-%m-%d %H:%M:%S");
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
unsigned long FAST_FUNC monotonic_sec(void)
|
||||
{
|
||||
return time(NULL);
|
||||
|
Loading…
x
Reference in New Issue
Block a user