/******************************************************************************/ /* */ /* 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; }