/* Powerserver - publish phase information to asking clients */ #define DEBUGMODE 0 #define _GNU_SOURCE 1 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include struct timeval tv; struct timezone tz; struct pl_shm { unsigned phase[256]; unsigned lastwritten; unsigned last_ts; double pwrtime; }; struct pl_shm *sh; struct pl_shm *attach_shm(int unit) { int shm_id=0; shm_id=shmget(0x4b4b5000+unit, sizeof(struct pl_shm), IPC_CREAT|0700); if(shm_id==-1) { fprintf(stderr,"shmget failed.\n"); perror("shmget"); exit(1); } sh=(struct pl_shm *) shmat(shm_id, 0, 0); if(sh==(void *) -1 || sh==0) { fprintf(stderr,"shmat failed.\n"); perror("shmat"); exit(1); } return sh; } /* __asm__ __volatile__("": : :"memory"); */ extern int errno; int main(argc, argv) int argc; char *argv[]; { int i, f, f1, f2, f3, fx, whatitis; int sp_fd = 0, pp_fd = 0, n_fd=0, zoo_poll = 0, hitolow = 0, flap = 0; int deviceis_serial = 0, deviceis_parallel = 0, deviceis_nic=0, bogon = 0; int unit = 2; unsigned int pp_nfds = 1; struct pollfd pp_pollfd[2]; struct ppdev_frob_struct frobit; struct sched_param sp; struct rlimit rl; char *prog; // char *pps_dev[256]; // char *pps_sig[256]; /* name of sig line: CD RTS DSR */ int sig = TIOCM_CD; prog = argv[0]; if (!DEBUGMODE) { if(fork()!=0) return(0); setsid(); setpgrp(); setsid(); getrlimit(RLIMIT_NOFILE, &rl); for (i = 0; i <= rl.rlim_max; i++) (void) close(i); } mlockall(MCL_FUTURE); errno = 0; setpriority(PRIO_PROCESS, getpid(), -10); if (errno) { fprintf(stderr,"setpriority failed.\n"); } memset(&sp, 0, sizeof(sp)); sp.sched_priority=sched_get_priority_max(SCHED_FIFO); if(sched_setscheduler(0, SCHED_FIFO, &sp)!=0) { fprintf(stderr,"unable to set RR scheduling.\n"); } if (1) { //nic struct sockaddr_in addr; int nbytes,addrlen; struct ip_mreq mreq; unsigned yes=1; /*** MODIFICATION TO ORIGINAL */ /* create what looks like an ordinary UDP socket */ if ((n_fd=socket(AF_INET,SOCK_DGRAM,0)) < 0) { perror("socket"); exit(1); } /* set up destination address */ memset(&addr,0,sizeof(addr)); addr.sin_family=AF_INET; addr.sin_addr.s_addr=htonl(INADDR_ANY); addr.sin_port=htons(124); /* bind to receive address */ if (bind(n_fd,(struct sockaddr *) &addr,sizeof(addr)) < 0) { perror("bind"); exit(1); } } attach_shm(unit); if (1) { //nic unsigned msgbuf[256]; unsigned nbytes,addrlen,stat; struct sockaddr_in addr; while (1) { if ((nbytes=recvfrom(n_fd,msgbuf,256,0, (struct sockaddr *) &addr,&addrlen)) < 0) { perror("recvfrom"); exit(1); } if (DEBUGMODE) printf("msg rcvd cmd %u for %u\n",msgbuf[0],msgbuf[1]); // if ((msgbuf[0]==54656866)&&(nbytes==8)) { msgbuf[0]=54652345; msgbuf[2]=sh->phase[msgbuf[1]&255]; gettimeofday(&tv,&tz); msgbuf[3]=tv.tv_sec; msgbuf[4]=tv.tv_usec; nbytes=sendto(n_fd,msgbuf,sizeof(unsigned)*5,0, (struct sockaddr *) &addr,addrlen); } } } }