Annotation of embedaddon/ntp/util/sht.c, revision 1.1.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>