LCOV - code coverage report
Current view: top level - src/server/protocol2 - rblk.c (source / functions) Hit Total Coverage
Test: burp-coverage-clean.info Lines: 0 60 0.0 %
Date: 2015-10-31 Functions: 0 3 0.0 %

          Line data    Source code
       1             : #include "../../burp.h"
       2             : #include "../../alloc.h"
       3             : #include "../../cmd.h"
       4             : #include "../../fzp.h"
       5             : #include "../../hexmap.h"
       6             : #include "../../iobuf.h"
       7             : #include "../../log.h"
       8             : #include "../../protocol2/blk.h"
       9             : 
      10             : // For retrieving stored data.
      11             : struct rblk
      12             : {
      13             :         char *datpath;
      14             :         struct iobuf readbuf[DATA_FILE_SIG_MAX];
      15             :         uint16_t readbuflen;
      16             : };
      17             : 
      18             : #define RBLK_MAX        10
      19             : 
      20           0 : static int load_rblk(struct rblk *rblks, int ind, const char *datpath)
      21             : {
      22             :         int r;
      23           0 :         int ret=-1;
      24           0 :         int done=0;
      25             :         struct fzp *fzp;
      26             :         struct iobuf rbuf;
      27             : 
      28           0 :         iobuf_init(&rbuf);
      29             : 
      30           0 :         free_w(&rblks[ind].datpath);
      31           0 :         if(!(rblks[ind].datpath=strdup_w(datpath, __func__)))
      32           0 :                 goto end;
      33             : 
      34           0 :         logp("swap %d to: %s\n", ind, datpath);
      35             : 
      36           0 :         if(!(fzp=fzp_open(datpath, "rb")))
      37           0 :                 goto end;
      38           0 :         for(r=0; r<DATA_FILE_SIG_MAX; r++)
      39             :         {
      40           0 :                 switch(iobuf_fill_from_fzp_data(&rbuf, fzp))
      41             :                 {
      42           0 :                         case 0: if(rbuf.cmd!=CMD_DATA)
      43             :                                 {
      44             :                                         logp("unknown cmd in %s: %c\n",
      45           0 :                                                 __func__, rbuf.cmd);
      46           0 :                                         goto end;
      47             :                                 }
      48           0 :                                 iobuf_free_content(&rblks[ind].readbuf[r]);
      49           0 :                                 iobuf_move(&rblks[ind].readbuf[r], &rbuf);
      50           0 :                                 continue;
      51           0 :                         case 1: done++;
      52           0 :                                 break;
      53           0 :                         default: goto end;
      54             :                 }
      55           0 :                 if(done) break;
      56             :         }
      57           0 :         rblks[ind].readbuflen=r;
      58           0 :         ret=0;
      59             : end:
      60           0 :         fzp_close(&fzp);
      61           0 :         return ret;
      62             : }
      63             : 
      64           0 : static struct rblk *get_rblk(struct rblk *rblks, const char *datpath)
      65             : {
      66             :         static int current_ind=0;
      67             :         static int last_swap_ind=0;
      68           0 :         int ind=current_ind;
      69             : 
      70             :         while(1)
      71             :         {
      72           0 :                 if(!rblks[ind].datpath)
      73             :                 {
      74           0 :                         if(load_rblk(rblks, ind, datpath)) return NULL;
      75           0 :                         last_swap_ind=ind;
      76           0 :                         current_ind=ind;
      77           0 :                         return &rblks[current_ind];
      78             :                 }
      79           0 :                 else if(!strcmp(rblks[ind].datpath, datpath))
      80             :                 {
      81           0 :                         current_ind=ind;
      82           0 :                         return &rblks[current_ind];
      83             :                 }
      84           0 :                 ind++;
      85           0 :                 if(ind==RBLK_MAX) ind=0;
      86           0 :                 if(ind==current_ind)
      87             :                 {
      88             :                         // Went through all RBLK_MAX entries.
      89             :                         // Replace the oldest one.
      90           0 :                         ind=last_swap_ind+1;
      91           0 :                         if(ind==RBLK_MAX) ind=0;
      92           0 :                         if(load_rblk(rblks, ind, datpath)) return NULL;
      93           0 :                         last_swap_ind=ind;
      94           0 :                         current_ind=ind;
      95           0 :                         return &rblks[current_ind];
      96             :                 }
      97           0 :         }
      98             : }
      99             : 
     100           0 : int rblk_retrieve_data(const char *datpath, struct blk *blk)
     101             : {
     102             :         static char fulldatpath[256]="";
     103             :         static struct rblk *rblks=NULL;
     104             :         uint16_t datno;
     105             :         struct rblk *rblk;
     106             : 
     107             :         snprintf(fulldatpath, sizeof(fulldatpath), "%s/%s", datpath,
     108           0 :                 uint64_to_savepathstr_with_sig_uint(blk->savepath, &datno));
     109             : 
     110           0 :         if(!rblks
     111           0 :           && !(rblks=(struct rblk *)
     112           0 :                 calloc_w(RBLK_MAX, sizeof(struct rblk), __func__)))
     113           0 :                         return -1;
     114             : 
     115           0 :         if(!(rblk=get_rblk(rblks, fulldatpath)))
     116             :         {
     117           0 :                 return -1;
     118             :         }
     119             : 
     120             : //      printf("lookup: %s (%s)\n", fulldatpath, cp);
     121           0 :         if(datno>rblk->readbuflen)
     122             :         {
     123             :                 logp("dat index %d is greater than readbuflen: %d\n",
     124           0 :                         datno, rblk->readbuflen);
     125           0 :                 return -1;
     126             :         }
     127           0 :         blk->data=rblk->readbuf[datno].buf;
     128           0 :         blk->length=rblk->readbuf[datno].len;
     129             : //      printf("length: %d\n", blk->length);
     130             : 
     131           0 :         return 0;
     132             : }

Generated by: LCOV version 1.10