int himd_add_fragment_info(struct himd * himd, struct fraginfo * f, struct himderrinfo * status) { int idx_freefrag; unsigned char * linkbuffer; unsigned char * fragbuffer; status = status; g_return_val_if_fail(himd != NULL, -1); g_return_val_if_fail(f != NULL, -1); linkbuffer = get_frag(himd, 0); idx_freefrag = beword16(linkbuffer+14) & 0xFFF; fragbuffer = get_frag(himd, idx_freefrag); setbeword16(linkbuffer+14, beword16(fragbuffer+14) & 0xFFF); f->nextfrag = 0; /* copy fragment struct to slot buffer */ setfrag(f, fragbuffer); return idx_freefrag; }
int himd_get_fragment_info(struct himd * himd, unsigned int idx, struct fraginfo * f, struct himderrinfo * status) { unsigned char * fragbuffer; g_return_val_if_fail(himd != NULL, -1); g_return_val_if_fail(idx >= HIMD_FIRST_FRAGMENT, -1); g_return_val_if_fail(idx <= HIMD_LAST_FRAGMENT, -1); g_return_val_if_fail(f != NULL, -1); fragbuffer = get_frag(himd, idx); memcpy(f->key, fragbuffer, 8); f->firstblock = beword16(fragbuffer + 8); f->lastblock = beword16(fragbuffer + 10); f->firstframe = fragbuffer[12]; f->lastframe = fragbuffer[13]; f->fragtype = fragbuffer[14] >> 4; f->nextfrag = beword16(fragbuffer+14) & 0xFFF; (void)status; return 0; }
/* TRANSFER */ int transfer(int sock,struct sockaddr_in *server,int file_id,FILE *foutfd,int size){ struct fgetfrag *req; struct ffrag ans; int last_asked=0; int offset=0; printf("\nvale: %i\n",sizeof(*req)); printf("vale: %i\n",sizeof(req->type)); printf("vale: %i\n",sizeof(req->file_id)); printf("vale: %i\n",sizeof(req->offset)); printf("vale: %i\n",sizeof(req->md5)); while (offset<size){ req=get_frag(file_id,offset); last_asked=offset; send_buf(sock,server,req,sizeof(*req)); print_fgetfrag(*req); if(receive(sock,(void *)&ans,sizeof(ans))==0){ if(check_ffrag(ans)){ printf("Corrupt packet\n"); exit(1); } else{ if (ans.offset==last_asked){ // Answer correct fseek(foutfd,SEEK_SET,ans.offset); if(fwrite(ans.fragment,sizeof(char),ans.size,foutfd)!=ans.size){ // Fail writing to outfile printf("Error writing to file"); exit(1); } offset=ans.offset+ans.size; } } } } return 0; }