]> git.kernelconcepts.de Git - karo-tx-redboot.git/blob - packages/net/autotest/v2_0/host/tmpfile.c
Initial revision
[karo-tx-redboot.git] / packages / net / autotest / v2_0 / host / tmpfile.c
1 //==========================================================================
2 //
3 //      tmpfile.c
4 //
5 //      Make a temporary data file for test purposes
6 //
7 //==========================================================================
8 //####ECOSGPLCOPYRIGHTBEGIN####
9 // -------------------------------------------
10 // This file is part of eCos, the Embedded Configurable Operating System.
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
12 //
13 // eCos is free software; you can redistribute it and/or modify it under
14 // the terms of the GNU General Public License as published by the Free
15 // Software Foundation; either version 2 or (at your option) any later version.
16 //
17 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY
18 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
19 // FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
20 // for more details.
21 //
22 // You should have received a copy of the GNU General Public License along
23 // with eCos; if not, write to the Free Software Foundation, Inc.,
24 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
25 //
26 // As a special exception, if other files instantiate templates or use macros
27 // or inline functions from this file, or you compile this file and link it
28 // with other works to produce a work based on this file, this file does not
29 // by itself cause the resulting work to be covered by the GNU General Public
30 // License. However the source code for this file must still be made available
31 // in accordance with section (3) of the GNU General Public License.
32 //
33 // This exception does not invalidate any other reasons why a work based on
34 // this file might be covered by the GNU General Public License.
35 //
36 // -------------------------------------------
37 //####ECOSGPLCOPYRIGHTEND####
38 //####BSDCOPYRIGHTBEGIN####
39 //
40 // -------------------------------------------
41 //
42 // Portions of this software may have been derived from OpenBSD or other sources,
43 // and are covered by the appropriate copyright disclaimers included herein.
44 //
45 // -------------------------------------------
46 //
47 //####BSDCOPYRIGHTEND####
48 //==========================================================================
49 //#####DESCRIPTIONBEGIN####
50 //
51 // Author(s):    hmt
52 // Contributors: hmt
53 // Date:         2000-10-23
54 //
55 //####DESCRIPTIONEND####
56 //
57 //==========================================================================
58
59 #include <stdio.h>
60 #include <errno.h>
61
62 int main( int argc, char **argv )
63 {
64     FILE *f;
65     int i;
66     unsigned int size, iirandom, z, csum;
67     char sizec, scratchc;
68
69     if ( 3 > argc || 4 < argc) {
70     usage:
71         fprintf( stderr, "usage: %s filename length [seed]\n", argv[0] );
72         exit(1);
73     } 
74
75     f = fopen( argv[1], "rb" );
76     if ( f ) {
77         fclose( f );
78         fprintf( stderr, "File %s already exists\n", argv[1] );
79         goto usage;
80     }
81
82     i = sscanf( argv[2], "%u%1c%1c", &size, &sizec, &scratchc );
83     if ( 0 >= i || 2 < i )
84         goto usage;
85
86     if ( 2 == i ) 
87         switch ( sizec ) {
88         case 'G': size *= 1024;
89         case 'M': size *= 1024;
90         case 'k': size *= 1024;
91             break;
92         case 'b': size *= 512;
93             break;
94         default:
95             goto usage;
96         }
97
98     iirandom = 0;
99     if ( 4 == argc ) {
100         i = sscanf( argv[3], "%u%1c", &iirandom, &scratchc );
101         if ( 0 >= i || 1 < i )
102             goto usage;
103     }
104
105     f = fopen( argv[1], "wb" );
106     if ( !f ) {
107         perror( "fopen [create]" );
108         goto usage;
109     }
110
111     csum = 0;
112     iirandom += 0x23164920; // What date said
113
114     if ( size > 4 ) i = size-4; else i = size;
115
116     for ( /* i */ ; i > 0; i-- ) {
117         iirandom = iirandom * 91 + 137;
118         iirandom ^= iirandom >> 14 | iirandom << 7;
119         z = (i ^ iirandom) & 0xff;
120         // Keep a simple checksum in case we make some trick to check it in
121         // the pretend filesystem.
122         csum += z;
123         csum = (csum >> (z & 31)) ^ (csum << (32 - (z & 31)));
124         if ( 0 > putc( z, f ) ) {
125             perror( "putc" );
126             fclose( f );
127             exit( 1 );
128         }
129     }
130     // And bung the checksum on the end.
131     for ( i = 4 ; i < size && i > 0; i-- ) {
132         z = csum & 0xff;
133         csum >>= 8;
134         if ( 0 > putc( z, f ) ) {
135             perror( "putc" );
136             fclose( f );
137             exit( 1 );
138         }
139     }
140     fclose( f );
141     exit( 0 );
142 }
143
144 // EOF awaitorder.c