/*Func: opt_x() * lseek 8 bytes from the beginning of arc * read the file name from argv and ready to search * find the file name from CLA * read each header file and store it in info strct * create a file by using open(info->name,RDWR_0|CREATE_O,0666) * set header of a new file * copy and paste the rest of the content from arch (use info->size) */ void opt_x(int argc, char **argv,int arch, int *filecount, int *fcalled, file *info){ char cur_name[16]; char *null_cur_name; char *null_info_name; int newfile=0; int fbyte_max=120; int fbyte=0; struct stat archinfo; fstat(arch,&archinfo); fbyte_max = archinfo.st_size; for((*fcalled) = 0; (*fcalled)<filecount[3];++(*fcalled)){ fbyte = 0; lseek(arch,8,SEEK_SET); read_filename(argv,filecount,2,fcalled,info);//get name from CLA for(fbyte_max ; fbyte < fbyte_max; fbyte++ ){ //for the end of file read(arch, cur_name,16); //get name of the file from arch null_cur_name = null_str(cur_name,16);//turn both of the name into null_cur_name = shrt_str(null_cur_name); null_info_name = null_str(info->name,16);//null terminated strings null_info_name = shrt_str(null_info_name); if(!strcmp(null_cur_name, null_info_name)){ put_header(arch, info); remove(null_info_name); newfile = open(null_info_name, O_RDWR|O_CREAT,0666); info->desc = arch; lseek(arch,2,SEEK_CUR); write_file_content(newfile, info); if(atoi(info->size)%2!=0) lseek(arch,1,SEEK_CUR); utime(null_info_name, atoi(info->time)); chmod(null_info_name, strtol(info->mode,NULL,8)); break; }else{ iter_arch(arch,&fbyte,info); } }//where the for EOF ends if(fbyte>=fbyte_max) printf(CY"Warning: File(\"%s\") doesn't documented in archeive.\nThe other file has successfully extract\n"NC,null_info_name); } /* printf("info->name: %.16s\n",info->name); printf("info->time: %.12s\n",info->time); printf("info->uid: %.6s\n",info->uid); printf("info->gid: %.6s\n",info->gid); printf("info->mode: %.8s\n",info->mode); printf("info->size: %.10s\n",info->size); */ return; }
/*Func: opt_q() * If the -q has been specified, this function is called * Read from file in argv[n]; n is filecount[lq|cq] * Format the input and put the info. in temp file * Read from temp into arch */ void opt_q(int argc, char **argv,int arch, int *filecount, int *fcalled, file *info){ int tempfile = 0; for((*fcalled) = 0; (*fcalled)<filecount[1];++(*fcalled)){ tempfile = 0; read_header(argc,argv,filecount, 0, fcalled,info ); tempfile = create_tempfile(); write_file_header(tempfile, info); write_file_content(tempfile, info); all_in_arch(tempfile,arch,fcalled ,info); close(tempfile); } (*fcalled)=0; return ; }
void opt_d(int argc, char **argv,int *arch, int *filecount, int *fcalled, file *info){ int fbyte_max=1; int fbyte=0; int size = 0; int tsize = 0; int tempfile=0; int temparch =0; char cur_name[16]; char *null_cur_name; char *null_info_name; char *str_buf; struct stat archinfo; struct stat temparch_info; fstat((*arch),&archinfo); temparch = open_file("temp_arch",1); fbyte_max = archinfo.st_size; //for fcalled goes here fbyte = 0; lseek((*arch),8,SEEK_SET); read_filename(argv,filecount,4,fcalled,info); for(fbyte=0; fbyte < fbyte_max; ){ read((*arch),cur_name,16); null_cur_name = null_str(cur_name,16); null_cur_name = shrt_str(null_cur_name); null_info_name= null_str(info->name,16); null_info_name = shrt_str(null_info_name); (fbyte) += 60+atoi(info->size); if(fbyte < fbyte_max){ if(!strcmp(null_cur_name,null_info_name)){//equal iter_arch((*arch), &fbyte, info); (fbyte) -= 60+atoi(info->size); }else{ tempfile = 0; put_header((*arch), info); lseek((*arch),2,SEEK_CUR); /*printf("\ninfo->name: %.16s\n",info->name); printf("cur name: %.16s\n",cur_name); printf("info->time: %.12s\n",info->time); printf("info->uid: %.6s\n",info->uid); printf("info->gid: %.6s\n",info->gid); printf("info->mode: %.8s\n",info->mode); printf("info->size: %.10s\n",info->size); */ //so now the header are read correctly //Time to put info in files tempfile = create_tempfile(); write_file_header2(tempfile,cur_name,info); info->desc = (*arch); write_file_content(tempfile,info); all_in_arch(tempfile,temparch,fcalled,info); if(tsize%2!=0){ write(temparch,"\n",1); } (*fcalled)++; close(tempfile); if(atoi(info->size)%2!=0) lseek((*arch),1,SEEK_CUR); } } } //FIXME: the temp_arch has the correct info but when copy to arch itself has wrong info. fstat(temparch,&temparch_info); size = temparch_info.st_size; printf("temparch.size: %d\n",size); str_buf = malloc(sizeof(char)*size); read(temparch,str_buf,size); //ftruncate((*arch),(sizeof(char))*size); lseek((*arch),0,SEEK_SET); write((*arch),str_buf,size); free(str_buf); close(temparch); //remove("temp_arch"); }
static int process_package(rpmts ts, char * filename) { FD_t fdi; FD_t gzdi; Header h; int rc = 0; char * rpmio_flags = NULL; struct archive *a; struct archive_entry *entry; if (!strcmp(filename, "-")) { fdi = fdDup(STDIN_FILENO); } else { fdi = Fopen(filename, "r.ufdio"); } if (Ferror(fdi)) { fprintf(stderr, "rpm2archive: %s: %s\n", filename, Fstrerror(fdi)); exit(EXIT_FAILURE); } rc = rpmReadPackageFile(ts, fdi, "rpm2cpio", &h); switch (rc) { case RPMRC_OK: case RPMRC_NOKEY: case RPMRC_NOTTRUSTED: break; case RPMRC_NOTFOUND: fprintf(stderr, _("argument is not an RPM package\n")); exit(EXIT_FAILURE); break; case RPMRC_FAIL: default: fprintf(stderr, _("error reading header from package\n")); exit(EXIT_FAILURE); break; } /* Retrieve payload size and compression type. */ { const char *compr = headerGetString(h, RPMTAG_PAYLOADCOMPRESSOR); rpmio_flags = rstrscat(NULL, "r.", compr ? compr : "gzip", NULL); } gzdi = Fdopen(fdi, rpmio_flags); /* XXX gzdi == fdi */ free(rpmio_flags); if (gzdi == NULL) { fprintf(stderr, _("cannot re-open payload: %s\n"), Fstrerror(gzdi)); exit(EXIT_FAILURE); } rpmfiles files = rpmfilesNew(NULL, h, 0, RPMFI_KEEPHEADER); rpmfi fi = rpmfiNewArchiveReader(gzdi, files, RPMFI_ITER_READ_ARCHIVE_CONTENT_FIRST); /* create archive */ a = archive_write_new(); archive_write_add_filter_gzip(a); archive_write_set_format_pax_restricted(a); if (!strcmp(filename, "-")) { if (isatty(STDOUT_FILENO)) { fprintf(stderr, "Error: refusing to output archive data to a terminal.\n"); exit(EXIT_FAILURE); } archive_write_open_fd(a, STDOUT_FILENO); } else { char * outname = rstrscat(NULL, filename, ".tgz", NULL); archive_write_open_filename(a, outname); _free(outname); // XXX error handling } entry = archive_entry_new(); char * buf = xmalloc(BUFSIZE); char * hardlink = NULL; rc = 0; while (rc >= 0) { rc = rpmfiNext(fi); if (rc == RPMERR_ITER_END) { break; } rpm_mode_t mode = rpmfiFMode(fi); int nlink = rpmfiFNlink(fi); fill_archive_entry(a, entry, fi); if (nlink > 1) { if (rpmfiArchiveHasContent(fi)) { _free(hardlink); hardlink = rstrscat(NULL, ".", rpmfiFN(fi), NULL); } else { archive_entry_set_hardlink(entry, hardlink); } } archive_write_header(a, entry); if (S_ISREG(mode) && (nlink == 1 || rpmfiArchiveHasContent(fi))) { write_file_content(a, buf, fi); } } /* End of iteration is not an error */ if (rc == RPMERR_ITER_END) { rc = 0; } _free(hardlink); Fclose(gzdi); /* XXX gzdi == fdi */ archive_entry_free(entry); archive_write_close(a); archive_write_free(a); buf = _free(buf); rpmfilesFree(files); rpmfiFree(fi); headerFree(h); return rc; }
void opt_d(int argc, char **argv,int *arch, int *filecount, int *fcalled, file *info){ int fbyte_max=1; int fbyte=0; int size = 0; int tempfile=0; int temparch =0; char cur_name[16]; char *null_cur_name; char *null_info_name; char *str_buf; struct stat archinfo; struct stat temparch_info; fstat((*arch),&archinfo); temparch = create_tempfile(); write(temparch,"!<arch>\n",8); fstat(temparch,&temparch_info); fbyte_max = archinfo.st_size; fbyte = 0; lseek((*arch),8,SEEK_SET); read_filename(argv,filecount,4,fcalled,info); for(fbyte=0; fbyte < fbyte_max; fbyte++){ read((*arch),cur_name,16); null_cur_name = null_str(cur_name,16); null_cur_name = shrt_str(null_cur_name); null_info_name= null_str(info->name,16); null_info_name = shrt_str(null_info_name); (fbyte) += 60+atoi(info->size); if(fbyte < fbyte_max){ if(!strcmp(null_cur_name,null_info_name)){ iter_arch((*arch), &fbyte, info); if(atoi(info->size)%2!=0){ lseek((*arch),1,SEEK_CUR); (fbyte)++; } }else{ read_header(argc, argv, filecount, 4, fcalled, info); tempfile = create_tempfile(); write_file_header(tempfile,info); info->desc = (*arch); write_file_content(tempfile,info); all_in_arch(tempfile,temparch,fcalled,info); close(tempfile); } } } remove(argv[1]); (*arch) = open_file(argv[1],1); size = temparch_info.st_size; str_buf = malloc(sizeof(char)*size); read(temparch,str_buf,size); close(temparch); }