NTIME.C
上传用户:sunrenlu
上传日期:2022-06-13
资源大小:1419k
文件大小:2k
源码类别:

操作系统开发

开发平台:

DOS

  1. #include <stdio.h>
  2. #include <rtos.h>
  3. #include <net.h>
  4. #include <time.h>
  5. #include <dos.h>
  6. /* Notes:
  7.  * The time is the number of seconds since 00:00 (midnight) 1 January 1900
  8.  * GMT, such that the time 1 is 12:00:01 am on 1 January 1900 GMT; this
  9.  * base will serve until the year 2036.
  10.  *
  11.  * For example:
  12.  *     2,208,988,800L corresponds to 00:00  1 Jan 1970 GMT, start of UNIX time
  13.  */
  14. #define TIME_PORT 37
  15. #define BASE_TIME 2208988800L
  16. /*
  17.  * ntime() given the host address, returns Unix styled TIME.
  18.  */
  19. DWORD ntime(DWORD host)
  20. {
  21.     tcp_Socket *s;
  22.     int status;
  23.     long temptime;
  24.     s = kcalloc( sizeof( tcp_Socket ), 1 );
  25.     if (s == NULL ) return( 0 );
  26.     status = 0;
  27.     temptime = 0L;
  28.     if ( tcp_open( s, 0, host, TIME_PORT, NULL )) {
  29.         sock_wait_established(s, sock_delay , NULL, &status);
  30.         while ( 1 ) {
  31.             sock_tick( s, &status );
  32.             if (sock_dataready( s ) >= 4 ) {
  33.                 sock_read( s, (void *)&temptime, sizeof( long ));
  34.                 temptime = ntohl( temptime );       /* convert byte orderring */
  35.                 temptime -= BASE_TIME;
  36. sock_err:
  37.                 sock_close( s );
  38.                 while ( tcp_tick( s ) ) rt_sleep( 10 );
  39.                 break;
  40.             }
  41. }
  42.     }
  43.     kfree( s );
  44.     return( temptime );
  45. }
  46. void nsettime( DWORD host )
  47. {
  48.     DWORD t;
  49.     struct time tm;
  50.     struct date da;
  51.     if ( ( t = ntime( host )) > 0 ) {
  52.         dos_enter();
  53.         /* this will set the date, but the time will be overwritten by eRTOS */
  54.         stime( &t );
  55.         unixtodos( t, &da, &tm );
  56.         rt_settime( &tm );
  57.         dos_exit();
  58.     }
  59. }