vern@zebra.UUCP (Vernon C. Hoxie) (11/22/88)
	I'm trying to write a program to reset the clock on the 3b1.
First, I want to be able to read the clock to see if things work. 
This has to be done in the quickest time possible, so I am trying the
syslocal(2) call special to the 3b1.  It has the form:
		int syslocal(cmd, [, arg]
From the manual (ugh) and the syslocal.h file, I get the command to be
"SYSL_RDRTC" and the argument to be of struct rtc *x_rtc.  Now:
		int x = syslocal(SYSL_RDRTC, x_rtc);
gives x = -1.  So I added perror("Error id"); as the next instruction
and got a "Bad address" response.
	How does a system function provide a bad address.  Oh! This is
an AT&T machine (:>).  I'm tempted to go to machine language but it
would be nice to have something a little more portable.  Not portable
fully if I am using syslocal(2), I know.
	Any help will be appreciated.
-- 
Vernon C. Hoxie		       {ncar,nbires,boulder,isis}!scicom!zebra!vern
3975 W. 29th Ave.					voice: 303-477-1780
Denver, Colo., 80212					 uucp: 303-455-2670randy@cctb.mn.org (Randy Orrison) (11/23/88)
In article <130@zebra.UUCP> vern@zebra.UUCP (Vernon C. Hoxie) writes: | I'm trying to write a program to reset the clock on the 3b1. |First, I want to be able to read the clock to see if things work. |This has to be done in the quickest time possible, so I am trying the |syslocal(2) call special to the 3b1. It has the form: | int syslocal(cmd, [, arg] |From the manual (ugh) and the syslocal.h file, I get the command to be |"SYSL_RDRTC" and the argument to be of struct rtc *x_rtc. Now: | int x = syslocal(SYSL_RDRTC, x_rtc); |gives x = -1. So I added perror("Error id"); as the next instruction |and got a "Bad address" response. | How does a system function provide a bad address. [?] It's not giving you a bad address - it's complaining that YOU've given IT a bad address. You're giving it a pointer to nothing, and it wants to store the information there. You have to actually allocate a 'struct rtc' for it to place the time into, and then give the address of that to the syslocal call: struct rtc x_rtc; int err; err = syslocal (SYSL_RDRTC, &x_rtc); should do what you want. -randy -- Randy Orrison - Chemical Computer Thinking Battery - randy@cctb.mn.org (aka randy@{umn-cs.uucp, ux.acss.umn.edu, umnacvx.bitnet, halcdc.uucp})
alex@umbc3.UMD.EDU (Alex S. Crain) (11/24/88)
In article <130@zebra.UUCP> vern@zebra.UUCP (Vernon C. Hoxie) writes: > > I'm trying to write a program to reset the clock on the 3b1. >First, I want to be able to read the clock to see if things work. >This has to be done in the quickest time possible, so I am trying the >syslocal(2) call special to the 3b1. It has the form: > int syslocal(cmd, [, arg] >From the manual (ugh) and the syslocal.h file, I get the command to be >"SYSL_RDRTC" and the argument to be of struct rtc *x_rtc. Now: > int x = syslocal(SYSL_RDRTC, x_rtc); >gives x = -1. So I added perror("Error id"); as the next instruction >and got a "Bad address" response. syslocal wants the address of a structure, not a pointer, so the correct calling format would be: rtc x_rtc; int x = syslocal(SYSL_RDRTC, &x_rtc); This is not terribly obvious, but makes sence if you think about it long enough, keeping in mind that C uses call-by-value argument passing. > How does a system function provide a bad address. Oh! This is >an AT&T machine (:>). This is a common mistake, and is more a characteristic of C and Unix documentation than the vendor. rtx *x_rtc implies "the address of a structure" without being specific about where that address comes from. The natural response is to use a pointer in that situation, and expect the system call to return an address via the pointer. But a second glance shows that that would be impossible, because of call-by-value, and the correct method is to pass the address of an existing structure. -- :alex. Systems Programmer nerwin!alex@umbc3.umd.edu UMBC alex@umbc3.umd.edu
thad@cup.portal.com (Thad P Floryan) (11/25/88)
Re: handling the UNIXpc's real-time clock, following is some code that WORKS,
extracted from a program I'll be posting to unix-pc.sources in the near future.
Enjoy!
Thad Floryan  [ thad@cup.portal.com (OR) ..!sun!portal!cup.portal.com!thad ]
========================================
#include <stdio.h>
#include <time.h>
#include <sys/types.h>
#ifdef UNIXPC
#include <sys/syslocal.h>
#include <sys/rtc.h>
#endif
	.
	.
#ifdef UNIXPC
/*	Sets the battery-backed Real Time Clock in the UNIXpc to the same
 *	date and time values as the system clock.
 */
set_rtc(tval)
time_t	tval;
{
	struct tm	*p_tm;
	struct rtc	rtc_s;
	struct rtc	*p_rtc;
	p_tm = localtime(&tval);
	p_rtc = &rtc_s;
	p_rtc->wkday = p_tm->tm_wday;
	p_rtc->yr10  = p_tm->tm_year / 10;
	p_rtc->yr1   = p_tm->tm_year % 10;
	p_rtc->mon10 = (p_tm->tm_mon + 1) / 10;
	p_rtc->mon1  = (p_tm->tm_mon + 1) % 10;
	p_rtc->day10 = p_tm->tm_mday / 10;
	p_rtc->day1  = p_tm->tm_mday % 10;
	p_rtc->hr10  = p_tm->tm_hour / 10;
	p_rtc->hr1   = p_tm->tm_hour % 10;
	p_rtc->min10 = p_tm->tm_min / 10;
	p_rtc->min1  = p_tm->tm_min % 10;
	p_rtc->sec10 = p_tm->tm_sec / 10;
	p_rtc->sec1  = p_tm->tm_sec % 10;
	syslocal(SYSL_WRTRTC, p_rtc);	/* write to RTC */
}
#endif