| /******************************************************************************/ |
| /* */ |
| /* Copyright (c) International Business Machines Corp., 2009 */ |
| /* */ |
| /* This program is free software; you can redistribute it and/or modify */ |
| /* it under the terms of the GNU General Public License as published by */ |
| /* the Free Software Foundation; either version 2 of the License, or */ |
| /* (at your option) any later version. */ |
| /* */ |
| /* This program is distributed in the hope that it will be useful, */ |
| /* but WITHOUT ANY WARRANTY; without even the implied warranty of */ |
| /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See */ |
| /* the GNU General Public License for more details. */ |
| /* */ |
| /* You should have received a copy of the GNU General Public License */ |
| /* along with this program; if not, write to the Free Software */ |
| /* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ |
| /* */ |
| /******************************************************************************/ |
| |
| /******************************************************************************/ |
| /* */ |
| /* File: frag.c */ |
| /* */ |
| /* Description: This piece of code creates two files, and writes 1k data to */ |
| /* each file in a loop from datafile. Loop continues till it */ |
| /* reaches EOF of data file. In a loop fsync, fclose is called, */ |
| /* to create fragmented files. */ |
| /* */ |
| /* Author: Jyoti Vantagodi jyotiv@linux.vnet.ibm.com */ |
| /* */ |
| /* History: Created-Jul 22 2009-Jyoti Vantagodi jyotiv@linux.vnet.ibm.com */ |
| /* */ |
| /******************************************************************************/ |
| |
| #include<stdio.h> |
| #include<fcntl.h> |
| #include<string.h> |
| #include<sys/types.h> |
| #include<unistd.h> |
| |
| FILE *fp_data; /* File pointer for data file */ |
| FILE *fp_frag1; /* File pointer for fragmented file 1 */ |
| FILE *fp_frag2; /* File pointer for fragmented file 2 */ |
| |
| int main(int argc, char *argv[]) |
| { |
| int bytes_read = 0, bytes_written = 0, fd1 = -1, fd2 = -1; |
| char buff[1024], frag_file1[100], frag_file2[100]; |
| |
| if (argc != 3) { |
| printf("Needs to pass two arguments..\n"); |
| return -1; |
| } |
| fp_data = fopen(argv[1], "r"); |
| if (!fp_data) { |
| perror("fopen"); |
| printf("Error opening datafile \n"); |
| return 1; |
| } |
| strcpy(frag_file1, argv[2]); |
| strcat(frag_file1, "/frag1"); |
| |
| strcpy(frag_file2, argv[2]); |
| strcat(frag_file2, "/frag2"); |
| do { |
| fp_frag1 = fopen(frag_file1, "a+"); |
| if (!fp_frag1) { |
| printf("Error opening fragfile \n"); |
| return -1; |
| } |
| fp_frag2 = fopen(frag_file2, "a+"); |
| if (!fp_frag2) { |
| perror("fwrite"); |
| printf("Error opening fragfile \n"); |
| return -1; |
| } |
| bytes_read = fread(buff, 1, 1024, fp_data); |
| if (bytes_read < 0) { |
| perror("fread"); |
| printf("Error reading data file\n"); |
| return -1; |
| } |
| bytes_written = fwrite(buff, 1, bytes_read, fp_frag1); |
| if (bytes_read != bytes_written) { |
| perror("fwrite"); |
| printf("Error in writing data\n"); |
| return -1; |
| } |
| bytes_written = fwrite(buff, 1, bytes_read, fp_frag2); |
| if (bytes_read != bytes_written) { |
| perror("fwrite"); |
| printf("Error in writing data\n"); |
| return -1; |
| } |
| fd1 = fileno(fp_frag1); |
| fd2 = fileno(fp_frag2); |
| |
| fsync(fd1); |
| fsync(fd2); |
| fclose(fp_frag1); |
| fclose(fp_frag2); |
| |
| if (bytes_read < 1024) |
| break; |
| } while (1); |
| fclose(fp_data); |
| return 0; |
| } |