#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <time.h>

#include <linux/mc146818rtc.h>
#include <sys/ioctl.h>

int main(int argc, char **argv)
{
	struct rtc_time rtc_tm;
	struct tm *realtime;
	time_t t;
	int rtc;
	char *string[101];

	time(&t);
	t += 5;
	realtime=gmtime(&t);
	if (!(rtc = open("/dev/rtc", O_RDWR)))
		exit(1);

	ioctl(rtc, RTC_ALM_READ, &rtc_tm);
	printf("old wakeup time: %i:%i:%i %i/%i/%i (yday %i) wday %i %s\n",
			rtc_tm.tm_hour,
			rtc_tm.tm_min,
			rtc_tm.tm_sec,
			rtc_tm.tm_mday,
			rtc_tm.tm_mon,
			rtc_tm.tm_year,
			rtc_tm.tm_yday,
			rtc_tm.tm_wday,
			(rtc_tm.tm_isdst ? "DST" : "")
	      );
	/* Zeit setzen */

	rtc_tm.tm_hour=realtime->tm_hour;
	rtc_tm.tm_min=realtime->tm_min;
	rtc_tm.tm_sec=realtime->tm_sec;
	rtc_tm.tm_mday=realtime->tm_mday;
	rtc_tm.tm_mon=realtime->tm_mon;
	rtc_tm.tm_year=realtime->tm_year;
	rtc_tm.tm_yday=realtime->tm_yday;
	rtc_tm.tm_wday=realtime->tm_wday; 
	rtc_tm.tm_isdst=realtime->tm_isdst;
	switch (argc) {
		case 10: rtc_tm.tm_isdst=atoi(argv[9]); /* fallthroughs naturally intended */
		case 9: rtc_tm.tm_wday=atoi(argv[8]);
		case 8: rtc_tm.tm_yday=atoi(argv[7]);
		case 7: rtc_tm.tm_year=atoi(argv[6]);
		case 6: rtc_tm.tm_mon =atoi(argv[5]);
		case 5: rtc_tm.tm_mday=atoi(argv[4]);
		case 4: rtc_tm.tm_hour=atoi(argv[3]);
		case 3: rtc_tm.tm_min =atoi(argv[2]);
		case 2: rtc_tm.tm_sec =atoi(argv[1]); break;
		default: 
			fprintf(stderr,"usage: %s [second[minute[hour[mday[month[year[yday[wday[isdst]]]]]]]]]\n  without arguments, this program simply puts the agenda to sleep and wakes up\n  5 seconds later.\n\n",argv[0]);
			break;
	}
	printf("new wakeup time: %i:%i:%i %i/%i/%i (yday %i) wday %i %s\n",
			rtc_tm.tm_hour,
			rtc_tm.tm_min,
			rtc_tm.tm_sec,
			rtc_tm.tm_mday,
			rtc_tm.tm_mon,
			rtc_tm.tm_year,
			rtc_tm.tm_yday,
			rtc_tm.tm_wday,
			(rtc_tm.tm_isdst ? "DST" : "")
	      );

	ioctl(rtc, RTC_ALM_SET, &rtc_tm);
	ioctl(rtc, RTC_AIE_ON);
	if (argc == 1 || argv[0][0] == 'a') {
		if (fork()) {
			FILE *fp;
			read(rtc,&string,100);
			close(rtc);
			fp=fopen("/dev/console","w");
			while (1) {
				fprintf(fp,"\a\n");
				sleep(1);
			}
			fclose (fp);
			exit(0);
		} else {
			int fd;
			sleep(1);
			fd=open("/proc/sys/pm/sleep",O_WRONLY);
			write(fd,"1",1);
			close(fd);
			exit(0);
		}
	}
	close(rtc);
	exit(0);
}

