/contrib/ntp/util/sht.c
https://bitbucket.org/freebsd/freebsd-head/ · C · 185 lines · 169 code · 5 blank · 11 comment · 17 complexity · c6df623326a7dece28d9b97c31072b5f MD5 · raw file
- /*
- * sht.c - Testprogram for shared memory refclock
- * read/write shared memory segment; see usage
- */
- #ifndef SYS_WINNT
- #include <sys/types.h>
- #include <sys/ipc.h>
- #include <sys/shm.h>
- #include <stdio.h>
- #include <time.h>
- #include <unistd.h>
- #include <stdlib.h>
- #else
- #include <windows.h>
- #include <time.h>
- #include <stdlib.h>
- #include <stdio.h>
- #include <iostream.h>
- #define sleep(x) Sleep(x*1000)
- #endif
- #include <assert.h>
- struct shmTime {
- int mode; /* 0 - if valid set
- * use values,
- * clear valid
- * 1 - if valid set
- * if count before and after read of values is equal,
- * use values
- * clear valid
- */
- int count;
- time_t clockTimeStampSec;
- int clockTimeStampUSec;
- time_t receiveTimeStampSec;
- int receiveTimeStampUSec;
- int leap;
- int precision;
- int nsamples;
- int valid;
- };
- struct shmTime *
- getShmTime (
- int unit
- )
- {
- #ifndef SYS_WINNT
- int shmid=shmget (0x4e545030+unit, sizeof (struct shmTime), IPC_CREAT|0777);
- if (shmid==-1) {
- perror ("shmget");
- exit (1);
- }
- else {
- struct shmTime *p=(struct shmTime *)shmat (shmid, 0, 0);
- if ((int)(long)p==-1) {
- perror ("shmat");
- p=0;
- }
- assert (p!=0);
- return p;
- }
- #else
- char buf[10];
- LPSECURITY_ATTRIBUTES psec=0;
- sprintf (buf,"NTP%d",unit);
- SECURITY_DESCRIPTOR sd;
- SECURITY_ATTRIBUTES sa;
- HANDLE shmid;
- assert (InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION));
- assert (SetSecurityDescriptorDacl(&sd,1,0,0));
- sa.nLength=sizeof (SECURITY_ATTRIBUTES);
- sa.lpSecurityDescriptor=&sd;
- sa.bInheritHandle=0;
- shmid=CreateFileMapping ((HANDLE)0xffffffff, 0, PAGE_READWRITE,
- psec, sizeof (struct shmTime),buf);
- if (!shmid) {
- shmid=CreateFileMapping ((HANDLE)0xffffffff, 0, PAGE_READWRITE,
- 0, sizeof (struct shmTime),buf);
- cout <<"CreateFileMapping with psec!=0 failed"<<endl;
- }
- if (!shmid) {
- char mbuf[1000];
- FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM,
- 0, GetLastError (), 0, mbuf, sizeof (mbuf), 0);
- int x=GetLastError ();
- cout <<"CreateFileMapping "<<buf<<":"<<mbuf<<endl;
- exit (1);
- }
- else {
- struct shmTime *p=(struct shmTime *) MapViewOfFile (shmid,
- FILE_MAP_WRITE, 0, 0, sizeof (struct shmTime));
- if (p==0) {
- char mbuf[1000];
- FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM,
- 0, GetLastError (), 0, mbuf, sizeof (mbuf), 0);
- cout <<"MapViewOfFile "<<buf<<":"<<mbuf<<endl;
- exit (1);
- }
- return p;
- }
- return 0;
- #endif
- }
- int
- main (
- int argc,
- char *argv[]
- )
- {
- volatile struct shmTime *p=getShmTime(2);
- if (argc<=1) {
- printf ("usage: %s r[c][l]|w|snnn\n",argv[0]);
- printf (" r read shared memory\n");
- printf (" c clear valid-flag\n");
- printf (" l loop (so, rcl will read and clear in a loop\n");
- printf (" w write shared memory with current time\n");
- printf (" snnnn set nsamples to nnn\n");
- printf (" lnnnn set leap to nnn\n");
- printf (" pnnnn set precision to -nnn\n");
- exit (0);
- }
- switch (argv[1][0]) {
- case 's': {
- p->nsamples=atoi(&argv[1][1]);
- }
- break;
- case 'l': {
- p->leap=atoi(&argv[1][1]);
- }
- break;
- case 'p': {
- p->precision=-atoi(&argv[1][1]);
- }
- break;
- case 'r': {
- char *ap=&argv[1][1];
- int clear=0;
- int loop=0;
- printf ("reader\n");
- while (*ap) {
- switch (*ap) {
- case 'l' : loop=1; break;
- case 'c' : clear=1; break;
- }
- ap++;
- }
- do {
- printf ("mode=%d, count=%d, clock=%d.%d, rec=%d.%d,\n",
- p->mode,p->count,p->clockTimeStampSec,p->clockTimeStampUSec,
- p->receiveTimeStampSec,p->receiveTimeStampUSec);
- printf (" leap=%d, precision=%d, nsamples=%d, valid=%d\n",
- p->leap, p->precision, p->nsamples, p->valid);
- if (!p->valid)
- printf ("***\n");
- if (clear) {
- p->valid=0;
- printf ("cleared\n");
- }
- if (loop)
- sleep (1);
- } while (loop);
- }
- break;
- case 'w': {
- printf ("writer\n");
- p->mode=0;
- if (!p->valid) {
- p->clockTimeStampSec=time(0)-20;
- p->clockTimeStampUSec=0;
- p->receiveTimeStampSec=time(0)-1;
- p->receiveTimeStampUSec=0;
- printf ("%d %d\n",p->clockTimeStampSec, p->receiveTimeStampSec);
- p->valid=1;
- }
- else {
- printf ("p->valid still set\n"); /* not an error! */
- }
- }
- break;
- }
- }