1 /******************************************************************************/
2 /* */
3 /* Copyright (c) International Business Machines Corp., 2009 */
4 /* */
5 /* This program is free software; you can redistribute it and/or modify */
6 /* it under the terms of the GNU General Public License as published by */
7 /* the Free Software Foundation; either version 2 of the License, or */
8 /* (at your option) any later version. */
9 /* */
10 /* This program is distributed in the hope that it will be useful, */
11 /* but WITHOUT ANY WARRANTY; without even the implied warranty of */
12 /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See */
13 /* the GNU General Public License for more details. */
14 /* */
15 /* You should have received a copy of the GNU General Public License */
16 /* along with this program; if not, write to the Free Software */
17 /* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
18 /* */
19 /******************************************************************************/
20
21 /******************************************************************************/
22 /* */
23 /* File: frag.c */
24 /* */
25 /* Description: This piece of code creates two files, and writes 1k data to */
26 /* each file in a loop from datafile. Loop continues till it */
27 /* reaches EOF of data file. In a loop fsync, fclose is called, */
28 /* to create fragmented files. */
29 /* */
30 /* Author: Jyoti Vantagodi jyotiv@linux.vnet.ibm.com */
31 /* */
32 /* History: Created-Jul 22 2009-Jyoti Vantagodi jyotiv@linux.vnet.ibm.com */
33 /* */
34 /******************************************************************************/
35
36 #include<stdio.h>
37 #include<fcntl.h>
38 #include<string.h>
39 #include<sys/types.h>
40 #include<unistd.h>
41
42 FILE *fp_data; /* File pointer for data file */
43 FILE *fp_frag1; /* File pointer for fragmented file 1 */
44 FILE *fp_frag2; /* File pointer for fragmented file 2 */
45
main(int argc,char * argv[])46 int main(int argc, char *argv[])
47 {
48 int bytes_read = 0, bytes_written = 0, fd1 = -1, fd2 = -1;
49 char buff[1024], frag_file1[100], frag_file2[100];
50
51 if (argc != 3) {
52 printf("Needs to pass two arguments..\n");
53 return -1;
54 }
55 fp_data = fopen(argv[1], "r");
56 if (!fp_data) {
57 perror("fopen");
58 printf("Error opening datafile \n");
59 return 1;
60 }
61 strcpy(frag_file1, argv[2]);
62 strcat(frag_file1, "/frag1");
63
64 strcpy(frag_file2, argv[2]);
65 strcat(frag_file2, "/frag2");
66 do {
67 fp_frag1 = fopen(frag_file1, "a+");
68 if (!fp_frag1) {
69 printf("Error opening fragfile \n");
70 return -1;
71 }
72 fp_frag2 = fopen(frag_file2, "a+");
73 if (!fp_frag2) {
74 perror("fwrite");
75 printf("Error opening fragfile \n");
76 return -1;
77 }
78 bytes_read = fread(buff, 1, 1024, fp_data);
79 if (bytes_read < 0) {
80 perror("fread");
81 printf("Error reading data file\n");
82 return -1;
83 }
84 bytes_written = fwrite(buff, 1, bytes_read, fp_frag1);
85 if (bytes_read != bytes_written) {
86 perror("fwrite");
87 printf("Error in writing data\n");
88 return -1;
89 }
90 bytes_written = fwrite(buff, 1, bytes_read, fp_frag2);
91 if (bytes_read != bytes_written) {
92 perror("fwrite");
93 printf("Error in writing data\n");
94 return -1;
95 }
96 fd1 = fileno(fp_frag1);
97 fd2 = fileno(fp_frag2);
98
99 fsync(fd1);
100 fsync(fd2);
101 fclose(fp_frag1);
102 fclose(fp_frag2);
103
104 if (bytes_read < 1024)
105 break;
106 } while (1);
107 fclose(fp_data);
108 return 0;
109 }
110