I must ask indulgence of the audience: to set up the context I need to present a few bits of rather boring code, hopefully with a bit of excitement at the very end. The code is sort of a set of test cases for file system API:
static const char pattern [] = "1234\n467\r\n\007A!\177"; static const char pattern1 [] = "Yet another pattern"; static void do_test(const char filename[]) { printf("\nTesting File API using file name >%s<\n", filename); { int fd; printf("\n\tWriting a pattern to the file..."); do_well( fd = open(filename,O_WRONLY|O_CREAT|O_TRUNC,0777) ); assert( write(fd,pattern,sizeof(pattern)) == sizeof(pattern) ); do_well( close(fd) ); } ... |
The second test case makes sure the file indeed exists and has the right size:
{ printf("\n\tMaking sure the file we created exists and has size %d...",sizeof(pattern)); do_well( lstat(filename,&buf) ); assert( buf.st_size == sizeof(pattern) ); assert( S_ISREG(buf.st_mode) ); /* ... the same with stat() ... */ } |
The third case reads the file back and verifies what was written. The code continues in the same boring way, so I will show just the outline of the test cases rather than the code itself:
{ open(filename,O_WRONLY|O_CREAT|O_EXCL,0777) must fail } |
{ Appending to the FILE assert( (fp = fopen(filename,"ab")) != (FILE*)0 ); fprintf(fp, "%s", pattern1); do_well( fclose(fp) ); } { ... reading back and verifying... } { Truncating the FILE to pattern1 assert( (fp = fopen(filename,"wb")) != (FILE*)0 ); fprintf(fp, "%s", pattern1); do_well( fclose(fp) ); } |
fopen()
and the variety of opening modes in these cases.
{ Update: over-writing the second byte assert( (fp = fopen(filename,"r+b")) != (FILE*)0 ); for(i=0; i<strlen(pattern1); i++) assert( getc(fp) == pattern1[i] ); do_well( fseek(fp,1,SEEK_SET) ); fputc('\275',fp); do_well( fclose(fp) ); } { ... reading back and verifying... } |
fseek()
.
Here's the main()
function that calls the test driver above given a file name:
int main(void) { do_test("/tmp/x1"); ... |
int main(void) { do_test("/tmp/x1"); do_test("http://sun-server/cgi-bin/admin/ MCHFS-server.pl/DeepestRoot/tmp/x2"); ... |
/tmp/x2
on a remote Sun/Solaris computer (running an Apache web server). Only the hostname is changed to protect the innocents.
The next call to the test driver
... do_test("http://winnt-server/cgi-bin/admin/ MCHFS-server.pl/wwwroot/x2"); printf("\nAll Done\n"); return 0; } |
This main function itself ran on a Sun/Solaris and Linux/i686 computers. The entire code of this example -- file vhttpfs.c
-- is a part of the testing suite in a HTTPFS distribution.
Back to the Paper | Next example |