static int parse_date_str(const string& date_str, utime_t& ut)
{
uint64_t epoch = 0;
+ uint64_t nsec = 0;
if (!date_str.empty()) {
- int ret = parse_date(date_str, &epoch);
+ int ret = parse_date(date_str, &epoch, &nsec);
if (ret < 0) {
cerr << "ERROR: failed to parse date: " << date_str << std::endl;
return -EINVAL;
}
}
- ut = utime_t(epoch, 0);
+ ut = utime_t(epoch, nsec);
return 0;
}
return usage();
}
string parsed_date, parsed_time;
- int r = parse_date(date, NULL, &parsed_date, &parsed_time);
+ int r = parse_date(date, NULL, NULL, &parsed_date, &parsed_time);
if (r < 0) {
cerr << "failure parsing date: " << cpp_strerror(r) << std::endl;
return 1;
int ret;
if (!start_date.empty()) {
- ret = parse_date(start_date, &start_epoch);
+ ret = parse_date(start_date, &start_epoch, NULL);
if (ret < 0) {
cerr << "ERROR: failed to parse start date" << std::endl;
return 1;
}
}
if (!end_date.empty()) {
- ret = parse_date(end_date, &end_epoch);
+ ret = parse_date(end_date, &end_epoch, NULL);
if (ret < 0) {
cerr << "ERROR: failed to parse end date" << std::endl;
return 1;
if (!start_date.empty()) {
- ret = parse_date(start_date, &start_epoch);
+ ret = parse_date(start_date, &start_epoch, NULL);
if (ret < 0) {
cerr << "ERROR: failed to parse start date" << std::endl;
return 1;
}
if (!end_date.empty()) {
- ret = parse_date(end_date, &end_epoch);
+ ret = parse_date(end_date, &end_epoch, NULL);
if (ret < 0) {
cerr << "ERROR: failed to parse end date" << std::endl;
return 1;
#include "common/Clock.h"
#include "common/Formatter.h"
#include "common/perf_counters.h"
+#include "common/strtol.h"
#include "include/str_list.h"
#include "auth/Crypto.h"
return 0;
}
-int parse_date(const string& date, uint64_t *epoch, string *out_date, string *out_time)
+int parse_date(const string& date, uint64_t *epoch, uint64_t *nsec, string *out_date, string *out_time)
{
struct tm tm;
memset(&tm, 0, sizeof(tm));
+ if (nsec)
+ *nsec = 0;
const char *p = strptime(date.c_str(), "%Y-%m-%d", &tm);
if (p) {
if (*p == ' ') {
p++;
- if (!strptime(p, " %H:%M:%S", &tm))
+ p = strptime(p, " %H:%M:%S", &tm);
+ if (!p)
return -EINVAL;
+ if (nsec && *p == '.') {
+ ++p;
+ unsigned i;
+ char buf[10]; /* 9 digit + null termination */
+ for (i = 0; (i < sizeof(buf) - 1) && isdigit(*p); ++i, ++p) {
+ buf[i] = *p;
+ }
+ for (; i < sizeof(buf) - 1; ++i) {
+ buf[i] = '0';
+ }
+ buf[i] = '\0';
+ string err;
+ *nsec = (uint64_t)strict_strtol(buf, 10, &err);
+ if (!err.empty()) {
+ return -EINVAL;
+ }
+ }
}
} else {
return -EINVAL;
extern int parse_time(const char *time_str, time_t *time);
extern bool parse_rfc2616(const char *s, struct tm *t);
extern bool parse_iso8601(const char *s, struct tm *t);
-extern int parse_date(const string& date, uint64_t *epoch, string *out_date = NULL, string *out_time = NULL);
+extern int parse_date(const string& date, uint64_t *epoch, uint64_t *nsec, string *out_date = NULL, string *out_time = NULL);
extern string rgw_trim_whitespace(const string& src);
extern string rgw_trim_quotes(const string& val);
return 0;
}
- uint64_t epoch;
+ uint64_t epoch, usec;
- int r = parse_date(sval, &epoch);
+ int r = parse_date(sval, &epoch, &usec);
if (r < 0)
return r;
- *val = utime_t(epoch, 0);
+ *val = utime_t(epoch, usec);
return 0;
}
return 0;
}
- int r = parse_date(date, epoch);
+ int r = parse_date(date, epoch, NULL);
if (r < 0)
return r;
static int parse_date_str(string& in, utime_t& out) {
uint64_t epoch = 0;
+ uint64_t nsec = 0;
if (!in.empty()) {
- if (parse_date(in, &epoch) < 0) {
+ if (parse_date(in, &epoch, &nsec) < 0) {
dout(5) << "Error parsing date " << in << dendl;
return -EINVAL;
}
}
- out = utime_t(epoch, 0);
+ out = utime_t(epoch, nsec);
return 0;
}