Blob Blame History Raw
/*
    Copyright (C) 2011  ABRT team
    Copyright (C) 2011  RedHat Inc

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License along
    with this program; if not, write to the Free Software Foundation, Inc.,
    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/

#include "internal_libreport.h"

#define LIBREPORT_ISO_DATE_STRING_FORMAT "%Y-%m-%d-%H:%M:%S"

char *iso_date_string(const time_t *pt)
{
    static char buf[sizeof(LIBREPORT_ISO_DATE_STRING_SAMPLE) + 4];

    time_t t;
    struct tm *ptm = localtime(pt ? pt : (time(&t), &t));

    /* Callers expect that %Y is four digits, and size buffers accordingly.
     * For paranoid reasons, disallow insane years which can overflow
     * string buffers.
     */
    if (ptm->tm_year+1900 < 0 || ptm->tm_year+1900 > 9999)
        error_msg_and_die("Year=%d?? Aborting", ptm->tm_year+1900);

    strftime(buf, sizeof(buf), LIBREPORT_ISO_DATE_STRING_FORMAT, ptm);

    return buf;
}

int iso_date_string_parse(const char *date, time_t *pt)
{
    struct tm local;
    const char *r = strptime(date, LIBREPORT_ISO_DATE_STRING_FORMAT, &local);

    if (r == NULL)
    {
        log_warning(_("String doesn't seem to be a date: '%s'"), date);
        return -EINVAL;
    }
    if (*r != '\0')
    {
        log_warning(_("The date: '%s' has unrecognized suffix: '%s'"), date, r);
        return -EINVAL;
    }
    if (local.tm_year < 70)
    {
        log_warning(_("The date: '%s' is out of UNIX time stamp range"), date);
        return -EINVAL;
    }

    // daylight saving time not in use
    local.tm_isdst = 0;

    *pt = mktime(&local);
    return 0;
}