1 | /* 2 | fcfs_newobj.c 3 | ------------- 4 | 5 | Program that inserts an object onto an FCFS volume 6 | from a unix file. 7 | 8 | $Id: fcfs_newobj.c,v 1.5 2003/10/20 07:18:11 stewart Exp $ 9 | 10 | (C)2003 Stewart Smith 11 | Distributed under the GPL 12 | */ 13 | 14 | #include <stdio.h> 15 | #include <stdlib.h> 16 | #include <sys/stat.h> 17 | #include <unistd.h> 18 | #include <fcntl.h> 19 | #include <string.h> 20 | #include <time.h> 21 | 22 | 23 | #include "testkit/block_dev.h" 24 | #include "testkit/types.h" 25 | #include "testkit/bitops.h" 26 | #include "disk.h" 27 | 28 | #include "super_block.h" 29 | #include "onode.h" 30 | #include "onode_index.h" 31 | #include "space_bitmap.h" 32 | #include "fcfs_vfs.h" 33 | 34 | #define EXPERIMENTAL 35 | 36 | int main(int argc, char* argv[]) 37 | { 38 | struct fcfs_disk* disk; 39 | struct fcfs_onode_index* index; 40 | int i; 41 | 42 | if(argc<3) 43 | { 44 | fprintf(stderr,"fcfs_newobj\n"); 45 | fprintf(stderr,"-----------\n"); 46 | fprintf(stderr,"$Id: fcfs_newobj.c,v 1.5 2003/10/20 07:18:11 stewart Exp $\n"); 47 | fprintf(stderr,"Usage:\n"); 48 | fprintf(stderr,"\t%s volume file [file2...]\n\n",argv[0]); 49 | exit(1); 50 | } 51 | 52 | disk = fcfs_mount(argv[1]); 53 | 54 | index = onode_index_read(disk); 55 | for(i=2;i<argc;i++) 56 | { 57 | struct fcfs_onode1 *node; 58 | struct fcfs_block_run *onode_br; 59 | int forknr; 60 | char data[8200]; int j; 61 | int infile; 62 | int rlen; 63 | struct stat statbuf; 64 | 65 | node = onode1_new(disk); 66 | onode_br = onode_index_insert(index,node); 67 | 68 | infile = open(argv[i],O_RDONLY); 69 | fstat(infile,&statbuf); 70 | 71 | /* UNIX source File name fork */ 72 | onode1_fork_new(disk,onode_br,0x42,strlen(argv[i]),argv[i],1); 73 | 74 | /* Current revision fork */ 75 | forknr = onode1_fork_new(disk,onode_br,0x69,statbuf.st_size,NULL,0); 76 | onode1_fork_new(disk,onode_br,0x6A,0,NULL,0); /* Revision history fork */ 77 | onode1_fork_new(disk,onode_br,0x6B,0,NULL,0); /* Revision history data fork */ 78 | 79 | fprintf(stderr,"%s in fork %d\n",argv[i],forknr); 80 | 81 | j=0; 82 | while(0 < (rlen = read(infile,data,8192))) 83 | { 84 | // fprintf(stderr,"*******WRITING %d bytes*******\n",rlen); 85 | onode1_fork_write(disk,onode_br,forknr,j,(u64)rlen,data); 86 | j+=rlen; 87 | } 88 | close(infile); 89 | free(node); 90 | free(onode_br); 91 | } 92 | 93 | fcfs_umount(disk); 94 | 95 | return 0; 96 | }