home *** CD-ROM | disk | FTP | other *** search
/ ftp.wwiv.com / ftp.wwiv.com.zip / ftp.wwiv.com / pub / MISC / Y2KTOOL5.ZIP / year2000.txt < prev   
Text File  |  2000-01-09  |  31KB  |  662 lines

  1. Y2KTOOLS Release 5 compiled by Tobias Ernst @ 2:2476/418
  2. --------------------------------------------------------
  3.  
  4. Contents
  5.  
  6. 0. What's new in this package.
  7. 1. Overview.
  8. 2. Where date stamps are used in Fidonet.
  9. 3. Using the tools to examine your system for Y2K readiness.
  10. 4. Recompiling the tools for other platforms.
  11. 5. Programmer's Note: How to correctly use a 2 digit date stamp.
  12.  
  13.  
  14. 0. What's new in this package
  15. ----------------------------
  16.  
  17. See the file HISTORY for more information.
  18.  
  19. If you are only interested in installing the pktdate fix utility, you must
  20. not necessarily continue to read year2000.txt, but can step over to
  21. pktdate.txt, although year2000.txt provides quite some useful background.
  22.  
  23. 1. Overview
  24. -----------
  25.  
  26. This package contains information on Fidonet Year 2000 issues.  It
  27. describes general problems that may occur from the year 2000 on in various
  28. fidonet file formats.  Tools are provided that you can use to examine
  29. various fidonet files (a Squish base, a JAM base, a PKT file, a MSG file)
  30. to determine if the programs that you use will fill in the various date
  31. fields correctly after the year of 2000.
  32.  
  33. It is necessary that you use the tools provided in this packages to examine
  34. that date stamps of your mail files, because mostly, a fidonet mail has
  35. more than one timestamp.  Not all fidonet readers display all timestamps
  36. that are contained a fidonet mail.  Most choose only one to display and
  37. ignore the others.  So it can happen that some program of yours fills
  38. garbage into some date stamp field, but you won't notice it because your
  39. reader ignores it.  (Only your down- or uplinks will notice it if they get
  40. a grunged packet from you ...).
  41.  
  42. This package does NOT provide a list of programs that are proven to be Y2K
  43. compliant or not. Such a list will be provided separately at a later time.
  44. German users will find Daniel Friedmann's list a valuable ressource.  It is
  45. posted periodically in FIDO2000.GER.
  46.  
  47. You may freely redistribute the contents of this package, but if you do any
  48. modifications, or have any critics or suggestions, please submit them to me.
  49.  
  50.  
  51. 2. Where date stamps are used in Fidonet
  52. ----------------------------------------
  53.  
  54.   2.1 Date stamp formats
  55.   ----------------------
  56.  
  57.   You may skip to section 2.2 or chapter 3 if you are not interested in
  58.   these details.
  59.  
  60.     2.1.1 The FTSC time stamp
  61.     -------------------------
  62.  
  63.     The FTSC time stamp is a 20 bytes character string.  It is supposed to be
  64.     filled in as follows:
  65.  
  66.        "dd mmm yy  hh:mm:ss" plus a trailing zero byte
  67.  
  68.     where
  69.  
  70.        dd       is the day number
  71.        mmm      is a three character abbreviation of the month name
  72.        yy       is a two digit (!) year number
  73.        hh:mm:ss is the time
  74.  
  75.     Example:
  76.  
  77.         01 Jan 98  22:10:05
  78.         22 Jun 10  08:00:00
  79.  
  80.     The FTSC time stamp occurs in various file formats, among them PKT,
  81.     MSG and Squish SQD files.  The most common problem with it is that
  82.     programs erroneously write a three digit number into the year field in
  83.     the year 2000 (i.E. they write 100 there instead of 00), which spills
  84.     the 20 character field and can yield undefined behaviour of other
  85.     programs reading this file.
  86.  
  87.     On the other hand, the FTSC time stamp is the only time stamp used in
  88.     fidonet, that in theory can be used for eternity without a day problem.
  89.     If you are a programmer that implements FTSC time stamps, please read
  90.     chapter 5.  A lots of programmers that nowadays are fixing Y2K problems
  91.     are fixing them in a wrong way (i.E., they are only delaying the
  92.     problem for 50 or 80 years).  Chapter 5 describes how you can fix a Y2K
  93.     problem with a 2 digit year number permanently.
  94.  
  95.  
  96.     2.1.2 The UNIX time_t
  97.     ---------------------
  98.  
  99.     The UNIX time_t is a 32 bit integer value that counts the numbers of
  100.     seconds that have passed since the beginning of the epoch, which is 01
  101.     Jan 1970.  The UNIX time_t is uncritical during the millennium
  102.     transition from 1999 to 2000, but it will have an overflow in 2038 (or
  103.     so).  In the UNIX world, this problem is expected to be solved by
  104.     expanding the integer to 64 bit.
  105.  
  106.     UNIX time_t timestamps are used in the JAM message base, for example.
  107.  
  108.  
  109.     2.1.3 The struct _stamp
  110.     -----------------------
  111.  
  112.     The struct _stamp is a 32 bit integer in packed format that is defined
  113.     as follows:
  114.  
  115.     Bits  0 ..  4: day number               (1 .. 31)
  116.     Bits  5 ..  8: month number             (1 .. 12)
  117.     Bits  9 .. 15: years passed since 1980  (0 .. 127)
  118.     Bits 16 .. 20: second divided by  2     (0 .. 29)
  119.     Bits 21 .. 26: minute                   (0 .. 59)
  120.     Bits 27 .. 31: hour                     (0 .. 23)
  121.  
  122.     The struct _stamp is generally stored in little endian notation (least
  123.     significant byte comes first), and "Bit 0" in the table above refers to
  124.     the least significant bit.
  125.  
  126.     The struct _stamp is used in Squish SQD files, and as "Opus Date" in
  127.     *.MSG files. It is safe  until the year of 2107. Then it will have an
  128.     overflow.
  129.  
  130.  
  131.     2.1.4 Packet header format
  132.     --------------------------
  133.  
  134.     This timestamp format is used in the PKT file header.  It is simply a
  135.     sequence of three 16 bit integers stored in little endian notation.
  136.     The first describes the year (e.g.  1998 or 2001), the second describes
  137.     the month (1 .. 12) and the third describes the day (1..31).
  138.  
  139.  
  140.  
  141.   2.2 File formats
  142.   -----------------
  143.  
  144.     2.2.1 PKT files
  145.     ---------------
  146.  
  147.       A fidonet PKT file contains a packet header and one or more packed
  148.       messages.  It is the file format that is used for exchanging mail
  149.       between two fidonet nodes.  In order to maintain operability of
  150.       fidonet, it is absolutely mandatory that you assure that your system
  151.       will emit correct date stamps in outgoing PKT files!!!
  152.  
  153.       A PKT file contains a header time stamp in the Packet header
  154.       timestamp format (see 2.1.4) at offset 4, which denotes the packet
  155.       creation date.  It is not of much significance, but should be correct
  156.       anyway.
  157.  
  158.       Each message stored in a PKT file contains a packed message header.
  159.       Inside this packed header, at offset 0Eh, a FTSC time stamp (see
  160.       2.1.1) is stored. An incorrect FTSC time stamp at this place is the
  161.       most common source of problems.
  162.  
  163.       For a detailed description of the PKT file format, refer to FTSC-0001.
  164.  
  165.       To sum it up:  A PKT file contains a header date field and a date
  166.       field for each individual message stored inside the PKT file.
  167.  
  168.     2.2.2 Fido *.MSG files
  169.     ----------------------
  170.  
  171.       The most simplest form of fidonet message base is a message base in
  172.       Fido *.MSG format.  Each folder (netmail area, echomail area) is
  173.       represented by a separate subdirectory, and each of these
  174.       subdirectories contains a separate file in *.MSG format for each
  175.       message stored in the area.  Today, the most common usage of *.MSG is
  176.       as Fastecho's primary netmail folder.
  177.  
  178.       A *.MSG type message contains three timestamps.  First, there is the
  179.       20 byte FTSC time stamp (see 2.1.1) of the mail at offset 090h.  A
  180.       lot of programs today interpret and/or write this time stamp
  181.       incorrectly after Y2K, which is a serious problem, because this
  182.       timestamp will usually be promoted into the outbound PKT file
  183.       *unchanged* by your tosser, so that you will created PKT files with
  184.       grunged date field.
  185.  
  186.       Then, a *.MSG type message can contain two more timestamps, the so
  187.       called "Opus time stamps".  These are extensions that were not
  188.       originally suggested by FTS-0001, but are commonly used by today's
  189.       software.  Both opus time stamps are in the struct _stamp format (see
  190.       2.1.3).
  191.  
  192.       The first opus timestamp at offset 0B0h contains the date when the
  193.       message was written.  It should normally show the same date as the
  194.       FTSC time stamp.  The second opus timestamp at offset 0B4h contains
  195.       the date when the message has arrived at *your* system.  Thus, this
  196.       field is always filled in by *your* tosser, even if the message has
  197.       been created on a remote system.
  198.  
  199.       To sum it up, a *.MSG-format file contains three timestamps:  The
  200.       FTSC "written" timestamp, the Opus "written" timestamp, and the Opus
  201.       "arrived" timestamp.
  202.  
  203.       Each available fidonet reader uses only one of these timestamps, so
  204.       you should not trust your reader's display when you try to examine
  205.       your system, but rather use the tools provided in this archive.
  206.  
  207.     2.2.3 The Squish Message Base
  208.     -----------------------------
  209.  
  210.       I won't explain the details of the Squish Message Base structure,
  211.       because they are very complicated.  A Squish Message Base stores three
  212.       files for each area (netmail or echomail).  If you access a Squish
  213.       Message Base via the SMAPI, the MSGAPI, or own-written code, you can
  214.       obtain three timestamps for a message, much in analogy to a *.MSG
  215.       message base.
  216.  
  217.       First, each message stored in a Squish SQD file contains a FTSC type
  218.       timestamp (see 2.1.1), that normally should only be set by the reader
  219.       when writing a message and be promoted as is by the tosser to a PKT
  220.       file.  Here again, the problem arises that some fidonet readers create
  221.       incorrect FTSC type time stamps.
  222.  
  223.       Then, each message contains a binary "written" and a binary "arrived"
  224.       date field.  Both of these fields are stored in the struct _stamp
  225.       format (see 2.1.3).
  226.  
  227.       To sum it up, each message inside a squish echo- oder netmail area
  228.       has three timestamps:  FTSC "written" date, "Squish written" date,
  229.       and "Squish arrived" date.
  230.  
  231.       Each available fidonet reader uses only one of these timestamps, so
  232.       you should not trust your reader's display when you try to examine
  233.       your system, but rather use the tools provided in this archive.
  234.  
  235.     2.2.4 The JAM Base
  236.     ------------------
  237.  
  238.       The JAM message base type itself uses UNIX timestamps.  These do not
  239.       have an overflow at 1.1.2000 (but they have one in January 2038).
  240.       The JAM message base type as for itself will not trigger any
  241.       particular problems, but of course, if any program gets wrong dates
  242.       from another source (or because of an internal bug), it can still
  243.       store wrong dates to the JAM message base.
  244.  
  245.     2.2.5 The Hudson/QuickBBS Base
  246.     ------------------------------
  247.  
  248.       I don't have exact information on this message base type yet.
  249.       However, if you use a hex editor, you will see that it stores a
  250.       textual date similar to the FTSC date, but in a different format.
  251.       Thus, it will have similar problems with editors writing grunged
  252.       three-digit year numbers.
  253.  
  254.  
  255. 3. Using the tools to examine your system for Y2K readiness
  256. -----------------------------------------------------------
  257.  
  258.   3.1 What tools are provided?
  259.   ----------------------------
  260.  
  261.   This archive provides the following three tools:
  262.  
  263.   pktdate  will show all date stamps occurring in a PKT file
  264.            Invoke it with the filename of a PKT file as parameter.
  265.            It can also be used as a PKT filter that automatically
  266.            corrects broken PKT files (!). See pktdate.txt for more info.
  267.  
  268.   msgdate  will show all date stamps occurring in a MSG file
  269.            Invoke it with the filename of a .MSG file as parameter.
  270.  
  271.   sqdate   will show all date stamps occurring in a squish base.
  272.            Invoke it with the base filename of the squish area (as
  273.            defined in squish.cfg) as parameter.
  274.  
  275.   jamdate  will show all date stamps occuring in a JAM message base.
  276.            Invoke it with the base filename of the JAM area (as
  277.            defined in FESETUP, or wherever you defined it, i.E. without
  278.            the .J?? filename extension) as parameter.
  279.  
  280.   You will find precompiled versions for the most popular operating systems
  281.   in the corresponding subdirectories.
  282.  
  283.   3.2 Testing the outbound path
  284.   -----------------------------
  285.  
  286.   At first, you should test if mails that you create after the year 2000
  287.   will have correct date stamps. To do so, proceed as follows:
  288.  
  289.   1. Shut down your mailers. Shut down any schedulers/crons that are running.
  290.      Shut down any other services that might be affected by sudden date
  291.      switches.  Basically, make sure that nothing is running on your system
  292.      that does not have to be.
  293.  
  294.   2. Let your tosser export all messages that are still unexported in your
  295.      message base, and let it toss everything that still might be dangling
  296.      around in the inbound.  We don't want to get important mail with wrong
  297.      timestamps :-).
  298.  
  299.   3. If you use sophisticated log file analysis utilities, make a backup
  300.      copy of the relevant log files.
  301.  
  302.   4. Create a new empty area in the Fido *.MSG format.  (You will probably
  303.      have to create a subdirectory manually, and add an entry for this area
  304.      into your tosser configuration file).  For the following, I will
  305.      assume that the path of the subdirectory is e:\msgbase\y2ktest\ .
  306.  
  307.   5. Create a new empty area in the Squish message format. (You will
  308.      probably only have to add an entry for this area to your tosser
  309.      configuration file).  For the following, I will asume that the files
  310.      for the squish area have a base name of e:\msgbase\y2ksq, that is, the
  311.      files will be named e:\msgbase\y2ksq.sqd and so on as soon as the area
  312.      will be created.
  313.  
  314.   6. Create a new empty area in the JAM message base format, if you use
  315.      this. I will assume a base name of e:\msgbase\y2kjam in the follwing,
  316.      i.E. the files will be named e:\msgbase\y2kjam.jhr, y2kjam.jdt and so
  317.      forth.
  318.  
  319.   7. If you are using other message base formats, create an empty folder
  320.      for each of them as well.  We have no tools yet to examine these
  321.      message bases directly, but we will at least be able to examine the
  322.      output PKT file.
  323.  
  324.   8. Switch the system to a date in the new millennium. It is better not to
  325.      use 1/1/2000, but something more creative like 1/4/2003 or anything.
  326.  
  327.   9. Use your favourite mail editor, and any other mail editors that are
  328.      used on your system (don't forget your BBS), to write a new message
  329.      into each of the folders created during steps 2 and 3.  Write one
  330.      message for each editor that is used on your system.
  331.  
  332.  10. In order to examine the dates in the *.MSG folder, change to the
  333.      directory that you have created (e.g. e:\msgbase\y2ktest), and type
  334.      "dir". You will probably see something like the following:
  335.  
  336.      1.01.10   8.00        345           0  1.msg
  337.      1.01.10   1.25          2           0  lastread
  338.  
  339.      Then apply the "msgdate" program from this archive to each of the
  340.      files ending with *.MSG in this directory.  A correct output should
  341.      look similar to this one:
  342.  
  343.      [E:\msgbase\y2ktest]e:\y2ktools\msgdate 1.msg
  344.      File: 1.msg
  345.            FTSC-Date             Opus Written Date     Opus Arrived Date
  346.            01 Jan 10 01:25:21    01.01.2010, 01:25:20  01.01.2010, 08:00:12
  347.  
  348.      Check if the dates are correct.  Especially, check if the FTSC-Date
  349.      has a two digit year number (as shown above).  Check if the Opus
  350.      Written Date matches the FTSC date.  The Opus Arrived Date is not so
  351.      important, because the message has not yet arrived anywhere.
  352.  
  353.      Repeat this step for very .MSG file you find in this directory.
  354.  
  355.   11. Apply the sqdate program to the squish area that you have created.
  356.      If you used the path names I gave as an example above, you would type
  357.      the following command:
  358.  
  359.         sqdate e:\msgbase\y2ksq
  360.  
  361.      A correct output should look similar to the following:
  362.  
  363.      Area: y2ksq
  364.       Msg# FTSC-Date             Squish Written Date   Squish Arrived Date
  365.          1 01 Jan 10  17:32:04   01.01.2010, 17:32:04  01.01.2010, 17:32:04
  366.          3 01 Jan 10  17:40:12   01.01.2010, 17:40:12  01.01.2010, 17:40:12
  367.  
  368.      Again, check all the dates. The FTSC date field should have *two* digit
  369.      year numbers, the other dates should have *four* digit ones.
  370.  
  371.   12. If applicable, apply the jamdate program to the jam area that you have
  372.      created. If you used the path names I gave as an example above, you
  373.      would type the following command:
  374.  
  375.         jamdate e:\msgbase\y2kjam
  376.  
  377.      A correct output should look similar to the following:
  378.  
  379.      File: e:\msgbase\y2kjam.jhr
  380.       Msg# Date Written            Date Received           Date Processed
  381.          4 20 Nov 1999  23:46:56
  382.  
  383.      Please not that for *JAM*, *ALL* date stamps *MUST* have a four digit
  384.      year number. The "Received" and "Processed" time stamps are allowed to
  385.      be empty, but if they aren't, they must be valid, i.E. have the same
  386.      format as the "Written" time stamp.
  387.  
  388.   13. Now, you have to export the message you have written.  If the areas
  389.      you have created were echomail areas, you have to define one downlink
  390.      for this area.  Use your sysop point, if you have one, or create a
  391.      dummy point number and link the area to this dummy point.  The system
  392.      that you choose to connect to your test area should presently not have
  393.      any pending outbound mail, in order to make it easier for you to find
  394.      the PKT files that were newly created.
  395.  
  396.      Then instruct your tosser to export the newly written messages.
  397.  
  398.   14. Now, you have to locate the PKT files that your tosser created.  This
  399.      largely depends on what mailer system you are using.  If you are using
  400.      arcmail attach (Frontdoor or similar), you will have a netmail
  401.      message in your primary netmail folder that has an arcmail file
  402.      attached.  Locate this file and unzip it.
  403.  
  404.      If you have a binkley outbound, then you either know how to find files
  405.      in it because you're an expert, or you can use an outbound manager to
  406.      locate the arcmail file, unzip it, and copy the unzipped PKT files to
  407.      a temporary directory.
  408.  
  409.      In order to verify that you have found the right PKT files, you should
  410.      perhaps use a PKT viewer, a hexdump tool or in the worst case the
  411.      "type" command to check if the message text inside the PKT file is the
  412.      same text that you typed in your test messages.
  413.  
  414.  15. Now, apply the pktdate command to the pkt file.  A correct output
  415.      should  look similar to the following:
  416.  
  417.      [e:\temp] pktdate 12832abc.pkt
  418.      Packet: 12832abc.pkt
  419.      Packet header date (D/M/Y): 01.01.2010
  420.       Msg# FTSC-Date
  421.          1 01 Jan 10  17:32:04
  422.          2 01 Jan 10  17:40:12
  423.  
  424.      Verify that the dates are correct (i.E. 2 digit year numbers in the
  425.      FTSC date field, and the correct four digit year number in the packet
  426.      header date.
  427.  
  428.  16. Don't forget to reset your system clock to the current true date, and
  429.      restart your mailers and everything you had shut down in step 1.  If
  430.      you are using sophisticated log file analysis tools, you should,
  431.      before restarting the mailers, also restore backup copies of your log
  432.      files now, or just delete the current log files, because some of the
  433.      tools will have written dates in the future to the log files during
  434.      the tests that you did, and this could be a problem for the log file
  435.      analysis tools.
  436.  
  437.   If all tests described above succeeded, you can be relatively sure that
  438.   your system is Y2K safe.  BTW, in the text above, I suggested to use
  439.   echomail areas for testing.  If you use a netmail tracker, you should
  440.   repeat the steps above with netmail areas in order to verify the tracker.
  441.   I assume that if you use a netmail tracker, you are an expert and know
  442.   which files in which format are created at which state of the exporting
  443.   process, so you can decide to apply which of my programs at what time on
  444.   your own.
  445.  
  446.  
  447.   3.3 Testing the inbound path
  448.   ----------------------------
  449.  
  450.   In order to check if your system is able to correctly process mail that
  451.   is coming to your system and has correct date fields that indicate a year
  452.   of 2000 or above, proceed as follows:
  453.  
  454.   1. You need some PKT files that have been generated in a process similar
  455.      to 3.2 and contain correct date fields.  I.E., you need an arcmail
  456.      packet that contains mails that have been created with a system date
  457.      of 2000 or later, and that have been created with Y2k-ready software.
  458.      Preferably, these mails should be echomails in a test-echo that does
  459.      not exist in reality, like "Y2K".
  460.  
  461.      The best way to obtain these files is to setup a "sysop point" system
  462.      that uses Y2K-ready software.  In order to get the files, you would
  463.      shut down your node system's scheduler or tosser task.  If you spawn
  464.      your tosser from your mailer, you should temporarily modify the mailer
  465.      config in order NOT to spawn the tosser.  Then send the arcmail file
  466.      from the sysop point to the node.  The mailer will store it in its
  467.      inbound or protected inbound directory, from where you should move it
  468.      to a temporary directory.
  469.  
  470.   2. Once you have a file containing messages like that, no matter how you
  471.      have obtained it, unzip it.  You will get one or more PKT files.
  472.      Apply the pktdate tool to each of these files in order to verify that
  473.      all date stamps in these PKT files are still correct.
  474.  
  475.   3. Set up the test echomail area in which these areas are written in your
  476.      tosser.  For the beginning, set it up to be Fido *.MSG.  Besides an
  477.      entry in the tosser configuration, this requires that you create the
  478.      corresponding directory manually.  Make sure that the area is empty
  479.      (don't use an existing area for this.
  480.  
  481.   4. Copy the PKT files to your protected inbound directory and have the
  482.      tosser toss them, but retain a copy of them elsewhere.
  483.  
  484.   5. Similar to step 10 of section 3.2, you now have to apply the msgdate
  485.      tool to each *.MSG file that has been created in the subdirectory that
  486.      represents the test echomail area.  Refer to step 7 of section 3.2 for
  487.      further information.  Make sure that the FTSC and Opus Written
  488.      timestamp are correct, representing the date after 1.1.2000 on which
  489.      the mails have been written.  Make sure that the Opus Arrived
  490.      Timestamp represents the system time of your system when the mail
  491.      arrived there (normally a value < 2000, because we have not set our
  492.      node system's clock to a date after 2000 for THIS test.
  493.  
  494.   6. After this test succeeded, erase the test folder and recreate it, but
  495.      this  time with the squish storage type.
  496.  
  497.   7. Copy the PKT files to your protected inbound directory again, and have
  498.      the tosser toss them.  You might have to disable the dupe checking
  499.      facility of your tosser for this.
  500.  
  501.   8.  Similar to steps 11 of section 3.2, apply the sqdate programs to the
  502.       squish test area, and make sure that all dates are valid.
  503.  
  504.   9.  Repeat steps 6 to 8 with a JAM test area and jamdate, if necessary.
  505.  
  506.   3.4 Estimating the results of the test
  507.   --------------------------------------
  508.  
  509.   The most crucial point about the tests we have just performed is that the
  510.   FTSC time stamp in the packed message in an outbound PKT file is correct.
  511.   If you produce PKT files where this is not the case, you could become
  512.   subject to a formal complaint.
  513.  
  514.   On the other hand, it is also important that all other dates in your
  515.   message base are correct.  I have heard people saying that they don't care
  516.   if a mail is displayed with a wrong date or not, but I don't agree.
  517.   Consider, for example, what could happen if the date fields of the
  518.   "Arrived" time stamp are wrong and you instruct your tosser to purge your
  519.   message base based on arrival date.  Or consider what happens if a
  520.   downlink of yours rescans an area from you.  He will then probably not
  521.   get the messages that he wanted.
  522.  
  523.   As a consequence, you should under all circumstances make sure that in
  524.   all steps from section 3.1 and 3.2, my tools always report the correct
  525.   dates on all messages in all fields.
  526.  
  527.  
  528. 4. Recompiling the tools for other platforms
  529. --------------------------------------------
  530.  
  531. The msgdate, jamdate and pktdate tools are especially easy to recompile.
  532. They don't need to be linked to anything, they are pure ANSI C, and they
  533. don't rely on a compilers packing modus for structures.  They will compile
  534. with any ANSI compliant compiler and will yield the same result no matter
  535. with which compiler they have been created or on which platform they run on.
  536.  
  537. Simply type something like "cc -o msgdate msgdate.c" to compile them.
  538.  
  539. The sqdate tool is not as easy.  I have refrained from writing my own
  540. routines to access the squish message base, but have decided to use Paul
  541. Edwards SMAPI, which is also used in MsgEd, for this purpose.  The SMAPI is
  542. available for file request as SMAPISS.ZIP at my system (2:2476/418), or as
  543. smapi_latest.tar.gz from ftp://ftp.sar-gmbh.com/pub/freeware/husky.  You
  544. will need to compile the SMAPI, because you will need to link it with
  545. sqdate.c if you whish to compile your program.  The SMAPI will compile on
  546. OS/2 DOS, Windows, FreeBSD, Linux, some other Unices and Amiga.  Please
  547. take care that you do use SMAPI version 1.5.6 or newer, because only this
  548. version is fully Y2K compliant.
  549.  
  550.  
  551. 5. Programmer's Note: How to correctly use a 2 digit date stamp.
  552. ----------------------------------------------------------------
  553.  
  554. When you write Fidonet software, you will generally have to deal with the
  555. problem that you have to translate a 2 digit year number, that you have
  556. extracted from a FTSC time stamp in a packed message, into a four digit
  557. year number, that you can use to write struct _stamp structs, or that you
  558. can use to display the full four digit year to the user.
  559.  
  560. 2 digit year numbers were invented by people that did not think that their
  561. software and designs would survive the year 2000 anyway.  They just used to
  562. put a 19 in front of the two digit number. This is obviously wrong.
  563.  
  564. Nowadays, some people try to fix problems with two digit year numbers like
  565. this:  They set up rules that say "If the number is greater than or equal
  566. to 80, then assume it is in the 20th century.  If it is less then 80, then
  567. assume it is in the 21st century.".  In my opinion, this is not the correct
  568. way to fix the problem, because a program like this assumes that it will
  569. not survive the year of 2080, just like it previously assumed it would not
  570. survive the year of 2000. But you'll never know ...
  571.  
  572. There is a way to fix the problem much more elegantly, while you can still
  573. continue to use two digit year numbers.  Suppose you are a human living in
  574. the 25th century, say, in the year of 2460, and a friend of yours says that
  575. he has been born in the year 20.  You will immediately know that he means
  576. the year of 2420.  He can't mean 2320, because he does not look like a
  577. 140-year-old "grufti", and he can't mean 2520, because even in the 25th
  578. century, time-travel has not yet been invented.
  579.  
  580. The same intelligence that you have when you interpret that your friend
  581. must mean 2420 when he says 20 (or 1970 if he says 70 and you are living in
  582. our times ...), can be easily applied to your software as well:  A fido PKT
  583. file that you receive on your system will probably never be older than 10,
  584. or lets even say 50 years.  It will also usually not come from too far
  585. in the future.  (It might come from the future because someone is testing
  586. their system, though).
  587.  
  588. Therefore, I suggest that a two digit year number is always interpreted as
  589. follows:  Add a century number to it in that way, that the difference
  590. between the date of the message and the date of the system you are running
  591. on is never bigger than 50 years.
  592.  
  593. Here is an example in C. Suppose the parameter "current_year" holds the
  594. current system date's year, the parameter "two_digit_year" holds a two digit
  595. year number, and the return value of the function below should be the
  596. four_digit_year number that is "meant" by the two-digit_year parameter.
  597. The code is not optimised, but is is written as to make the algorithm clear:
  598.  
  599. int interpret_two_digit_year(int current_year, short two_digit_year)
  600. {
  601.   int four_digit_year;  /* our return value */
  602.   int current_century;  /* current century, like 19, 20, 21, ... */
  603.  
  604.                       /* determine the current century */
  605.   current_century = current_year / 100;
  606.  
  607.                       /* at first, assume the two digit number    */
  608.                       /* represents a year in the current century */
  609.   four_digit_year = two_digit_year + (current_century * 100);
  610.  
  611.  
  612.                       /* then make adjustments if the four digit year    */
  613.                       /* that you we have calculated seems to be too old */
  614.                       /* or too new                                      */
  615.   if (current_year - four_digit_year > 50)
  616.   {
  617.     four_digit_year = four_digit_year + 100;
  618.   }
  619.   if (four_digit_year - current_year >= 50)
  620.   {
  621.     four_digit_year = four_digit_year - 100;
  622.   }
  623.  
  624.   return four_digit_year;
  625. }
  626.  
  627. In the time until the year of 2030, your program will behave exactly like
  628. it did if you used the simpler fix method ( >=80:  1900, <80:  2000), so it
  629. won't make a different at first.  However, in the time after the year of
  630. 2030, your program will slowly begin to adapt to the "newer times", and in
  631. the year of 2080, your program, or programs derived from it, will still be
  632. fully function, while the program that used the simpler fix method would
  633. not work any more.
  634.  
  635. I know that none of us will probably live in the year of 2080.  However,
  636. our sons and daughters, or grandsons and granddaughters, will, and I think
  637. we should not let them run into the same problem in 2080 that we are
  638. presently having with 2000.
  639.  
  640. BTW, this does not only apply to fidonet.  There are a huge number of
  641. computer applications where you can use a concept like that described
  642. above.  Sometimes, you don't have a -50/+50 - range, but perhaps a -95/+5 -
  643. range, but it still is a better idea than a static 80/20 fix.  Sometimes
  644. though, you can't use a dynamic method, e.g. if you have large databases
  645. that track historical events, or if you track people's birthdays and life
  646. spans (they might be longer than 100 years), and similar.  In that cases,
  647. though, you have to use 4 digit fields, there is no other way to fix *that*
  648. at all.  But a fidonet PKT surely is not an application where you need to
  649. exactly know the absolute date of a 200 years old packet, so in fidonet
  650. packets, there is no problem with dynamic century determination.
  651.  
  652.  
  653. 6. Finally
  654. ----------
  655.  
  656. If you have any questions, you can reach me at:
  657.  
  658.    Tobias Ernst @ 2:2476/418
  659.    tobi@bland.fido.de
  660.  
  661. [EOF]
  662.