]> ruin.nu Git - popboot.git/blob - simprog.c
Spelling fix in inittab
[popboot.git] / simprog.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <unistd.h>
5 #include <sys/time.h>
6
7 void print_help(char name[])
8 {
9     printf("\n");
10     printf("Simulates execution of an program. \n");
11     printf("\n");
12     printf("Usage: %s name time [-eNN=MM [...]]\n", name);
13     printf("   name      A label to print\n");
14     printf("   time      Time for program to sleep in seconds\n"); 
15     printf("\n");
16     printf("The default action of the program is to return with 0 (success) \n");
17     printf(" -eNN=MM     Return with value NN with a probability of MM% \n");
18     printf("\n");
19 }
20
21
22 void parse_argv(char argv[], int *retval, int *percentage)
23 {
24     if ( sscanf(argv,"-e %d = %d",retval,percentage)!=2 )
25     {
26         printf("Argument sytax error : %s \n", argv);
27         exit(EXIT_FAILURE);
28     }
29
30     if ( *percentage <= 0 )
31     {
32         printf("Percentage argument must be > 0");
33         exit(EXIT_FAILURE);
34     }
35 }
36
37
38
39 int main (int argc, char** argv)
40 {
41     char *name;
42     int sleep_time, i, rand_value, retval, sum;
43     int retvals[100];
44     int percentages[100];
45     struct timeval td;
46         
47     if (argc < 3 )
48     {
49         print_help(argv[0]);
50         return 1;
51     }   
52         
53     
54     
55     name = argv[1];
56
57
58     if ( sscanf(argv[2],"%d",&sleep_time)!=1 )
59     {
60         printf("Argument sytax error : %s \n", argv[2]);
61         return 1;
62     }
63     
64     for (i=3; i<argc; i++)
65     {
66         parse_argv(argv[i], retvals+i-3, percentages+i-3);
67     }
68
69         
70     /* Get random number in interval [0,100) */
71     gettimeofday(&td,0);
72     srand(td.tv_usec);
73     rand_value = rand() % 100;  //I know, bad practice
74     
75     /* See if we want to fire an "error" */
76     retval = 0;
77     sum = 0;
78     for (i=0; i<argc-3; i++)
79     {
80         sum += percentages[i];
81         if ( rand_value < sum )
82         {
83                 retval = retvals[i];
84                 break;
85         }
86     }
87
88     /* Sleep */
89     sleep(sleep_time);
90     
91     /* Print result */ 
92     printf( name );
93     for (i=0; i<70-strlen(name); i++)
94     {
95         putchar('.');
96     }
97     printf("%d\n", retval);
98     
99     return retval;
100 }