LCOV - code coverage report
Current view: top level - src - cntr.c (source / functions) Hit Total Coverage
Test: burp-coverage-clean.info Lines: 139 399 34.8 %
Date: 2016-03-31 Functions: 18 36 50.0 %

          Line data    Source code
       1             : #include "burp.h"
       2             : #include "alloc.h"
       3             : #include "asfd.h"
       4             : #include "async.h"
       5             : #include "cmd.h"
       6             : #include "cntr.h"
       7             : #include "cstat.h"
       8             : #include "fsops.h"
       9             : #include "handy.h"
      10             : #include "log.h"
      11             : 
      12             : #include "server/monitor/json_output.h"
      13             : 
      14             : #include <limits.h>
      15             : 
      16             : #define CNTR_VERSION            3
      17             : #define CNTR_PATH_BUF_LEN       256
      18             : 
      19        2125 : static void cntr_ent_free_content(struct cntr_ent *cntr_ent)
      20             : {
      21        4250 :         if(!cntr_ent) return;
      22        2125 :         free_w(&cntr_ent->field);
      23        2125 :         free_w(&cntr_ent->label);
      24             : }
      25             : 
      26        2125 : static void cntr_ent_free(struct cntr_ent **cntr_ent)
      27             : {
      28        4250 :         if(!cntr_ent || !*cntr_ent) return;
      29        2125 :         cntr_ent_free_content(*cntr_ent);
      30        2125 :         free_v((void **)cntr_ent);
      31             : }
      32             : 
      33          85 : struct cntr *cntr_alloc(void)
      34             : {
      35          85 :         return (struct cntr *)calloc_w(1, sizeof(struct cntr), __func__);
      36             : }
      37             : 
      38        2125 : static int add_cntr_ent(struct cntr *cntr, int flags,
      39             :         enum cmd cmd, const char *field, const char *label)
      40             : {
      41        2125 :         struct cntr_ent *cenew=NULL;
      42        2125 :         if(!(cenew=(struct cntr_ent *)
      43        2125 :             calloc_w(1, sizeof(struct cntr_ent), __func__))
      44        2125 :           || !(cenew->field=strdup_w(field, __func__))
      45        4250 :           || !(cenew->label=strdup_w(label, __func__)))
      46             :                 goto error;
      47        2125 :         cenew->flags=flags;
      48        2125 :         cenew->cmd=cmd;
      49             : 
      50        2125 :         if(cntr->list) cenew->next=cntr->list;
      51        2125 :         cntr->list=cenew;
      52             : 
      53        2125 :         cntr->ent[(uint8_t)cmd]=cenew;
      54        2125 :         return 0;
      55             : error:
      56           0 :         cntr_ent_free(&cenew);
      57           0 :         return -1;
      58             : }
      59             : 
      60          85 : static size_t calc_max_str_len(struct cntr *cntr, const char *cname)
      61             : {
      62          85 :         size_t slen=0;
      63             :         char ullmax[64];
      64          85 :         struct cntr_ent *e=NULL;
      65             : 
      66             :         // See cntr_to_str().
      67             :         // First section - name/version/status
      68          85 :         slen+=strlen(cname);
      69          85 :         slen+=16; // More than enough space.
      70             : 
      71             :         // Second section.
      72             :         snprintf(ullmax, sizeof(ullmax),
      73             :                 " %"PRIu64 "\n", (uint64_t)ULLONG_MAX);
      74        2210 :         for(e=cntr->list; e; e=e->next)
      75             :         {
      76        2125 :                 if(e->flags & CNTR_SINGLE_FIELD)
      77             :                         // %c%llu\t
      78         765 :                         slen+=strlen(ullmax)+2;
      79             :                 else
      80             :                         // %c%llu/%llu/%llu/%llu/%llu\t
      81        1360 :                         slen+=(strlen(ullmax)*5)+6;
      82             :         }
      83             : 
      84             :         // Fourth section - a path. Cannot know how long this might be. Guess.
      85          85 :         slen+=CNTR_PATH_BUF_LEN+3; // %c%s\t\n
      86             : 
      87          85 :         slen+=1; // Terminating character.
      88             : 
      89          85 :         return slen;
      90             : }
      91             : 
      92          85 : int cntr_init(struct cntr *cntr, const char *cname)
      93             : {
      94          85 :         if(!cname)
      95             :         {
      96           0 :                 logp("%s called with no client name\n", __func__);
      97           0 :                 return -1;
      98             :         }
      99             : 
     100             :         // Add in reverse order, so that iterating over from the beginning
     101             :         // comes out in the right order.
     102          85 :         if(
     103             :              add_cntr_ent(cntr, CNTR_SINGLE_FIELD,
     104          85 :                 CMD_TIMESTAMP_END, "time_end", "End time")
     105          85 :           || add_cntr_ent(cntr, CNTR_SINGLE_FIELD,
     106          85 :                 CMD_TIMESTAMP, "time_start", "Start time")
     107          85 :           || add_cntr_ent(cntr, CNTR_SINGLE_FIELD,
     108          85 :                 CMD_BYTES_SENT, "bytes_sent", "Bytes sent")
     109          85 :           || add_cntr_ent(cntr, CNTR_SINGLE_FIELD,
     110          85 :                 CMD_BYTES_RECV, "bytes_received", "Bytes received")
     111          85 :           || add_cntr_ent(cntr, CNTR_SINGLE_FIELD,
     112          85 :                 CMD_BYTES, "bytes", "Bytes")
     113          85 :           || add_cntr_ent(cntr, CNTR_SINGLE_FIELD,
     114          85 :                 CMD_BYTES_ESTIMATED, "bytes_estimated", "Bytes estimated")
     115          85 :           || add_cntr_ent(cntr, CNTR_SINGLE_FIELD,
     116          85 :                 CMD_MESSAGE, "messages", "Messages")
     117          85 :           || add_cntr_ent(cntr, CNTR_SINGLE_FIELD,
     118          85 :                 CMD_WARNING, "warnings", "Warnings")
     119          85 :           || add_cntr_ent(cntr, CNTR_TABULATE,
     120          85 :                 CMD_GRAND_TOTAL, "grand_total", "Grand total")
     121          85 :           || add_cntr_ent(cntr, 0,
     122          85 :                 CMD_TOTAL, "total", "Total")
     123          85 :           || add_cntr_ent(cntr, CNTR_SINGLE_FIELD,
     124          85 :                 CMD_ERROR, "errors", "Errors")
     125          85 :           || add_cntr_ent(cntr, CNTR_TABULATE,
     126          85 :                 CMD_DATA, "blocks", "Blocks")
     127          85 :           || add_cntr_ent(cntr, CNTR_TABULATE,
     128          85 :                 CMD_EFS_FILE, "efs_files", "EFS files")
     129          85 :           || add_cntr_ent(cntr, CNTR_TABULATE,
     130          85 :                 CMD_ENC_VSS_T, "vss_footers_encrypted", "VSS footers (enc)")
     131          85 :           || add_cntr_ent(cntr, CNTR_TABULATE,
     132          85 :                 CMD_VSS_T, "vss_footers", "VSS footers")
     133          85 :           || add_cntr_ent(cntr, CNTR_TABULATE,
     134          85 :                 CMD_ENC_VSS, "vss_headers_encrypted", "VSS headers (enc)")
     135          85 :           || add_cntr_ent(cntr, CNTR_TABULATE,
     136          85 :                 CMD_VSS, "vss_headers", "VSS headers")
     137          85 :           || add_cntr_ent(cntr, CNTR_TABULATE,
     138          85 :                 CMD_SPECIAL, "special_files", "Special files")
     139          85 :           || add_cntr_ent(cntr, CNTR_TABULATE,
     140          85 :                 CMD_SOFT_LINK, "hard_links", "Soft links")
     141          85 :           || add_cntr_ent(cntr, CNTR_TABULATE,
     142          85 :                 CMD_HARD_LINK, "soft_links", "Hard links")
     143          85 :           || add_cntr_ent(cntr, CNTR_TABULATE,
     144          85 :                 CMD_DIRECTORY, "directories", "Directories")
     145          85 :           || add_cntr_ent(cntr, CNTR_TABULATE,
     146          85 :                 CMD_ENC_METADATA, "meta_data_encrypted", "Meta data (enc)")
     147          85 :           || add_cntr_ent(cntr, CNTR_TABULATE,
     148          85 :                 CMD_METADATA, "meta_data", "Meta data")
     149          85 :           || add_cntr_ent(cntr, CNTR_TABULATE,
     150          85 :                 CMD_ENC_FILE, "files_encrypted", "Files (encrypted)")
     151         170 :           || add_cntr_ent(cntr, CNTR_TABULATE,
     152          85 :                 CMD_FILE, "files", "Files")
     153             :         )
     154             :                 return -1;
     155             : 
     156          85 :         cntr->ent[(uint8_t)CMD_TIMESTAMP]->count=(uint64_t)time(NULL);
     157             : 
     158          85 :         cntr->str_max_len=calc_max_str_len(cntr, cname);
     159         170 :         if(!(cntr->str=(char *)calloc_w(1, cntr->str_max_len, __func__))
     160          85 :           || !(cntr->cname=strdup_w(cname, __func__)))
     161             :                 return -1;
     162             : 
     163          85 :         return 0;
     164             : }
     165             : 
     166          85 : static void cntr_free_content(struct cntr *cntr)
     167             : {
     168             :         struct cntr_ent *e;
     169          85 :         struct cntr_ent *l=NULL;
     170        2210 :         for(e=cntr->list; e; e=l)
     171             :         {
     172        2125 :                 l=e->next;
     173        2125 :                 cntr_ent_free(&e);
     174             :         }
     175          85 :         cntr->list=NULL;
     176          85 :         free_w(&cntr->str);
     177          85 :         free_w(&cntr->cname);
     178          85 : }
     179             : 
     180         227 : void cntr_free(struct cntr **cntr)
     181             : {
     182         454 :         if(!cntr || !*cntr) return;
     183          85 :         cntr_free_content(*cntr);
     184          85 :         free_v((void **)cntr);
     185             : }
     186             : 
     187           2 : const char *bytes_to_human(uint64_t counter)
     188             : {
     189             :         static char ret[32]="";
     190           2 :         float div=(float)counter;
     191           2 :         char units[3]="";
     192             : 
     193           2 :         if(div<1024) return "";
     194             : 
     195           0 :         if((div/=1024)<1024)
     196             :                 snprintf(units, sizeof(units), "KB");
     197           0 :         else if((div/=1024)<1024)
     198             :                 snprintf(units, sizeof(units), "MB");
     199           0 :         else if((div/=1024)<1024)
     200             :                 snprintf(units, sizeof(units), "GB");
     201           0 :         else if((div/=1024)<1024)
     202             :                 snprintf(units, sizeof(units), "TB");
     203           0 :         else if((div/=1024)<1024)
     204             :                 snprintf(units, sizeof(units), "EB");
     205             :         else
     206             :         {
     207           0 :                 div/=1024;
     208             :                 snprintf(units, sizeof(units), "PB");
     209             :         }
     210           0 :         snprintf(ret, sizeof(ret), " (%.2f %s)", div, units);
     211           0 :         return ret;
     212             : }
     213             : 
     214             : static void border(void)
     215             : {
     216           0 :         logc("--------------------------------------------------------------------------------\n");
     217             : }
     218             : 
     219           0 : static void table_border(enum action act)
     220             : {
     221           0 :         if(act==ACTION_BACKUP
     222           0 :           || act==ACTION_BACKUP_TIMED)
     223             :         {
     224           0 :           logc("%18s ------------------------------------------------------------\n", "");
     225             :         }
     226           0 :         if(act==ACTION_RESTORE
     227           0 :           || act==ACTION_VERIFY)
     228             :         {
     229           0 :           logc("%18s ------------------------------\n", "");
     230             :         }
     231           0 : }
     232             : 
     233             : static void incr_count_val(struct cntr *cntr, char ch, uint64_t val)
     234             : {
     235       12577 :         if(!cntr) return;
     236           0 :         if(cntr->ent[(uint8_t)ch]) cntr->ent[(uint8_t)ch]->count+=val;
     237             : }
     238             : 
     239             : static void incr_same_val(struct cntr *cntr, char ch, uint64_t val)
     240             : {
     241       37878 :         if(!cntr) return;
     242           0 :         if(cntr->ent[(uint8_t)ch]) cntr->ent[(uint8_t)ch]->same+=val;
     243             : }
     244             : 
     245             : static void incr_changed_val(struct cntr *cntr, char ch, uint64_t val)
     246             : {
     247          12 :         if(!cntr) return;
     248           0 :         if(cntr->ent[(uint8_t)ch]) cntr->ent[(uint8_t)ch]->changed+=val;
     249             : }
     250             : 
     251             : static void incr_deleted_val(struct cntr *cntr, char ch, uint64_t val)
     252             : {
     253           0 :         if(!cntr) return;
     254           0 :         if(cntr->ent[(uint8_t)ch]) cntr->ent[(uint8_t)ch]->deleted+=val;
     255             : }
     256             : 
     257             : static void incr_phase1_val(struct cntr *cntr, char ch, uint64_t val)
     258             : {
     259           0 :         if(!cntr) return;
     260           0 :         if(cntr->ent[(uint8_t)ch]) cntr->ent[(uint8_t)ch]->phase1+=val;
     261             : }
     262             : 
     263             : static void incr_count(struct cntr *cntr, char ch)
     264             : {
     265           0 :         return incr_count_val(cntr, ch, 1);
     266             : }
     267             : 
     268             : static void incr_same(struct cntr *cntr, char ch)
     269             : {
     270       37878 :         return incr_same_val(cntr, ch, 1);
     271             : }
     272             : 
     273             : static void incr_changed(struct cntr *cntr, char ch)
     274             : {
     275          12 :         return incr_changed_val(cntr, ch, 1);
     276             : }
     277             : 
     278             : static void incr_deleted(struct cntr *cntr, char ch)
     279             : {
     280           0 :         return incr_deleted_val(cntr, ch, 1);
     281             : }
     282             : 
     283             : static void incr_phase1(struct cntr *cntr, char ch)
     284             : {
     285           0 :         return incr_phase1_val(cntr, ch, 1);
     286             : }
     287             : 
     288             : static void print_end(uint64_t val)
     289             : {
     290           0 :         if(val) logc(" %"PRIu64 "\n", val);
     291             : }
     292             : 
     293       12678 : void cntr_add(struct cntr *c, char ch, int print)
     294             : {
     295             :         struct cntr_ent *grand_total_ent;
     296       12678 :         if(!c) return;
     297           0 :         if(!(grand_total_ent=c->ent[CMD_GRAND_TOTAL])) return;
     298           0 :         if(print)
     299             :         {
     300           0 :                 if(ch!=CMD_MESSAGE && ch!=CMD_WARNING)
     301           0 :                         logc("%c", ch);
     302             :         }
     303           0 :         if(ch==CMD_FILE_CHANGED)
     304             :         {
     305             :                 incr_changed(c, CMD_FILE);
     306             :                 incr_changed(c, CMD_TOTAL);
     307             :                 incr_changed(c, CMD_GRAND_TOTAL);
     308             :         }
     309             :         else
     310             :         {
     311           0 :                 incr_count(c, ch);
     312           0 :                 if(ch==CMD_WARNING || ch==CMD_MESSAGE) return;
     313             :                 incr_count(c, CMD_TOTAL);
     314             :         }
     315             : 
     316           0 :         if(!((++grand_total_ent->count)%64) && print)
     317           0 :                 print_end(grand_total_ent->count);
     318           0 :         fflush(stdout);
     319             : }
     320             : 
     321           0 : void cntr_add_phase1(struct cntr *c, char ch, int print)
     322             : {
     323             :         static struct cntr_ent *total;
     324           0 :         incr_phase1(c, ch);
     325             : 
     326           0 :         total=c->ent[(uint8_t)CMD_GRAND_TOTAL];
     327           0 :         ++total->phase1;
     328           0 :         if(!print) return;
     329           0 :         if(total->phase1==1) logc("\n");
     330           0 :         logc("%c", ch);
     331           0 :         if(!((total->phase1)%64))
     332           0 :                 print_end(total->phase1);
     333           0 :         fflush(stdout);
     334             : }
     335             : 
     336           0 : void cntr_add_val(struct cntr *c, char ch, uint64_t val, int print)
     337             : {
     338           0 :         incr_count_val(c, ch, val);
     339           0 : }
     340             : 
     341       12626 : void cntr_add_same(struct cntr *c, char ch)
     342             : {
     343       12626 :         incr_same(c, ch);
     344             :         incr_same(c, CMD_TOTAL);
     345             :         incr_same(c, CMD_GRAND_TOTAL);
     346       12626 : }
     347             : 
     348           0 : void cntr_add_same_val(struct cntr *c, char ch, uint64_t val)
     349             : {
     350           0 :         incr_same_val(c, ch, val);
     351             :         incr_same_val(c, CMD_TOTAL, val);
     352             :         incr_same_val(c, CMD_GRAND_TOTAL, val);
     353           0 : }
     354             : 
     355           4 : void cntr_add_changed(struct cntr *c, char ch)
     356             : {
     357           4 :         incr_changed(c, ch);
     358             :         incr_changed(c, CMD_TOTAL);
     359             :         incr_changed(c, CMD_GRAND_TOTAL);
     360           4 : }
     361             : 
     362           0 : void cntr_add_changed_val(struct cntr *c, char ch, uint64_t val)
     363             : {
     364           0 :         incr_changed_val(c, ch, val);
     365             :         incr_changed_val(c, CMD_TOTAL, val);
     366             :         incr_changed_val(c, CMD_GRAND_TOTAL, val);
     367           0 : }
     368             : 
     369           0 : void cntr_add_deleted(struct cntr *c, char ch)
     370             : {
     371           0 :         incr_deleted(c, ch);
     372             :         incr_deleted(c, CMD_TOTAL);
     373             :         incr_deleted(c, CMD_GRAND_TOTAL);
     374           0 : }
     375             : 
     376          20 : void cntr_add_bytes(struct cntr *c, uint64_t bytes)
     377             : {
     378             :         incr_count_val(c, CMD_BYTES, bytes);
     379          20 : }
     380             : 
     381          15 : void cntr_add_sentbytes(struct cntr *c, uint64_t bytes)
     382             : {
     383             :         incr_count_val(c, CMD_BYTES_SENT, bytes);
     384          15 : }
     385             : 
     386       12542 : void cntr_add_recvbytes(struct cntr *c, uint64_t bytes)
     387             : {
     388             :         incr_count_val(c, CMD_BYTES_RECV, bytes);
     389       12542 : }
     390             : 
     391           0 : static void quint_print(struct cntr_ent *ent, enum action act)
     392             : {
     393             :         uint64_t a;
     394             :         uint64_t b;
     395             :         uint64_t c;
     396             :         uint64_t d;
     397             :         uint64_t e;
     398           0 :         if(!ent) return;
     399           0 :         a=ent->count;
     400           0 :         b=ent->changed;
     401           0 :         c=ent->same;
     402           0 :         d=ent->deleted;
     403           0 :         e=ent->phase1;
     404             : 
     405           0 :         if(!(ent->flags & CNTR_TABULATE)) return;
     406             : 
     407           0 :         if(!e && !a && !b && !c) return;
     408           0 :         logc("%18s:", ent->label);
     409           0 :         if(act==ACTION_BACKUP
     410           0 :           || act==ACTION_BACKUP_TIMED)
     411             :         {
     412           0 :                 logc("%9" PRIu64 " ", a);
     413           0 :                 logc("%9" PRIu64 " ", b);
     414           0 :                 logc("%9" PRIu64 " ", c);
     415           0 :                 logc("%9" PRIu64 " ", d);
     416             :         }
     417           0 :         if(act==ACTION_RESTORE
     418           0 :           || act==ACTION_VERIFY)
     419             :         {
     420           0 :                 logc("%9s ", "");
     421             :                 //logc("%9s ", "");
     422             :                 //logc("%9s ", "");
     423             :                 //logc("%9s ", "");
     424             :         }
     425           0 :         if(act==ACTION_ESTIMATE)
     426             :         {
     427           0 :                 logc("%9s ", "");
     428           0 :                 logc("%9s ", "");
     429           0 :                 logc("%9" PRIu64 "\n", e);
     430             :         }
     431             :         else
     432             :         {
     433           0 :                 logc("%9" PRIu64 " |", a+b+c);
     434           0 :                 logc("%9" PRIu64 "\n", e);
     435             :         }
     436             : }
     437             : 
     438             : static uint64_t get_count(struct cntr_ent **ent, enum cmd cmd)
     439             : {
     440           0 :         if(!ent[(uint8_t)cmd]) return 0;
     441           0 :         return ent[(uint8_t)cmd]->count;
     442             : }
     443             : 
     444           0 : static void bottom_part(struct cntr *c, enum action act)
     445             : {
     446             :         uint64_t l;
     447           0 :         struct cntr_ent **e=c->ent;
     448           0 :         logc("\n");
     449           0 :         logc("             Messages:   %11" PRIu64 "\n", get_count(e, CMD_MESSAGE));
     450           0 :         logc("             Warnings:   %11" PRIu64 "\n", get_count(e, CMD_WARNING));
     451           0 :         logc("\n");
     452           0 :         logc("      Bytes estimated:   %11" PRIu64, get_count(e, CMD_BYTES_ESTIMATED));
     453           0 :         logc("%s\n", bytes_to_human(get_count(e, CMD_BYTES_ESTIMATED)));
     454             : 
     455           0 :         if(act==ACTION_ESTIMATE) return;
     456             : 
     457           0 :         if(act==ACTION_BACKUP
     458           0 :           || act==ACTION_BACKUP_TIMED)
     459             :         {
     460           0 :                 l=get_count(e, CMD_BYTES);
     461           0 :                 logc("      Bytes in backup:   %11" PRIu64, l);
     462           0 :                 logc("%s\n", bytes_to_human(l));
     463             :         }
     464           0 :         if(act==ACTION_RESTORE)
     465             :         {
     466           0 :                 l=get_count(e, CMD_BYTES);
     467           0 :                 logc("      Bytes attempted:   %11" PRIu64, l);
     468           0 :                 logc("%s\n", bytes_to_human(l));
     469             :         }
     470           0 :         if(act==ACTION_VERIFY)
     471             :         {
     472           0 :                 l=get_count(e, CMD_BYTES);
     473           0 :                 logc("        Bytes checked:   %11" PRIu64, l);
     474           0 :                 logc("%s\n", bytes_to_human(l));
     475             :         }
     476             : 
     477           0 :         if(act==ACTION_BACKUP
     478             :           || act==ACTION_BACKUP_TIMED)
     479             :         {
     480           0 :                 l=get_count(e, CMD_BYTES_RECV);
     481           0 :                 logc("       Bytes received:   %11" PRIu64, l);
     482           0 :                 logc("%s\n", bytes_to_human(l));
     483             :         }
     484           0 :         if(act==ACTION_BACKUP 
     485             :           || act==ACTION_BACKUP_TIMED
     486           0 :           || act==ACTION_RESTORE)
     487             :         {
     488           0 :                 l=get_count(e, CMD_BYTES_SENT);
     489           0 :                 logc("           Bytes sent:   %11" PRIu64, l);
     490           0 :                 logc("%s\n", bytes_to_human(l));
     491             :         }
     492             : }
     493             : 
     494          27 : void cntr_print(struct cntr *cntr, enum action act)
     495             : {
     496             :         struct cntr_ent *e;
     497             :         time_t now;
     498             :         time_t start;
     499             :         char time_start_str[32];
     500             :         char time_end_str[32];
     501          54 :         if(!cntr) return;
     502           0 :         now=time(NULL);
     503           0 :         start=(time_t)cntr->ent[(uint8_t)CMD_TIMESTAMP]->count;
     504           0 :         cntr->ent[(uint8_t)CMD_TIMESTAMP_END]->count=(uint64_t)now;
     505             : 
     506             :         border();
     507           0 :         encode_time(start, time_start_str);
     508           0 :         encode_time(now, time_end_str);
     509           0 :         logc("Start time: %s\n", time_start_str);
     510           0 :         logc("  End time: %s\n", time_end_str);
     511           0 :         logc("Time taken: %s\n", time_taken(now-start));
     512           0 :         if(act==ACTION_BACKUP
     513           0 :           || act==ACTION_BACKUP_TIMED)
     514             :         {
     515             :           logc("%18s %9s %9s %9s %9s %9s |%9s\n",
     516           0 :             " ", "New", "Changed", "Unchanged", "Deleted", "Total", "Scanned");
     517             :         }
     518           0 :         if(act==ACTION_RESTORE
     519           0 :           || act==ACTION_VERIFY)
     520             :         {
     521             :           logc("%18s %9s %9s |%9s\n",
     522           0 :             " ", "", "Attempted", "Expected");
     523             :         }
     524           0 :         if(act==ACTION_ESTIMATE)
     525             :         {
     526             :           logc("%18s %9s %9s %9s\n",
     527           0 :             " ", "", "", "Scanned");
     528             :         }
     529           0 :         table_border(act);
     530             : 
     531           0 :         for(e=cntr->list; e; e=e->next)
     532           0 :                 quint_print(e, act);
     533             : 
     534           0 :         table_border(act);
     535           0 :         bottom_part(cntr, act);
     536             : 
     537             :         border();
     538             : }
     539             : 
     540             : #ifndef HAVE_WIN32
     541             : 
     542           5 : int cntr_stats_to_file(struct cntr *cntr,
     543             :         const char *directory, enum action act, struct conf **confs)
     544             : {
     545           5 :         int ret=-1;
     546           5 :         int fd=-1;
     547           5 :         char *path=NULL;
     548           5 :         const char *fname=NULL;
     549           5 :         struct async *as=NULL;
     550           5 :         struct asfd *wfd=NULL;
     551           5 :         if(!cntr)
     552             :                 return 0;
     553           0 :         cntr->ent[(uint8_t)CMD_TIMESTAMP_END]->count
     554           0 :                 =(uint64_t)time(NULL);
     555             : 
     556           0 :         if(act==ACTION_BACKUP
     557           0 :           ||  act==ACTION_BACKUP_TIMED)
     558             :                 fname="backup_stats";
     559           0 :         else if(act==ACTION_RESTORE)
     560             :                 fname="restore_stats";
     561           0 :         else if(act==ACTION_VERIFY)
     562             :                 fname="verify_stats";
     563             :         else
     564             :                 return 0;
     565             : 
     566           0 :         if(!(path=prepend_s(directory, fname)))
     567             :                 goto end;
     568           0 :         if((fd=open(path, O_WRONLY|O_CREAT, 0666))<0)
     569             :         {
     570             :                 logp("Could not open %s for writing in %s: %s\n",
     571           0 :                         path, __func__, strerror(errno));
     572           0 :                 goto end;
     573             :         }
     574             :         // FIX THIS:
     575             :         // Pretty heavy duty to set up all this async stuff just so that the
     576             :         // json stuff can write to a simple file.
     577           0 :         if(!(as=async_alloc())
     578           0 :           || as->init(as, 0)
     579           0 :           || !(wfd=asfd_alloc())
     580           0 :           || wfd->init(wfd, "stats file",
     581           0 :                 as, fd, NULL, ASFD_STREAM_LINEBUF, confs))
     582             :                         goto end;
     583           0 :         as->asfd_add(as, wfd);
     584           0 :         fd=-1;
     585           0 :         if(json_cntr_to_file(wfd, cntr))
     586             :                 goto end;
     587             : 
     588             : // FIX THIS: make this use the json output stuff.
     589             : // Need to add the following few fields to the cntrs somehow.
     590             : /*
     591             :         fprintf(fp, "client_version:%s\n",
     592             :                 conf->peer_version?conf->peer_version:"");
     593             :         fprintf(fp, "server_version:%s\n", VERSION);
     594             :         fprintf(fp, "client_is_windows:%d\n", conf->client_is_windows);
     595             :         for(e=cntr->list; e; e=e->next)
     596             :                 quint_print_to_file(fp, e, act);
     597             : */
     598             : 
     599           0 :         ret=0;
     600             : end:
     601           0 :         close_fd(&fd);
     602           0 :         free_w(&path);
     603           0 :         async_free(&as);
     604           0 :         asfd_free(&wfd);
     605           0 :         return ret;
     606             : }
     607             : 
     608             : #endif
     609             : 
     610          22 : void cntr_print_end(struct cntr *cntr)
     611             : {
     612             :         struct cntr_ent *grand_total_ent;
     613          44 :         if(!cntr) return;
     614           0 :         grand_total_ent=cntr->ent[CMD_GRAND_TOTAL];
     615           0 :         if(grand_total_ent)
     616             :         {
     617           0 :                 print_end(grand_total_ent->count);
     618           0 :                 logc("\n");
     619             :         }
     620             : }
     621             : 
     622           0 : void cntr_print_end_phase1(struct cntr *cntr)
     623             : {
     624             :         struct cntr_ent *grand_total_ent;
     625           0 :         if(!cntr) return;
     626           0 :         grand_total_ent=cntr->ent[CMD_GRAND_TOTAL];
     627           0 :         if(grand_total_ent)
     628             :         {
     629           0 :                 print_end(grand_total_ent->phase1);
     630           0 :                 logc("\n");
     631             :         }
     632             : }
     633             : 
     634             : #ifndef HAVE_WIN32
     635             : // Return string length.
     636           0 : size_t cntr_to_str(struct cntr *cntr, const char *path)
     637             : {
     638             :         static char tmp[CNTR_PATH_BUF_LEN+3]="";
     639           0 :         struct cntr_ent *e=NULL;
     640           0 :         char *str=cntr->str;
     641             : 
     642           0 :         cntr->ent[(uint8_t)CMD_TIMESTAMP_END]->count=time(NULL);
     643             : 
     644             :         snprintf(str, cntr->str_max_len-1, "%s\t%d\t%d\t",
     645           0 :                 cntr->cname, CNTR_VERSION, cntr->cntr_status);
     646             : 
     647           0 :         for(e=cntr->list; e; e=e->next)
     648             :         {
     649           0 :                 if(e->flags & CNTR_SINGLE_FIELD)
     650             :                         snprintf(tmp, sizeof(tmp),
     651           0 :                                 "%c%"PRIu64"\t", e->cmd, e->count);
     652             :                 else
     653             :                         snprintf(tmp, sizeof(tmp),
     654             :                         "%c%"PRIu64"/%"PRIu64"/%"PRIu64"/%"PRIu64"/%"PRIu64"\t",
     655             :                                 e->cmd, e->count, e->same,
     656           0 :                                 e->changed, e->deleted, e->phase1);
     657             :                 strcat(str, tmp);
     658             :         }
     659             : 
     660             :         // Abuse CMD_DATAPTH.
     661           0 :         snprintf(tmp, sizeof(tmp), "%c%s\t\n", CMD_DATAPTH, path?path:"");
     662             :         strcat(str, tmp);
     663             : 
     664           0 :         return strlen(str);
     665             : }
     666             : #endif
     667             : 
     668           0 : static int extract_ul(const char *value, struct cntr_ent *ent)
     669             : {
     670           0 :         char *as=NULL;
     671           0 :         char *bs=NULL;
     672           0 :         char *cs=NULL;
     673           0 :         char *ds=NULL;
     674           0 :         char *es=NULL;
     675           0 :         char *copy=NULL;
     676           0 :         if(!value || !(copy=strdup_w(value, __func__))) return -1;
     677             : 
     678             :         // Do not want to use strtok, just in case I end up running more
     679             :         // than one at a time.
     680           0 :         as=copy;
     681           0 :         if((bs=strchr(as, '/')))
     682             :         {
     683           0 :                 *bs='\0';
     684           0 :                 ent->count=strtoull(as, NULL, 10);
     685           0 :                 if((cs=strchr(++bs, '/')))
     686             :                 {
     687           0 :                         *cs='\0';
     688           0 :                         ent->changed=strtoull(bs, NULL, 10);
     689           0 :                         if((ds=strchr(++cs, '/')))
     690             :                         {
     691           0 :                                 *ds='\0';
     692           0 :                                 ent->same=strtoull(cs, NULL, 10);
     693           0 :                                 if((es=strchr(++ds, '/')))
     694             :                                 {
     695           0 :                                         ent->deleted=strtoull(ds, NULL, 10);
     696           0 :                                         *es='\0';
     697           0 :                                         es++;
     698           0 :                                         ent->phase1=strtoull(es, NULL, 10);
     699             :                                 }
     700             :                         }
     701             :                 }
     702             :         }
     703             :         else
     704             :         {
     705             :                 // Single field.
     706           0 :                 ent->count=strtoull(as, NULL, 10);
     707             :         }
     708           0 :         free_w(&copy);
     709           0 :         return 0;
     710             : }
     711             : 
     712             : /*
     713             : static char *get_backup_str(const char *s, int *deletable)
     714             : {
     715             :         static char str[32]="";
     716             :         const char *cp=NULL;
     717             :         const char *dp=NULL;
     718             :         if(!s || !*s) return NULL;
     719             :         if(!(cp=strchr(s, ' '))
     720             :           || !(dp=strchr(cp+1, ' ')))
     721             :                 snprintf(str, sizeof(str), "never");
     722             :         else
     723             :         {
     724             :                 uint64_t backupnum=0;
     725             :                 backupnum=strtoul(s, NULL, 10);
     726             :                 snprintf(str, sizeof(str),
     727             :                         "%07lu %s", backupnum, getdatestr(atol(dp+1)));
     728             :                 if(*(cp+1)=='1') *deletable=1;
     729             :         }
     730             :         return str;
     731             : }
     732             : */
     733             : 
     734             : /*
     735             : static int add_to_backup_list(struct strlist **backups, const char *tok)
     736             : {
     737             :         int deletable=0;
     738             :         const char *str=NULL;
     739             :         if(!(str=get_backup_str(tok, &deletable))) return 0;
     740             :         if(strlist_add(backups, (char *)str, deletable)) return -1;
     741             :         return 0;
     742             : }
     743             : */
     744             : 
     745           0 : static int extract_cntrs(struct cstat *cstat, char **path)
     746             : {
     747             :         char *tok;
     748           0 :         struct cntr *cntr=cstat->cntr;
     749           0 :         while((tok=strtok(NULL, "\t\n")))
     750             :         {
     751           0 :                 switch(tok[0])
     752             :                 {
     753             :                         case CMD_DATAPTH:
     754           0 :                                 free_w(path);
     755           0 :                                 if(!(*path=strdup_w(tok+1, __func__)))
     756             :                                         return -1;
     757             :                                 break;
     758             :                         default:
     759           0 :                                 if(cntr->ent[(uint8_t)tok[0]]
     760           0 :                                   && extract_ul(tok+1,
     761           0 :                                         cntr->ent[(uint8_t)tok[0]]))
     762             :                                                 return -1;
     763             :                                 break;
     764             :                 }
     765             :         }
     766             :         return 0;
     767             : }
     768             : 
     769           0 : int str_to_cntr(const char *str, struct cstat *cstat, char **path)
     770             : {
     771           0 :         int ret=-1;
     772           0 :         char *tok=NULL;
     773           0 :         char *copy=NULL;
     774             : 
     775           0 :         if(!(copy=strdup_w(str, __func__)))
     776             :                 return -1;
     777             : 
     778           0 :         if((tok=strtok(copy, "\t\n")))
     779             :         {
     780           0 :                 char *tmp=NULL;
     781             :                 // First token is the client name. Do not need that here.
     782             :                 // Second is the cntr version.
     783           0 :                 if(!(tmp=strtok(NULL, "\t\n")))
     784             :                 {
     785             :                         logp("Parsing problem in %s: null version\n",
     786           0 :                                 __func__);
     787           0 :                         goto end;
     788             :                 }
     789           0 :                 if(atoi(tmp)!=CNTR_VERSION)
     790             :                 {
     791             :                         ret=0;
     792             :                         goto end;
     793             :                 }
     794             :                 // Third is cstat_status.
     795           0 :                 if(!(tmp=strtok(NULL, "\t\n")))
     796             :                 {
     797             :                         logp("Parsing problem in %s: null cstat_status\n",
     798           0 :                                 __func__);
     799           0 :                         goto end;
     800             :                 }
     801           0 :                 cstat->cntr->cntr_status=(enum cntr_status)atoi(tmp);
     802             : 
     803           0 :                 if(extract_cntrs(cstat, path)) goto end;
     804             :         }
     805             : 
     806             :         ret=0;
     807             : end:
     808           0 :         free_w(&copy);
     809           0 :         return ret;
     810             : }
     811             : 
     812             : #ifndef HAVE_WIN32
     813           0 : int cntr_send(struct cntr *cntr)
     814             : {
     815             : /*
     816             :         size_t l;
     817             :         char buf[4096]="";
     818             :         l=cntr_to_str(get_cntr(confs[OPT_CNTR]), STATUS_RUNNING, " ");
     819             :         if(async_write_strn(CMD_GEN, buf, l))
     820             :         {
     821             :                 logp("Error when sending counters to client.\n");
     822             :                 return -1;
     823             :         }
     824             : */
     825           0 :         return 0;
     826             : }
     827             : #endif
     828             : 
     829           0 : static enum asl_ret cntr_recv_func(struct asfd *asfd,
     830             :         struct conf **confs, void *param)
     831             : {
     832             : /*
     833             :         if(str_to_cntr(asfd->rbuf->buf, NULL, NULL, NULL, NULL,
     834             :                 conf->p1cntr, get_cntr(confs[OPT_CNTR]), NULL))
     835             :                         return ASL_END_ERROR;
     836             : */
     837           0 :         return ASL_END_OK;
     838             : }
     839             : 
     840           0 : int cntr_recv(struct asfd *asfd, struct conf **confs)
     841             : {
     842           0 :         return asfd->simple_loop(asfd, confs, NULL, __func__, cntr_recv_func);
     843             : }
     844             : 
     845           0 : const char *cntr_status_to_str(struct cntr *cntr)
     846             : {
     847           0 :         switch(cntr->cntr_status)
     848             :         {
     849             :                 case CNTR_STATUS_SCANNING: return CNTR_STATUS_STR_SCANNING;
     850             :                 case CNTR_STATUS_BACKUP: return CNTR_STATUS_STR_BACKUP;
     851             :                 case CNTR_STATUS_MERGING: return CNTR_STATUS_STR_MERGING;
     852             :                 case CNTR_STATUS_SHUFFLING: return CNTR_STATUS_STR_SHUFFLING;
     853             :                 case CNTR_STATUS_LISTING: return CNTR_STATUS_STR_LISTING;
     854             :                 case CNTR_STATUS_RESTORING: return CNTR_STATUS_STR_RESTORING;
     855             :                 case CNTR_STATUS_VERIFYING: return CNTR_STATUS_STR_VERIFYING;
     856             :                 case CNTR_STATUS_DELETING: return CNTR_STATUS_STR_DELETING;
     857             :                 case CNTR_STATUS_DIFFING: return CNTR_STATUS_STR_DIFFING;
     858             :                 default: return "unknown";
     859             :         }
     860             : }
     861             : 
     862           0 : enum cntr_status cntr_str_to_status(const char *str)
     863             : {
     864           0 :         if(!strcmp(str, CNTR_STATUS_STR_SCANNING))
     865             :                 return CNTR_STATUS_SCANNING;
     866           0 :         else if(!strcmp(str, CNTR_STATUS_STR_BACKUP))
     867             :                 return CNTR_STATUS_BACKUP;
     868           0 :         else if(!strcmp(str, CNTR_STATUS_STR_MERGING))
     869             :                 return CNTR_STATUS_MERGING;
     870           0 :         else if(!strcmp(str, CNTR_STATUS_STR_SHUFFLING))
     871             :                 return CNTR_STATUS_SHUFFLING;
     872           0 :         else if(!strcmp(str, CNTR_STATUS_STR_LISTING))
     873             :                 return CNTR_STATUS_LISTING;
     874           0 :         else if(!strcmp(str, CNTR_STATUS_STR_RESTORING))
     875             :                 return CNTR_STATUS_RESTORING;
     876           0 :         else if(!strcmp(str, CNTR_STATUS_STR_VERIFYING))
     877             :                 return CNTR_STATUS_VERIFYING;
     878           0 :         else if(!strcmp(str, CNTR_STATUS_STR_DELETING))
     879             :                 return CNTR_STATUS_DELETING;
     880           0 :         else if(!strcmp(str, CNTR_STATUS_STR_DIFFING))
     881             :                 return CNTR_STATUS_DIFFING;
     882           0 :         return CNTR_STATUS_UNSET;
     883             : }

Generated by: LCOV version 1.10