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:
Stephen Heumann 2014-11-05 18:00:35 -06:00
parent c7f9c18893
commit d583686459
2 changed files with 5 additions and 199 deletions

View File

@ -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 */

View File

@ -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);