linux/fs/isofs/util.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 *  linux/fs/isofs/util.c
   4 */
   5
   6#include <linux/time.h>
   7#include "isofs.h"
   8
   9/* 
  10 * We have to convert from a MM/DD/YY format to the Unix ctime format.
  11 * We have to take into account leap years and all of that good stuff.
  12 * Unfortunately, the kernel does not have the information on hand to
  13 * take into account daylight savings time, but it shouldn't matter.
  14 * The time stored should be localtime (with or without DST in effect),
  15 * and the timezone offset should hold the offset required to get back
  16 * to GMT.  Thus  we should always be correct.
  17 */
  18
  19int iso_date(u8 *p, int flag)
  20{
  21        int year, month, day, hour, minute, second, tz;
  22        int crtime;
  23
  24        year = p[0];
  25        month = p[1];
  26        day = p[2];
  27        hour = p[3];
  28        minute = p[4];
  29        second = p[5];
  30        if (flag == 0) tz = p[6]; /* High sierra has no time zone */
  31        else tz = 0;
  32        
  33        if (year < 0) {
  34                crtime = 0;
  35        } else {
  36                crtime = mktime64(year+1900, month, day, hour, minute, second);
  37
  38                /* sign extend */
  39                if (tz & 0x80)
  40                        tz |= (-1 << 8);
  41                
  42                /* 
  43                 * The timezone offset is unreliable on some disks,
  44                 * so we make a sanity check.  In no case is it ever
  45                 * more than 13 hours from GMT, which is 52*15min.
  46                 * The time is always stored in localtime with the
  47                 * timezone offset being what get added to GMT to
  48                 * get to localtime.  Thus we need to subtract the offset
  49                 * to get to true GMT, which is what we store the time
  50                 * as internally.  On the local system, the user may set
  51                 * their timezone any way they wish, of course, so GMT
  52                 * gets converted back to localtime on the receiving
  53                 * system.
  54                 *
  55                 * NOTE: mkisofs in versions prior to mkisofs-1.10 had
  56                 * the sign wrong on the timezone offset.  This has now
  57                 * been corrected there too, but if you are getting screwy
  58                 * results this may be the explanation.  If enough people
  59                 * complain, a user configuration option could be added
  60                 * to add the timezone offset in with the wrong sign
  61                 * for 'compatibility' with older discs, but I cannot see how
  62                 * it will matter that much.
  63                 *
  64                 * Thanks to kuhlmav@elec.canterbury.ac.nz (Volker Kuhlmann)
  65                 * for pointing out the sign error.
  66                 */
  67                if (-52 <= tz && tz <= 52)
  68                        crtime -= tz * 15 * 60;
  69        }
  70        return crtime;
  71}               
  72