afsconfig-and-rcsid-all-around-20010705
[openafs.git] / src / lwp / test / test_key.c
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  * 
5  * This software has been released under the terms of the IBM Public
6  * License.  For details, see the LICENSE file in the top-level source
7  * directory or online at http://www.openafs.org/dl/license10.html
8  */
9
10 /*
11  * test_key - test waiting for keystrokes.
12  * Use this test as:
13  * 1) test_key - no arguments should wait until stuff followed by <cr>.
14  * 2) test_key -delay n - should wait n seconds and beep then exit. If data
15  *    entered before n seconds, should be printed.
16  * 3) test_key -delay n -iters j - does the above n times.
17  *    
18  */
19
20 #include <afs/param.h>
21 #include <afsconfig.h>
22
23 RCSID("$Header$");
24
25 #include <stdio.h>
26 #include <sys/types.h>
27 #ifdef AFS_NT40_ENV
28 #include <time.h>
29 #else
30 #include <sys/time.h>
31 #include <unistd.h>
32 #endif
33 #include <lwp.h>
34
35 /* prototypes */
36 void interTest();
37 void lineTest();
38
39 void Usage(void)
40 {
41     printf("Usage: test_key [-nobuf] [-delay seconds [-iters n]]\n");
42     printf("test_key waits for keystrokes. Without options it will wait indefinitely.\n");
43     printf("To show that LWP is still running there is a rotating '|' which cycles every quarter second.\n");
44     printf("-nobuf - don't buffer input. Don't need to wait for <cr>.\n");
45     printf("-delay seconds - wait for <seconds> for a keystroke.\n");
46     printf("-iters n - repeat the wait n times.\n");
47     printf("-inter - wait for key and beep every five seconds until pressed(overrides other options).\n");
48     printf("-line - wait for a whole line to be typed.");
49     exit(1);
50 }
51
52
53 int waitingForAnswer = 0;
54
55 static void PrintDots()
56 {
57     static struct timeval constSleepTime = { 1, 0 };
58     struct timeval sleepTime;
59
60     while (waitingForAnswer) {
61         sleepTime = constSleepTime;
62         IOMGR_Select(0, 0, 0, 0, &sleepTime);
63         if (!waitingForAnswer)
64             break;
65         printf("."); fflush(stdout);
66     }
67 }
68
69 static int DotWriter(char *junk)
70 {
71     while (1 ) {
72         LWP_WaitProcess(&waitingForAnswer);
73         PrintDots();
74     }
75     return 0;
76 }
77
78 void main(int ac, char **av)
79 {
80     int delay = 0;
81     int iters = 0;
82     int inter = 0;
83     int line = 0;
84     int i;
85     PROCESS dotpid;
86     int rc;
87
88     for (i=1; i<ac; i++) {
89         if (!strcmp("-delay", av[i])) {
90             if (++i >= ac) {
91                 printf("Missing delay time for -delay option.\n");
92             }
93             delay = atoi(av[i]);
94             if (delay < 0) {
95                 printf("Delay must be at least 0 seconds.\n");
96                 Usage();
97             }
98         }
99         else if(!strcmp("-iters", av[i])) {
100             if (++i >= ac) {
101                 printf("Missing iteration count for -iters option.\n");
102             }
103             iters = atoi(av[i]);
104             if (iters < 0) {
105                 printf("Number of iterations must be at least 0.\n");
106                 Usage();
107             }
108         }
109         else if (!strcmp("-nobuf", av[i])) {
110             rc = setvbuf(stdin, NULL, _IONBF, 0);
111             if (rc<0) {
112                 perror("Setting -nobuf for stdin");
113             }
114         }
115         else if (!strcmp("-inter", av[i])) {
116           inter = 1;
117         }
118         else if (!strcmp("-line", av[i])) {
119           line = 1;
120         }
121         else
122             Usage();
123     }
124
125     IOMGR_Initialize(); 
126
127     LWP_CreateProcess(DotWriter, 32000, LWP_NORMAL_PRIORITY, (char*)0,
128                       "DotWriter", &dotpid);
129
130     if (inter) {
131       interTest();
132       exit(1);
133     }
134     if (line) {
135       lineTest();
136       exit(1);
137     }
138     if (delay == 0) {
139         delay = -1; /* Means wait indefinitely. */
140     }
141     for (; iters >= 0; iters -- ) {
142         waitingForAnswer = 1;
143         LWP_NoYieldSignal(&waitingForAnswer);
144         rc = LWP_WaitForKeystroke(delay);
145         waitingForAnswer = 0;
146         if (rc) {
147             printf("\n'%c'\n", getchar());
148             printf("Flushing remaining input.\n");
149             while(LWP_WaitForKeystroke(0)) {
150                 printf("'%c'\n", getchar());
151             }
152         }
153         else {
154             printf("\nNo data available on this iteration.\n");
155         }
156     }
157         
158
159 }
160
161 /* interTest() : wait for key press and beep to remind user every five 
162  *    seconds.
163 */
164 void interTest()
165 {
166   char ch;
167   int rc;
168
169   printf("Will print dots until you hit a key!\n");
170   /* start the dotwriter thread running */
171   waitingForAnswer = 1;
172   LWP_NoYieldSignal(&waitingForAnswer); 
173   
174   do {
175     rc = LWP_GetResponseKey(5, &ch);
176     if (rc == 0)
177       printf("\a");
178   } while (rc == 0);
179
180   waitingForAnswer = 0; /* turn off dotwriter lwp */
181
182   printf("\nYou typed %c\n", ch);
183
184   return;
185 }
186   
187 /* lineTest() : wait until a whole line has been entered before processing.
188  */
189 void lineTest()
190 {
191   char ch;
192   int rc;
193   char line[256];
194
195   printf("Will print dots until enter a line\n");
196   /* start the dotwriter thread running */
197   waitingForAnswer = 1;
198   LWP_NoYieldSignal(&waitingForAnswer); 
199   
200   rc = LWP_GetLine(line, 256);
201
202   waitingForAnswer = 0;
203
204   printf("You entered : %s\n", line);
205   if (rc)
206     printf("linebuf was too small\n");
207
208   return;
209 }
210
211     
212       
213