New file, unix_time, didn't work on the PC
authorKeith Vetter <keithv@fusion.com>
Wed, 22 Mar 1995 22:28:10 +0000 (22:28 +0000)
committerKeith Vetter <keithv@fusion.com>
Wed, 22 Mar 1995 22:28:10 +0000 (22:28 +0000)
git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@5197 dc483132-0cff-0310-8789-dd5450dbe970

src/lib/des425/ChangeLog
src/lib/des425/des.h
src/lib/des425/read_passwd.c
src/lib/des425/unix_time.c

index 955051c1b57d356f05f9128de5f58fedc29b762c..3782fc85021aeb2b65bca0e2d314f446319e7fb6 100644 (file)
@@ -1,3 +1,10 @@
+Wed Mar 22 11:21:38 1995 Keith Vetter (keithv@fusion.com)
+
+       * read_passwd.c: changed return value to krb5_error_code
+        * des.h: same as above
+        * unix_time.c: didn't work on the PC. Copied PC time code from 
+           krb5\os\ustime.c.
+
 Mon Mar 20 21:14:40 1995  Theodore Y. Ts'o  <tytso@dcl>
 
        * Makefile.in, unix_time.c(unix_time_gmt_unixsec): Added function
index 9bd6885eab1eee29dd2280a0ead1571ee82e7c2a..df5f0f31d1d73ecdba1c72bba67e96339106b3cc 100644 (file)
@@ -80,7 +80,7 @@ void INTERFACE des_generate_random_block();
 int INTERFACE des_pcbc_encrypt();
 unsigned long INTERFACE des_quad_cksum();
 int INTERFACE des_random_key();
-int INTERFACE des_read_password();
+krb5_error_code INTERFACE des_read_password();
 int INTERFACE des_string_to_key();
 int INTERFACE des_is_weak_key();
 
index b010b51278562090eded567424e92c5c8613ce8a..61207c69a54d6b08e492df2277da95ca14df737a 100644 (file)
@@ -32,7 +32,7 @@
 static krb5_context krb4_global_context = 0;
 
 /*** Routines ****************************************************** */
-int INTERFACE
+krb5_error_code INTERFACE
 des_read_password/*_v4_compat_crock*/(k,prompt,verify)
     mit_des_cblock *k;
     char *prompt;
index c69be618636a80c3de5fcabe341fd4f767cfb831..786d135757c3d27389fe4cfc8ccb710fd046c62d 100644 (file)
@@ -9,7 +9,10 @@
  * Required for use by the Cygnus krb.a.
  */
 
+
 #include "k5-int.h"
+
+#ifndef _MSDOS
 #include <sys/time.h>
 
 krb5_ui_4 INTERFACE
@@ -23,3 +26,96 @@ unix_time_gmt_unixsec (usecptr)
                *usecptr = now.tv_usec;
        return now.tv_sec;
 }
+
+#else /* _MSDOS */
+
+/*
+ * Originally written by John Gilmore, Cygnus Support, May '94.
+ * Public Domain.
+ */
+
+#include <time.h>
+#include <sys/timeb.h>
+#include <dos.h>
+#include <string.h>
+
+/*
+ * Due to the fact that DOS time can be unreliable we have reverted
+ * to using the AT hardware clock and converting it to Unix time.
+ */
+static long win_time_get_epoch(void);
+
+krb5_ui_4 INTERFACE
+unix_time_gmt_unixsec (usecptr)
+     krb5_ui_4 *usecptr;
+{
+    struct tm tm;
+    union _REGS inregs;                         /* For calling BIOS */
+    union _REGS outregs;
+    struct _timeb now;
+    time_t time;
+    long convert;                               /* MSC 7.00 bug work around */
+    krb5_ui_4 retval;                           /* What we return */
+
+    _ftime(&now);                               /* Daylight savings time */
+
+    /* Get time from AT hardware clock INT 0x1A, AH=2 */
+    memset(&inregs, 0, sizeof(inregs));
+    inregs.h.ah = 2;
+    _int86(0x1a, &inregs, &outregs);
+
+    /* 0x13 = decimal 13, hence the decoding below */
+    tm.tm_sec = 10 * ((outregs.h.dh & 0xF0) >> 4) + (outregs.h.dh & 0x0F);
+    tm.tm_min = 10 * ((outregs.h.cl & 0xF0) >> 4) + (outregs.h.cl & 0x0F);
+    tm.tm_hour = 10 * ((outregs.h.ch & 0xF0) >> 4) + (outregs.h.ch & 0x0F);
+
+    /* Get date from AT hardware clock INT 0x1A, AH=4 */
+    memset(&inregs, 0, sizeof(inregs));
+    inregs.h.ah = 4;
+    _int86(0x1a, &inregs, &outregs);
+
+    tm.tm_mday = 10 * ((outregs.h.dl & 0xF0) >> 4) + (outregs.h.dl & 0x0F);
+    tm.tm_mon = 10 * ((outregs.h.dh & 0xF0) >> 4) + (outregs.h.dh & 0x0F) - 1;
+    tm.tm_year = 10 * ((outregs.h.cl & 0xF0) >> 4) + (outregs.h.cl & 0x0F);
+    tm.tm_year += 100 * ((10 * (outregs.h.ch & 0xF0) >> 4)
+                   + (outregs.h.ch & 0x0F) - 19);
+
+    tm.tm_wday = 0;
+    tm.tm_yday = 0;
+    tm.tm_isdst = now.dstflag;
+
+    time = mktime(&tm);
+
+    convert = win_time_get_epoch();
+    retval = time + convert;
+
+       if (usecptr)
+               *usecptr = retval;
+
+    return retval;
+}
+/*
+ * This routine figures out the current time epoch and returns the
+ * conversion factor.  It exists because 
+ * Microloss screwed the pooch on the time() and _ftime() calls in
+ * its release 7.0 libraries.  They changed the epoch to Dec 31, 1899!
+ * Idiots...   We try to cope.
+ */
+
+static struct tm jan_1_70 = {0, 0, 0, 1, 0, 70};
+static long epoch = 0;
+static int epoch_set = 0;
+
+static long
+win_time_get_epoch()
+{
+
+    if (!epoch_set) {
+        epoch = 0 - mktime (&jan_1_70);        /* Seconds til 1970 localtime */
+        epoch += _timezone;            /* Seconds til 1970 GMT */
+        epoch_set = 1;
+    }
+    return epoch;
+}
+
+#endif