This is just me rambling……
Anyways I was looking at some source, and instead of me trying to make heads or tails of it, it’d be more fun to have the machine try to do so, and in this endeavor I thought I’d try cflow.
So let’s try something terribly simply, like the fortune program from Unix 32v:
#include stdio.h
char line[500];
char bline[500];
main()
{
double p;
register char * l;
long t;
FILE *f;
f = fopen("/usr/games/lib/fortunes", "r");
if (f == NULL) {
printf("Memory fault -- core dumped\n");
exit(1);
}
time(&t);
srand(getpid() + (int)((t>>16) + t));
p = 1.;
for(;;) {
l = fgets(line, 500, f);
if(l == NULL)
break;
if(rand() < 2147483648./p)
strcpy(bline, line);
p += 1.;
}
fputs(bline, stdout);
return(0);
}
This is a simple program, to say the least. Â So running cflow gives me this:
# cflow fortune.c
main() :
fopen()
printf()
exit()
time()
srand()
getpid()
fgets()
rand()
strcpy()
fputs()
Simple, right? Â Now let’s add in the C pre-processor, and add in the 32v include paths….
# cflow --cpp='/usr/bin/cpp -nostdinc -I../../include -I../../include/sys -I.' -n fortune.c
1 main() :
2 fopen()
3 printf()
4 exit()
5 time()
6 srand()
7 getpid()
8 fgets()
9 rand()
10 strcpy()
11 fputs()
OK same thing, I can’t say I was expecting anything else. Â But now let’s add in libc:
# cflow --cpp='/usr/bin/cpp -nostdinc -I../../include -I../../include/sys -I.' -n fortune.c ../libc/gen/*.c ../libc/stdio/*.c
1 main() [main () at ../libc/gen/ttytest.c:2]:
2 fopen() [struct _iobuf fopen (file, mode) at ../libc/stdio/fopen.c:5]
3 printf() [printf (fmt, args) at ../libc/stdio/printf.c:3]:
4 exit()
5 time()
6 srand()
7 getpid()
8 fgets() [char *fgets (s, n, iop) at ../libc/stdio/fgets.c:4]
9 rand() [rand () at ../libc/gen/rand.c:9]
10 strcpy()
11 fputs()
12 ttyname() [char *ttyname (f) at ../libc/gen/ttyname.c:17]:
13 isatty() [if (isatty (( & _iob[1]) _file)) at ../libc/stdio/flsbuf.c:24]:
14 gtty() [gtty (fd, ap) at ../libc/gen/stty.c:13]:
15 ioctl()
16 fstat()
17 open()
18 read()
19 strcpy()
20 strcat()
21 stat()
22 close()
Isn’t that cool? Â Now what does the kernel do?
I went ahead and renamed the main function call in the 32v kernel so that way it doesn’t mesh the main’s but here is the call flow:
# cflow --cpp='/usr/bin/cpp -nostdinc -I../../include -I../../include/sys -I.' -n fortune.c ../libc/gen/*.c ../libc/stdio/*.c ../sys/sys/*.c
1 main() [main () at ../libc/gen/ttytest.c:2]:
2 fopen() [struct _iobuf fopen (file, mode) at ../libc/stdio/fopen.c:5]
3 printf() [printf (fmt, args) at ../libc/stdio/printf.c:3]:
4 exit() [exit (rv) at ../sys/sys/sys1.c:343]:
5 closef()
6 plock()
7 iput()
8 xfree() [xfree () at ../sys/sys/text.c:127]
9 acct() [acct () at ../sys/sys/acct.c:51]:
10 plock()
11 compress()
12 writei()
13 prele()
14 memfree()
15 wakeup()
16 setrun()
17 swtch() [swtch () at ../sys/sys/slp.c:417]:
18 save() [if (save (u u_ssav)) at ../sys/sys/text.c:253]
19 resume()
20 spl6()
21 idle()
22 spl0()
23 srand()
24 getpid() [getpid () at ../sys/sys/sys4.c:120]:
25 fgets() [char *fgets (s, n, iop) at ../libc/stdio/fgets.c:4]
26 rand() [rand () at ../libc/gen/rand.c:9]
27 strcpy()
28 fputs()
29 ttyname() [char *ttyname (f) at ../libc/gen/ttyname.c:17]:
30 isatty() [if (isatty (( & _iob[1]) _file)) at ../libc/stdio/flsbuf.c:24]:
31 gtty() [gtty () at ../sys/sys/tty.c:90]:
32 ioctl() [ioctl () at ../sys/sys/tty.c:102]:
33 getf()
34 fstat() [fstat () at ../sys/sys/sys3.c:18]:
35 getf()
36 stat1()
37 open() [open () at ../sys/sys/sys2.c:80]
38 read() [read () at ../sys/sys/sys2.c:12]:
39 rdwr()
40 strcpy()
41 strcat()
42 stat() [stat () at ../sys/sys/sys3.c:36]:
43 namei() [struct inode namei (func, flag) at ../sys/sys/nami.c:21]
44 uchar() [uchar () at ../sys/sys/nami.c:216]:
45 fubyte()
46 stat1()
47 iput()
48 close() [close () at ../sys/sys/sys2.c:163]
For something more aggressive, check out the QuakeWorld Server, and UAE 0.4