summaryrefslogtreecommitdiffstats
path: root/contrib/ntp/util/sht.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/ntp/util/sht.c')
-rw-r--r--contrib/ntp/util/sht.c185
1 files changed, 185 insertions, 0 deletions
diff --git a/contrib/ntp/util/sht.c b/contrib/ntp/util/sht.c
new file mode 100644
index 0000000..4abd350
--- /dev/null
+++ b/contrib/ntp/util/sht.c
@@ -0,0 +1,185 @@
+/*
+ * 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;
+ }
+}
OpenPOWER on IntegriCloud