Annotation of embedaddon/ntp/util/sht.c, revision 1.1
1.1 ! misho 1: /*
! 2: * sht.c - Testprogram for shared memory refclock
! 3: * read/write shared memory segment; see usage
! 4: */
! 5: #ifndef SYS_WINNT
! 6: #include <sys/types.h>
! 7: #include <sys/ipc.h>
! 8: #include <sys/shm.h>
! 9: #include <stdio.h>
! 10: #include <time.h>
! 11: #include <unistd.h>
! 12: #include <stdlib.h>
! 13: #else
! 14: #include <windows.h>
! 15: #include <time.h>
! 16: #include <stdlib.h>
! 17: #include <stdio.h>
! 18: #include <iostream.h>
! 19: #define sleep(x) Sleep(x*1000)
! 20: #endif
! 21: #include <assert.h>
! 22: struct shmTime {
! 23: int mode; /* 0 - if valid set
! 24: * use values,
! 25: * clear valid
! 26: * 1 - if valid set
! 27: * if count before and after read of values is equal,
! 28: * use values
! 29: * clear valid
! 30: */
! 31: int count;
! 32: time_t clockTimeStampSec;
! 33: int clockTimeStampUSec;
! 34: time_t receiveTimeStampSec;
! 35: int receiveTimeStampUSec;
! 36: int leap;
! 37: int precision;
! 38: int nsamples;
! 39: int valid;
! 40: };
! 41:
! 42: struct shmTime *
! 43: getShmTime (
! 44: int unit
! 45: )
! 46: {
! 47: #ifndef SYS_WINNT
! 48: int shmid=shmget (0x4e545030+unit, sizeof (struct shmTime), IPC_CREAT|0777);
! 49: if (shmid==-1) {
! 50: perror ("shmget");
! 51: exit (1);
! 52: }
! 53: else {
! 54: struct shmTime *p=(struct shmTime *)shmat (shmid, 0, 0);
! 55: if ((int)(long)p==-1) {
! 56: perror ("shmat");
! 57: p=0;
! 58: }
! 59: assert (p!=0);
! 60: return p;
! 61: }
! 62: #else
! 63: char buf[10];
! 64: LPSECURITY_ATTRIBUTES psec=0;
! 65: sprintf (buf,"NTP%d",unit);
! 66: SECURITY_DESCRIPTOR sd;
! 67: SECURITY_ATTRIBUTES sa;
! 68: HANDLE shmid;
! 69:
! 70: assert (InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION));
! 71: assert (SetSecurityDescriptorDacl(&sd,1,0,0));
! 72: sa.nLength=sizeof (SECURITY_ATTRIBUTES);
! 73: sa.lpSecurityDescriptor=&sd;
! 74: sa.bInheritHandle=0;
! 75: shmid=CreateFileMapping ((HANDLE)0xffffffff, 0, PAGE_READWRITE,
! 76: psec, sizeof (struct shmTime),buf);
! 77: if (!shmid) {
! 78: shmid=CreateFileMapping ((HANDLE)0xffffffff, 0, PAGE_READWRITE,
! 79: 0, sizeof (struct shmTime),buf);
! 80: cout <<"CreateFileMapping with psec!=0 failed"<<endl;
! 81: }
! 82:
! 83: if (!shmid) {
! 84: char mbuf[1000];
! 85: FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM,
! 86: 0, GetLastError (), 0, mbuf, sizeof (mbuf), 0);
! 87: int x=GetLastError ();
! 88: cout <<"CreateFileMapping "<<buf<<":"<<mbuf<<endl;
! 89: exit (1);
! 90: }
! 91: else {
! 92: struct shmTime *p=(struct shmTime *) MapViewOfFile (shmid,
! 93: FILE_MAP_WRITE, 0, 0, sizeof (struct shmTime));
! 94: if (p==0) {
! 95: char mbuf[1000];
! 96: FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM,
! 97: 0, GetLastError (), 0, mbuf, sizeof (mbuf), 0);
! 98: cout <<"MapViewOfFile "<<buf<<":"<<mbuf<<endl;
! 99: exit (1);
! 100: }
! 101: return p;
! 102: }
! 103: return 0;
! 104: #endif
! 105: }
! 106:
! 107:
! 108: int
! 109: main (
! 110: int argc,
! 111: char *argv[]
! 112: )
! 113: {
! 114: volatile struct shmTime *p=getShmTime(2);
! 115: if (argc<=1) {
! 116: printf ("usage: %s r[c][l]|w|snnn\n",argv[0]);
! 117: printf (" r read shared memory\n");
! 118: printf (" c clear valid-flag\n");
! 119: printf (" l loop (so, rcl will read and clear in a loop\n");
! 120: printf (" w write shared memory with current time\n");
! 121: printf (" snnnn set nsamples to nnn\n");
! 122: printf (" lnnnn set leap to nnn\n");
! 123: printf (" pnnnn set precision to -nnn\n");
! 124: exit (0);
! 125: }
! 126: switch (argv[1][0]) {
! 127: case 's': {
! 128: p->nsamples=atoi(&argv[1][1]);
! 129: }
! 130: break;
! 131: case 'l': {
! 132: p->leap=atoi(&argv[1][1]);
! 133: }
! 134: break;
! 135: case 'p': {
! 136: p->precision=-atoi(&argv[1][1]);
! 137: }
! 138: break;
! 139: case 'r': {
! 140: char *ap=&argv[1][1];
! 141: int clear=0;
! 142: int loop=0;
! 143: printf ("reader\n");
! 144: while (*ap) {
! 145: switch (*ap) {
! 146: case 'l' : loop=1; break;
! 147: case 'c' : clear=1; break;
! 148: }
! 149: ap++;
! 150: }
! 151: do {
! 152: printf ("mode=%d, count=%d, clock=%d.%d, rec=%d.%d,\n",
! 153: p->mode,p->count,p->clockTimeStampSec,p->clockTimeStampUSec,
! 154: p->receiveTimeStampSec,p->receiveTimeStampUSec);
! 155: printf (" leap=%d, precision=%d, nsamples=%d, valid=%d\n",
! 156: p->leap, p->precision, p->nsamples, p->valid);
! 157: if (!p->valid)
! 158: printf ("***\n");
! 159: if (clear) {
! 160: p->valid=0;
! 161: printf ("cleared\n");
! 162: }
! 163: if (loop)
! 164: sleep (1);
! 165: } while (loop);
! 166: }
! 167: break;
! 168: case 'w': {
! 169: printf ("writer\n");
! 170: p->mode=0;
! 171: if (!p->valid) {
! 172: p->clockTimeStampSec=time(0)-20;
! 173: p->clockTimeStampUSec=0;
! 174: p->receiveTimeStampSec=time(0)-1;
! 175: p->receiveTimeStampUSec=0;
! 176: printf ("%d %d\n",p->clockTimeStampSec, p->receiveTimeStampSec);
! 177: p->valid=1;
! 178: }
! 179: else {
! 180: printf ("p->valid still set\n"); /* not an error! */
! 181: }
! 182: }
! 183: break;
! 184: }
! 185: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>