#include #include #include #include #include #include #include char *separators = "/ :: "; int days[] = {31,28,31,30,31,30,31,31,30,31,30,31}; char *invalid_msg = "Invalid date received from modem."; char *months[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; extern struct MsgPort *CreatePort(); struct MsgPort *read_port, *write_port, *Timer_Port; struct IOExtSer inreq, outreq; char inbuf[2]; int serial_open, timer_open, timeout_count, timer_pending, input_started; struct timerequest Time_Req ; extern char *AllocMem(); main(argc,argv) int argc; char *argv[]; { int state, year; int result[5]; int c; ULONG system_time = 0; read_port = 0; write_port = 0; serial_open = 0; timer_open = 0; Timer_Port = 0; timer_pending = 0; input_started = 0; timeout_count = 6; if(argc != 2) done("Year not specified."); year = atoi(argv[1]); if(year < 78) done("Year must be 78 or greater."); if ((Timer_Port = CreatePort("Timer Port", 0)) == NULL) done("Can't create timer port") ; if (OpenDevice(TIMERNAME, UNIT_VBLANK, (char *) &Time_Req, 0) != NULL) done("Can't open timer device") ; timer_open = 1; Time_Req.tr_node.io_Message.mn_ReplyPort = Timer_Port ; Time_Req.tr_node.io_Command = TR_ADDREQUEST ; Time_Req.tr_node.io_Flags = 0 ; Time_Req.tr_node.io_Error = 0 ; if(!(read_port = CreatePort(0,0))) done("Can't create read port"); inreq.IOSer.io_Message.mn_ReplyPort = read_port; if (OpenDevice(SERIALNAME, NULL, &inreq, NULL)) done("Can't open serial device for input"); serial_open = 1; inreq.io_SerFlags = SERF_XDISABLED; inreq.IOSer.io_Command = SDCMD_SETPARAMS; inreq.io_ReadLen = inreq.io_WriteLen = 8; inreq.io_Baud = 1200; DoIO(&inreq); inreq.IOSer.io_Length = 1; movmem((char *)&inreq, (char *)&outreq, sizeof(inreq)); if(!(write_port = CreatePort(0,0))) done("Can't create write port"); outreq.IOSer.io_Message.mn_ReplyPort = write_port; inreq.IOSer.io_Command = CMD_READ; inreq.IOSer.io_Data = (APTR)inbuf; BeginIO(&inreq); input_started = 1; Delay(55L); send_string("\rAT*T\015"); start_delay(); while(10 != get_serial()); for(state = 0;state < 5; ++state) result[state] = 0; state = 0; while(state < 5) { c=get_serial(); if(c>='0' && c<='9') result[state] = 10 * result[state] + c - '0'; else { if(c==separators[state]) ++state; else done(invalid_msg); } } if((c=get_serial()) == 'A') { if(result[2] == 12) result[2] = 0; } else { if(c == 'P') { if(result[2] < 12) result[2] += 12; } else done(invalid_msg); } if(result[0] < 1) done(invalid_msg); for(c=78;c2)) ++system_time; system_time = result[4]+60*(result[3]+60*(result[2]+24*system_time)); if (timer_pending) { WaitIO(&Time_Req); GetMsg(Timer_Port); } Time_Req.tr_node.io_Command = TR_SETSYSTIME; Time_Req.tr_time.tv_secs = system_time; Time_Req.tr_time.tv_micro = 0; DoIO(&Time_Req); GetMsg(Timer_Port); printf("Date set to \033[0;33m%02d-%s-%s %02d:%02d:%02d\033[0m.\n", result[1],months[result[0]-1],argv[1],result[2],result[3],result[4]); done(0L); } int get_serial() { int c; while(timeout_count) { Wait((1L << read_port->mp_SigBit) | (1L << Timer_Port -> mp_SigBit)); if (GetMsg(Timer_Port)) { timer_pending = 0; if(--timeout_count) start_delay(); } if (GetMsg(read_port)) { WaitIO(&inreq); c = inbuf[0] & 0x7F; BeginIO(&inreq); return c; } } done("Timeout waiting for response from modem."); } static send_string(s) char *s; { outreq.IOSer.io_Data = (APTR) s; outreq.IOSer.io_Length = strlen(s); outreq.IOSer.io_Command = CMD_WRITE; DoIO(&outreq); } start_delay() { Time_Req.tr_time.tv_secs = 0 ; Time_Req.tr_time.tv_micro = 300000; SendIO((char *) &Time_Req.tr_node) ; timer_pending = 1; } done(why) char *why; { if (input_started) AbortIO(&inreq); if (timer_open) CloseDevice(&Time_Req); if (Timer_Port) DeletePort(Timer_Port); if (serial_open) CloseDevice(&inreq); if (read_port) DeletePort(read_port); if (write_port) DeletePort(write_port); if (why) printf("Date not set: %s\n", why) ; exit(0) ; }