summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Leighton <lkcl@samba.org>2000-04-19 08:46:49 +0000
committerLuke Leighton <lkcl@samba.org>2000-04-19 08:46:49 +0000
commita3bf361aa8e96b288c0edc28571b5c1bb61f8931 (patch)
treeb6b1dfbd9ae34fb2d64dc2cdd6d6040123fce108
parent3afbeb1ed97d070bd274411e4f6f9b7d057ee138 (diff)
downloadsamba-a3bf361aa8e96b288c0edc28571b5c1bb61f8931.tar.gz
more merge.
-rw-r--r--source/Makefile.in2
-rw-r--r--source/include/proto.h4
-rw-r--r--source/printing/printing.c6
-rw-r--r--source/smbd/dfree.c129
4 files changed, 10 insertions, 131 deletions
diff --git a/source/Makefile.in b/source/Makefile.in
index f28e1a9f14f..5b7cac3fffb 100644
--- a/source/Makefile.in
+++ b/source/Makefile.in
@@ -154,7 +154,7 @@ LIB_OBJ = lib/charcnv.o lib/charset.o lib/debug.o lib/fault.o \
lib/getsmbpass.o lib/interface.o lib/kanji.o lib/md4.o \
lib/pidfile.o lib/replace.o \
lib/signal.o lib/getopt.o lib/slprintf.o \
- lib/system.o lib/doscalls.o \
+ lib/fsusage.o lib/system.o lib/doscalls.o \
lib/time.o lib/ufc.o lib/util.o lib/substitute.o \
lib/genrand.o lib/username.o \
lib/access.o lib/smbrun.o \
diff --git a/source/include/proto.h b/source/include/proto.h
index 0b2c208b8f7..63c221d5e76 100644
--- a/source/include/proto.h
+++ b/source/include/proto.h
@@ -261,6 +261,10 @@ void fault_setup(void (*fn)(void *));
int fnmatch (const char *pattern, const char *string, int flags);
+/*The following definitions come from lib/fsusage.c */
+
+int sys_fsusage(const char *path, SMB_BIG_UINT *dfree, SMB_BIG_UINT *dsize);
+
/*The following definitions come from lib/genrand.c */
void generate_random_buffer( unsigned char *out, int len, BOOL re_seed);
diff --git a/source/printing/printing.c b/source/printing/printing.c
index 0bd68d31fe9..165049b7977 100644
--- a/source/printing/printing.c
+++ b/source/printing/printing.c
@@ -565,9 +565,9 @@ int print_job_start(int snum, char *jobname)
/* see if we have sufficient disk space */
if (lp_minprintspace(snum)) {
- SMB_BIG_UINT dum1,dum2,dum3;
- if (sys_disk_free(path,False,&dum1,&dum2,&dum3) <
- (SMB_BIG_UINT)lp_minprintspace(snum)) {
+ SMB_BIG_UINT dspace, dsize;
+ if (sys_fsusage(path, &dspace, &dsize) == 0 &&
+ dspace < 2*(SMB_BIG_UINT)lp_minprintspace(snum)) {
errno = ENOSPC;
return -1;
}
diff --git a/source/smbd/dfree.c b/source/smbd/dfree.c
index eff718b1482..ee5722acd57 100644
--- a/source/smbd/dfree.c
+++ b/source/smbd/dfree.c
@@ -61,131 +61,6 @@ static void disk_norm(BOOL small_query, SMB_BIG_UINT *bsize,SMB_BIG_UINT *dfree,
}
-/* Return the number of TOSIZE-byte blocks used by
- BLOCKS FROMSIZE-byte blocks, rounding away from zero.
-*/
-static SMB_BIG_UINT adjust_blocks(SMB_BIG_UINT blocks, SMB_BIG_UINT fromsize, SMB_BIG_UINT tosize)
-{
- if (fromsize == tosize) /* e.g., from 512 to 512 */
- return blocks;
- else if (fromsize > tosize) /* e.g., from 2048 to 512 */
- return blocks * (fromsize / tosize);
- else /* e.g., from 256 to 512 */
- return (blocks + 1) / (tosize / fromsize);
-}
-
-/* this does all of the system specific guff to get the free disk space.
- It is derived from code in the GNU fileutils package, but has been
- considerably mangled for use here
-
- results are returned in *dfree and *dsize, in 512 byte units
-*/
-static int fsusage(const char *path, SMB_BIG_UINT *dfree, SMB_BIG_UINT *dsize)
-{
-#ifdef STAT_STATFS3_OSF1
-#define CONVERT_BLOCKS(B) adjust_blocks ((SMB_BIG_UINT)(B), (SMB_BIG_UINT)fsd.f_fsize, (SMB_BIG_UINT)512)
- struct statfs fsd;
-
- if (statfs (path, &fsd, sizeof (struct statfs)) != 0)
- return -1;
-#endif /* STAT_STATFS3_OSF1 */
-
-#ifdef STAT_STATFS2_FS_DATA /* Ultrix */
-#define CONVERT_BLOCKS(B) adjust_blocks ((SMB_BIG_UINT)(B), (SMB_BIG_UINT)1024, (SMB_BIG_UINT)512)
- struct fs_data fsd;
-
- if (statfs (path, &fsd) != 1)
- return -1;
-
- (*dsize) = CONVERT_BLOCKS (fsd.fd_req.btot);
- (*dfree) = CONVERT_BLOCKS (fsd.fd_req.bfreen);
-#endif /* STAT_STATFS2_FS_DATA */
-
-#ifdef STAT_STATFS2_BSIZE /* 4.3BSD, SunOS 4, HP-UX, AIX */
-#define CONVERT_BLOCKS(B) adjust_blocks ((SMB_BIG_UINT)(B), (SMB_BIG_UINT)fsd.f_bsize, (SMB_BIG_UINT)512)
- struct statfs fsd;
-
- if (statfs (path, &fsd) < 0)
- return -1;
-
-#ifdef STATFS_TRUNCATES_BLOCK_COUNTS
- /* In SunOS 4.1.2, 4.1.3, and 4.1.3_U1, the block counts in the
- struct statfs are truncated to 2GB. These conditions detect that
- truncation, presumably without botching the 4.1.1 case, in which
- the values are not truncated. The correct counts are stored in
- undocumented spare fields. */
- if (fsd.f_blocks == 0x1fffff && fsd.f_spare[0] > 0) {
- fsd.f_blocks = fsd.f_spare[0];
- fsd.f_bfree = fsd.f_spare[1];
- fsd.f_bavail = fsd.f_spare[2];
- }
-#endif /* STATFS_TRUNCATES_BLOCK_COUNTS */
-#endif /* STAT_STATFS2_BSIZE */
-
-
-#ifdef STAT_STATFS2_FSIZE /* 4.4BSD */
-#define CONVERT_BLOCKS(B) adjust_blocks ((SMB_BIG_UINT)(B), (SMB_BIG_UINT)fsd.f_fsize, (SMB_BIG_UINT)512)
-
- struct statfs fsd;
-
- if (statfs (path, &fsd) < 0)
- return -1;
-#endif /* STAT_STATFS2_FSIZE */
-
-#ifdef STAT_STATFS4 /* SVR3, Dynix, Irix, AIX */
-# if _AIX || defined(_CRAY)
-# define CONVERT_BLOCKS(B) adjust_blocks ((SMB_BIG_UINT)(B), (SMB_BIG_UINT)fsd.f_bsize, (SMB_BIG_UINT)512)
-# ifdef _CRAY
-# define f_bavail f_bfree
-# endif
-# else
-# define CONVERT_BLOCKS(B) ((SMB_BIG_UINT)B)
-# ifndef _SEQUENT_ /* _SEQUENT_ is DYNIX/ptx */
-# ifndef DOLPHIN /* DOLPHIN 3.8.alfa/7.18 has f_bavail */
-# define f_bavail f_bfree
-# endif
-# endif
-# endif
-
- struct statfs fsd;
-
- if (statfs (path, &fsd, sizeof fsd, 0) < 0)
- return -1;
- /* Empirically, the block counts on most SVR3 and SVR3-derived
- systems seem to always be in terms of 512-byte blocks,
- no matter what value f_bsize has. */
-
-#endif /* STAT_STATFS4 */
-
-#if defined(STAT_STATVFS) || defined(STAT_STATVFS64) /* SVR4 */
-# define CONVERT_BLOCKS(B) \
- adjust_blocks ((SMB_BIG_UINT)(B), fsd.f_frsize ? (SMB_BIG_UINT)fsd.f_frsize : (SMB_BIG_UINT)fsd.f_bsize, (SMB_BIG_UINT)512)
-
-#ifdef STAT_STATVFS64
- struct statvfs64 fsd;
- if (statvfs64(path, &fsd) < 0) return -1;
-#else
- struct statvfs fsd;
- if (statvfs(path, &fsd) < 0) return -1;
-#endif
-
- /* f_frsize isn't guaranteed to be supported. */
-
-#endif /* STAT_STATVFS */
-
-#ifndef CONVERT_BLOCKS
- /* we don't have any dfree code! */
- return -1;
-#else
-#if !defined(STAT_STATFS2_FS_DATA)
- /* !Ultrix */
- (*dsize) = CONVERT_BLOCKS (fsd.f_blocks);
- (*dfree) = CONVERT_BLOCKS (fsd.f_bavail);
-#endif /* not STAT_STATFS2_FS_DATA */
-#endif
-
- return 0;
-}
/****************************************************************************
return number of 1K blocks available on a path and total number
@@ -246,10 +121,10 @@ static SMB_BIG_UINT disk_free(char *path, BOOL small_query,
} else {
DEBUG (0, ("disk_free: sys_popen() failed for command %s. Error was : %s\n",
syscmd, strerror(errno) ));
- fsusage(path, dfree, dsize);
+ sys_fsusage(path, dfree, dsize);
}
} else
- fsusage(path, dfree, dsize);
+ sys_fsusage(path, dfree, dsize);
if (disk_quotas(path, &bsize_q, &dfree_q, &dsize_q)) {
(*bsize) = bsize_q;