X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/13a1f7929ed05c652dc1b3eb4489ced01c8616f1..fee64929a32a6cd69c3a675adb86e28440af6a2b:/flist.c diff --git a/flist.c b/flist.c index d298db1d..b333b5be 100644 --- a/flist.c +++ b/flist.c @@ -360,8 +360,10 @@ static void send_directory(int f,struct file_list *flist,char *dir) strncpy(fname,dir,MAXPATHLEN-1); fname[MAXPATHLEN-1]=0; l = strlen(fname); - if (fname[l-1] != '/') - strcat(fname,"/"); + if (fname[l-1] != '/') { + strcat(fname,"/"); + l++; + } p = fname + strlen(fname); if (cvs_exclude) { @@ -373,7 +375,7 @@ static void send_directory(int f,struct file_list *flist,char *dir) if (strcmp(di->d_name,".")==0 || strcmp(di->d_name,"..")==0) continue; - strncpy(p,di->d_name,MAXPATHLEN-l); + strncpy(p,di->d_name,MAXPATHLEN-(l+1)); send_file_name(f,flist,fname); } @@ -558,22 +560,36 @@ int file_compare(struct file_struct *f1,struct file_struct *f2) } +/* we need this function because of the silly way in which duplicate + entries are handled in the file lists - we can't change this + without breaking existing versions */ +static int flist_up(struct file_list *flist, int i) +{ + while (!flist->files[i].name) i++; + return i; +} + + int flist_find(struct file_list *flist,struct file_struct *f) { - int low=0,high=flist->count-1; - - while (low != high) { - int mid = (low+high)/2; - int ret = file_compare(&flist->files[mid],f); - if (ret == 0) return mid; - if (ret > 0) - high=mid; - else - low=mid+1; - } - if (file_compare(&flist->files[low],f) == 0) - return low; - return -1; + int low=0,high=flist->count-1; + + if (flist->count <= 0) return -1; + + while (low != high) { + int mid = (low+high)/2; + int ret = file_compare(&flist->files[flist_up(flist, mid)],f); + if (ret == 0) return flist_up(flist, mid); + if (ret > 0) { + high=mid; + } else { + low=mid+1; + } + } + + if (file_compare(&flist->files[flist_up(flist,low)],f) == 0) + return flist_up(flist,low); + return -1; }