windows-torture-test-20060625
[openafs.git] / src / WINNT / tests / torture / Stress / Stress.c
1 // Stress.cpp : Defines the entry point for the console application.
2 //
3
4 #include <windows.h>
5 #include <stdio.h>
6
7 int opterr = 1;
8 int optind = 1;
9 int optopt;
10 int optreset;
11 char *optarg;
12
13 int   getopt(int, char**, char*);
14 void usage(void);
15
16 int main(int argc, char* argv[])
17 {
18     int                 i;
19     int                 k;
20     int                 opt;
21     int                 LogID;
22     int                 ProcessCount;
23     int                 SecondsDelay;
24     int                 DirCount;
25     int                 DirFound;
26     char                command[512];
27     char                temp[512];
28     char                TopDirectory[512];
29     char                CurrentDirectory[256];
30     PROCESS_INFORMATION ProcInfo;
31     STARTUPINFO         StartupInfo;
32     HANDLE              hArray[500];
33     WIN32_FIND_DATA     FindFileData;
34     HANDLE              fHandle;
35
36     if (argc < 2)
37     {
38         usage();
39         exit(1);
40     }
41     for (i = 0; i < 500; i++)
42         hArray[i] = NULL;
43
44     LogID = 0;
45     ProcessCount = 0;
46     DirFound = 0;
47     DirCount = 0;
48     SecondsDelay = 0;
49     memset(command, '\0', sizeof(command));
50     memset(TopDirectory, '\0', sizeof(TopDirectory));
51
52     while ((opt = getopt(argc, argv, "A:a:BbC:c:D:d:EeF:f:I:i:L:l:M:m:N:n:P:p:SsTtU:u:Vv")) != EOF)
53     {
54
55         switch (opt)
56         {
57             case 'f':
58             case 'F':
59                 DirFound = 1;
60                 strcpy(TopDirectory, optarg);
61                 break;
62             case 'a':
63             case 'A':
64                 SecondsDelay = atoi(optarg);
65                 break;
66             case 'd':
67             case 'D':
68                 ProcessCount = atoi(optarg);
69             case 'b':
70             case 'B':
71             case 'c':
72             case 'C':
73             case 'e':
74             case 'E':
75             case 'i':
76             case 'I':
77             case 'l':
78             case 'L':
79             case 'm':
80             case 'M':
81             case 'n':
82             case 'N':
83             case 'p':
84             case 'P':
85             case 's':
86             case 'S':
87             case 't':
88             case 'T':
89             case 'u':
90             case 'U':
91             case 'v':
92             case 'V':
93                 break;
94             default:
95                 usage();
96                 exit(1);
97                 break;
98         }
99     }
100
101     for (LogID = 0; LogID < 100; LogID++)
102     {
103         sprintf(CurrentDirectory, ".\\Log%05d", LogID);
104         fHandle = FindFirstFile(CurrentDirectory, &FindFileData);
105         if (fHandle == INVALID_HANDLE_VALUE)
106             break;
107         FindClose(fHandle);
108     }
109     if (LogID == 100)
110     {
111         printf("\nUnable to get a LogID.\n");
112         exit(1);
113     }
114
115     if (!DirFound)
116     {
117         printf("\nYou must use the -f switch\n\n");
118         usage();
119         exit(1);
120     }
121     if (!ProcessCount)
122     {
123         printf("\nYou must use the -d switch\n\n");
124         usage();
125         exit(1);
126     }
127     if (ProcessCount > 500)
128     {
129         printf("\nA max of 500 processes allowed\n\n");
130         usage();
131         exit(1);
132     }
133
134     GetStartupInfo(&StartupInfo);
135     memset(&StartupInfo, '\0', sizeof(StartupInfo));
136     for (i = 0; i < ProcessCount; i++)
137     {
138         memset(command, '\0', sizeof(command));
139         for (k = 0; k < argc; k++)
140         {
141             strcat(command, argv[k]);
142             strcat(command, " ");
143             if (!stricmp(argv[k], "-f"))
144             {
145                 ++k;
146                 memset(temp, '\0', sizeof(temp));
147                 sprintf(temp, "%s%05d", argv[k], DirCount);
148                 strcat(command, temp);
149                 strcat(command, " ");
150                 ++DirCount;
151             }
152         }
153         sprintf(temp, " -g %d", LogID);
154         strcat(command, temp);
155         StartupInfo.dwFlags = STARTF_USESHOWWINDOW;
156         StartupInfo.wShowWindow = SW_SHOWMINIMIZED;
157         if (CreateProcess(".\\wintorture.exe", command, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &StartupInfo, &ProcInfo))
158             hArray[i] = ProcInfo.hProcess;
159         Sleep(SecondsDelay * 1000);
160     }
161
162         return(0);
163
164 }
165
166 void usage(void)
167 {
168
169     printf("usage: stress [options]\n");
170     printf("where options can be:\n");
171     printf("\t-a <sec>  Seconds delay between starting detached processes\n");
172     printf("\t-b        Create a chronological log\n");
173     printf("\t-c <txt>  Specifies the script txt file to use\n");
174     printf("\t-d <num>  Number of detached processes to run\n");
175     printf("\t-e        End thread processing on an error.\n");
176     printf("\t-f <name> Target directory name\n");
177 #ifdef HAVE_HESOID
178     printf("\t-l <path> Interpert as an AFS locker or AFS submount\n");
179 #endif /* HAVE_HESOID */
180     printf("\t-i <num>  Number of iterations of the stress test to run.\n");
181     printf("\t            This option will override the -m option.\n");
182     printf("\t-m <num>  The number of minutes to run\n");
183     printf("\t-n <num>  The number of threads to run\n");
184     printf("\t-p <path> UNC path to second directory\n");
185     printf("\t-s        Output stats\n");
186     printf("\t-t        Do AFS trace logging\n");
187     printf("\t-u <UNC>  UNC path to target directory\n");
188     printf("\t-v        Turn on verbose mode\n");
189     printf("\nNOTE: The switches are not case sensitive.  You\n");
190     printf("\n      may use either upper or lower case letters.\n\n");
191 }
192
193 char *_progname(char *nargv0)
194 {
195     char    *tmp;
196
197     tmp = strrchr(nargv0, '/');
198     if (tmp)
199         tmp++;
200     else
201         tmp = nargv0;
202     return(tmp);
203 }
204
205 #define BADCH   (int)'?'
206 #define BADARG  (int)':'
207 #define EMSG    ""
208
209 int getopt(int nargc, char *nargv[], char *ostr)
210 {
211     static char *__progname = 0;
212     static char *place = EMSG;          /* option letter processing */
213     char *oli;                          /* option letter list index */
214
215     __progname = __progname?__progname:_progname(*nargv);
216
217     if (optreset || !*place)
218     {
219         optreset = 0;
220         if (optind >= nargc || *(place = nargv[optind]) != '-')
221         {
222             place = EMSG;
223             return (-1);
224         }
225         if (place[1] && *++place == '-' && place[1] == '\0')
226         {
227             ++optind;
228             place = EMSG;
229             return (-1);
230         }
231     }
232     if ((optopt = (int)*place++) == (int)':' || !(oli = strchr(ostr, optopt))) 
233     {
234         if (optopt == (int)'-')
235             return (-1);
236         if (!*place)
237             ++optind;
238         if (opterr && *ostr != ':')
239             (void)fprintf(stderr, "%s: illegal option -- %c\n", __progname, optopt);
240         return (BADCH);
241     }
242     if (*++oli != ':') 
243     {
244         optarg = NULL;
245         if (!*place)
246             ++optind;
247     }
248     else
249     {
250         if (*place)
251             optarg = place;
252         else if (nargc <= ++optind) 
253         {
254             place = EMSG;
255             if (*ostr == ':')
256                 return (BADARG);
257             if (opterr)
258                 (void)fprintf(stderr, "%s: option requires an argument -- %c\n", __progname, optopt);
259             return (BADCH);
260         }
261         else
262             optarg = nargv[optind];
263         place = EMSG;
264         ++optind;
265     }
266     return (optopt);
267 }