This is a patch from the FreeBSD people:
[blender-staging.git] / source / blender / blenlib / intern / storage.c
index def44bb69f214af029d4870d81cfa83307f1021b..f288dde5815c304537868be1959471844ddde725 100644 (file)
@@ -50,7 +50,9 @@
 #include <time.h>
 #include <sys/stat.h>
 
-#if !defined(linux) && (defined(__sgi) || defined(__sun__) || defined(__sun) || defined(__sparc) || defined(__sparc__))
+#if defined (__sun__) || defined (__sun)
+#include <sys/statvfs.h> /* Other modern unix os's should probably use this also */
+#elif !defined(__FreeBSD__) && !defined(linux) && (defined(__sgi) || defined(__sparc) || defined(__sparc__))
 #include <sys/statfs.h>
 #endif
 
@@ -104,6 +106,8 @@ struct statfs {
 #include "BLI_util.h"
 #include "BLI_linklist.h"
 
+#include "BKE_utildefines.h"
+
 /* vars: */
 static int totnum,actnum;
 static struct direntry *files;
@@ -177,13 +181,21 @@ double BLI_diskfree(char *dir)
 
        return (double) (freec*bytesps*sectorspc);
 #else
-       struct statfs disk;
-       char name[100],*slash;
-
 
+#if defined (__sun__) || defined (__sun)
+       struct statvfs disk;
+#else
+       struct statfs disk;
+#endif
+       char name[FILE_MAXDIR],*slash;
+       int len = strlen(dir);
+       
+       if (len >= FILE_MAXDIR) /* path too long */
+               return -1;
+       
        strcpy(name,dir);
 
-       if(strlen(name)){
+       if(len){
                slash = strrchr(name,'/');
                if (slash) slash[1] = 0;
        } else strcpy(name,"/");
@@ -194,12 +206,12 @@ double BLI_diskfree(char *dir)
 #ifdef __BeOS
        return -1;
 #endif
-#if !defined(linux) && (defined (__sgi) || defined (__sun__) || defined (__sun) || defined(__sparc) || defined(__sparc__))
 
-       if (statfs(name, &disk, sizeof(struct statfs), 0)){
-               /* printf("diskfree: Couldn't get information about %s.\n",dir); */
-               return(-1);
-       }
+#if defined (__sun__) || defined (__sun)
+       if (statvfs(name, &disk)) return(-1);   
+#elif !defined(__FreeBSD__) && !defined(linux) && (defined (__sgi) || defined(__sparc) || defined(__sparc__))
+       /* WARNING - This may not be supported by geeneric unix os's - Campbell */
+       if (statfs(name, &disk, sizeof(struct statfs), 0)) return(-1);
 #endif
 
        return ( ((double) disk.f_bsize) * ((double) disk.f_bfree));
@@ -275,6 +287,14 @@ void BLI_builddir(char *dirname, char *relname)
                                BLI_addhead(dirbase,dlink);
                                newnum++;
                        }
+#else // WIN32
+                       if (seen_ == 0) {       /* should only happen for root paths like "C:\" */
+                               dlink = (struct dirlink *)malloc(sizeof(struct dirlink));
+                               strcpy(buf+rellen,".");
+                               dlink->name = BLI_strdup(buf);
+                               BLI_addhead(dirbase,dlink);
+                               newnum++;
+                       }
 #endif                 
 
                        if (files) files=(struct direntry *)realloc(files,(totnum+newnum) * sizeof(struct direntry));
@@ -316,11 +336,11 @@ void BLI_adddirstrings()
        char size[250];
        static char * types[8] = {"---", "--x", "-w-", "-wx", "r--", "r-x", "rw-", "rwx"};
        int num, mode;
-       int num1, num2, num3, num4;
+       off_t num1, num2, num3, num4, num5;
 #ifdef WIN32
        __int64 st_size;
 #else
-       long long st_size;
+       off_t st_size;
 #endif
        
        struct direntry * file;
@@ -377,7 +397,12 @@ void BLI_adddirstrings()
                strftime(files[num].time, 8, "%H:%M", tm);
                strftime(files[num].date, 16, "%d-%b-%y", tm);
 
-               st_size= files[num].s.st_size;
+               /*
+                * Seems st_size is signed 32-bit value in *nix and Windows.  This
+                * will buy us some time until files get bigger than 4GB or until
+                * everyone starts using __USE_FILE_OFFSET64 or equivalent.
+                */
+               st_size= (off_t)files[num].s.st_size;
                
                num1= st_size % 1000;
                num2= st_size/1000;
@@ -386,24 +411,28 @@ void BLI_adddirstrings()
                num3= num3 % 1000;
                num4= st_size/(1000*1000*1000);
                num4= num4 % 1000;
-
-               if(num4) sprintf(files[num].size, "%3d %03d %03d %03d", num4, num3, num2, num1);
-               else if(num3) sprintf(files[num].size, "%7d %03d %03d", num3, num2, num1);
-               else if(num2) sprintf(files[num].size, "%11d %03d", num2, num1);
-               else if(num1) sprintf(files[num].size, "%15d", num1);
+               num5= st_size/(1000000000000LL);
+               num5= num5 % 1000;
+
+               if(num5)
+                       sprintf(files[num].size, "%1d %03d %03d %03d K", (int)num5, (int)num4, (int)num3, (int)num2);
+               else if(num4) sprintf(files[num].size, "%3d %03d %03d %03d", (int)num4, (int)num3, (int)num2, (int)num1);
+               else if(num3) sprintf(files[num].size, "%7d %03d %03d", (int)num3, (int)num2, (int)num1);
+               else if(num2) sprintf(files[num].size, "%11d %03d", (int)num2, (int)num1);
+               else if(num1) sprintf(files[num].size, "%15d", (int)num1);
                else sprintf(files[num].size, "0");
 
-               strftime(datum, 32, "%d-%b-%y %R", tm);
+               strftime(datum, 32, "%d-%b-%y %H:%M", tm);
 
                if (st_size < 1000) {
-                       sprintf(size, "%10d", st_size);
+                       sprintf(size, "%10d", (int) st_size);
                } else if (st_size < 1000 * 1000) {
-                       sprintf(size, "%6d %03d", st_size / 1000, st_size % 1000);
+                       sprintf(size, "%6d %03d", (int) (st_size / 1000), (int) (st_size % 1000));
                } else if (st_size < 100 * 1000 * 1000) {
-                       sprintf(size, "%2d %03d %03d", st_size / (1000 * 1000), (st_size / 1000) % 1000, st_size % 1000);
+                       sprintf(size, "%2d %03d %03d", (int) (st_size / (1000 * 1000)), (int) ((st_size / 1000) % 1000), (int) ( st_size % 1000));
                } else {
-                       sprintf(size, "> %4.1f M", st_size / (1024.0 * 1024.0));
-                       sprintf(size, "%10d", st_size);
+                       sprintf(size, "> %4.1f M", (double) (st_size / (1024.0 * 1024.0)));
+                       sprintf(size, "%10d", (int) st_size);
                }
 
                sprintf(buf,"%s %s %10s %s", files[num].date, files[num].time, size,
@@ -454,13 +483,35 @@ int BLI_filesize(int file)
        return (buf.st_size);
 }
 
+int BLI_filepathsize(const char *path)
+{
+       int size, file = open(path, O_BINARY|O_RDONLY);
+       
+       if (file <= 0)
+               return -1;
+       
+       size = BLI_filesize(file);
+       close(file);
+       return size;
+}
 
 
 int BLI_exist(char *name)
 {
        struct stat st;
-
-       if (stat(name,&st)) return(0);
+#ifdef WIN32
+       /*  in Windows stat doesn't recognize dir ending on a slash 
+               To not break code where the ending slash is expected we
+               don't mess with the argument name directly here - elubie */
+       char tmp[FILE_MAXDIR+FILE_MAXFILE];
+       int len;
+       BLI_strncpy(tmp, name, FILE_MAXDIR+FILE_MAXFILE);
+       len = strlen(tmp);
+       if (len > 3 && ( tmp[len-1]=='\\' || tmp[len-1]=='/') ) tmp[len-1] = '\0';
+       if (stat(tmp,&st)) return(0);
+#else
+       if (stat(name,&st)) return(0);  
+#endif
        return(st.st_mode);
 }