Implement support for [f]statvfs1(2)
The [f]statvfs(3) calls now use [f]statvfs1(2). Change-Id: I949c177fc14abf976e45165c342f897f4ec988ee
This commit is contained in:
		
							parent
							
								
									266239fe64
								
							
						
					
					
						commit
						8143b9bf1d
					
				| @ -2216,6 +2216,7 @@ | ||||
| ./usr/man/man2/FD_SET.2			minix-sys | ||||
| ./usr/man/man2/fork.2			minix-sys | ||||
| ./usr/man/man2/fstatvfs.2		minix-sys | ||||
| ./usr/man/man2/fstatvfs1.2		minix-sys | ||||
| ./usr/man/man2/getgid.2			minix-sys | ||||
| ./usr/man/man2/getitimer.2		minix-sys | ||||
| ./usr/man/man2/getnucred.2		minix-sys | ||||
| @ -2268,6 +2269,7 @@ | ||||
| ./usr/man/man2/socket.2			minix-sys | ||||
| ./usr/man/man2/socketpair.2		minix-sys | ||||
| ./usr/man/man2/statvfs.2		minix-sys | ||||
| ./usr/man/man2/statvfs1.2		minix-sys | ||||
| ./usr/man/man2/svrctl.2			minix-sys | ||||
| ./usr/man/man2/symlink.2		minix-sys | ||||
| ./usr/man/man2/sync.2			minix-sys | ||||
|  | ||||
| @ -75,8 +75,8 @@ | ||||
| #define GETDENTS_321	  80	/* to VFS */ | ||||
| #define LLSEEK		  81	/* to VFS */ | ||||
| #define GETVFSSTAT	  82	/* to VFS */ | ||||
| #define STATVFS 	  83	/* to VFS */ | ||||
| #define FSTATVFS 	  84	/* to VFS */ | ||||
| #define STATVFS1 	  83	/* to VFS */ | ||||
| #define FSTATVFS1 	  84	/* to VFS */ | ||||
| #define SELECT            85	/* to VFS */ | ||||
| #define FCHDIR            86	/* to VFS */ | ||||
| #define FSYNC             87	/* to VFS */ | ||||
|  | ||||
| @ -907,14 +907,16 @@ | ||||
| #define VFS_GETVFSSTAT_SIZE	m1_i1 | ||||
| #define VFS_GETVFSSTAT_FLAGS	m1_i2 | ||||
| 
 | ||||
| /* Field names for the fstatvfs call */ | ||||
| #define FSTATVFS_FD m1_i1 | ||||
| #define FSTATVFS_BUF m1_p1 | ||||
| /* Field names for the fstatvfs1(2) call. */ | ||||
| #define VFS_FSTATVFS1_FD	m1_i1 | ||||
| #define VFS_FSTATVFS1_BUF	m1_p1 | ||||
| #define VFS_FSTATVFS1_FLAGS	m1_i2 | ||||
| 
 | ||||
| /* Field names for the statvfs call */ | ||||
| #define STATVFS_LEN m1_i1 | ||||
| #define STATVFS_NAME m1_p1 | ||||
| #define STATVFS_BUF m1_p2 | ||||
| /* Field names for the statvfs1(2) call. */ | ||||
| #define VFS_STATVFS1_LEN	m1_i1 | ||||
| #define VFS_STATVFS1_NAME	m1_p1 | ||||
| #define VFS_STATVFS1_BUF	m1_p2 | ||||
| #define VFS_STATVFS1_FLAGS	m1_i2 | ||||
| 
 | ||||
| /* Field names for the mount(2) call. */ | ||||
| #define VFS_MOUNT_FLAGS		m11_i1 | ||||
|  | ||||
| @ -284,6 +284,7 @@ | ||||
| #define freeaddrinfo		_freeaddrinfo | ||||
| #define freeifaddrs		_freeifaddrs | ||||
| #define fstatvfs		_fstatvfs | ||||
| #define fstatvfs1		_fstatvfs1 | ||||
| #define ftok			_ftok | ||||
| #define ftruncate		_ftruncate | ||||
| #define fts_children		_fts_children | ||||
| @ -600,6 +601,7 @@ | ||||
| #define srand48			_srand48 | ||||
| #define srandom			_srandom | ||||
| #define statvfs(a, b)		_statvfs(a, b) | ||||
| #define statvfs1		_statvfs1 | ||||
| #define strcasecmp		_strcasecmp | ||||
| #define strdup			_strdup | ||||
| #define stresep			_stresep | ||||
|  | ||||
| @ -5,14 +5,21 @@ | ||||
| #include <sys/statvfs.h> | ||||
| 
 | ||||
| #ifdef __weak_alias | ||||
| __weak_alias(fstatvfs1, _fstatvfs1) | ||||
| __weak_alias(fstatvfs, _fstatvfs) | ||||
| #endif | ||||
| 
 | ||||
| int fstatvfs(int fd, struct statvfs *buffer) | ||||
| int fstatvfs1(int fd, struct statvfs *buffer, int flags) | ||||
| { | ||||
|   message m; | ||||
| 
 | ||||
|   m.FSTATVFS_FD = fd; | ||||
|   m.FSTATVFS_BUF = (char *) buffer; | ||||
|   return(_syscall(VFS_PROC_NR, FSTATVFS, &m)); | ||||
|   m.VFS_FSTATVFS1_FD = fd; | ||||
|   m.VFS_FSTATVFS1_BUF = (char *) buffer; | ||||
|   m.VFS_FSTATVFS1_FLAGS = flags; | ||||
|   return(_syscall(VFS_PROC_NR, FSTATVFS1, &m)); | ||||
| } | ||||
| 
 | ||||
| int fstatvfs(int fd, struct statvfs *buffer) | ||||
| { | ||||
|   return fstatvfs1(fd, buffer, ST_WAIT); | ||||
| } | ||||
|  | ||||
| @ -6,15 +6,22 @@ | ||||
| #include <string.h> | ||||
| 
 | ||||
| #ifdef __weak_alias | ||||
| __weak_alias(statvfs1, _statvfs1) | ||||
| __weak_alias(statvfs, _statvfs) | ||||
| #endif | ||||
| 
 | ||||
| int statvfs(const char *name, struct statvfs *buffer) | ||||
| int statvfs1(const char *name, struct statvfs *buffer, int flags) | ||||
| { | ||||
|   message m; | ||||
| 
 | ||||
|   m.STATVFS_LEN = strlen(name) + 1; | ||||
|   m.STATVFS_NAME = (char *) __UNCONST(name); | ||||
|   m.STATVFS_BUF = (char *) buffer; | ||||
|   return(_syscall(VFS_PROC_NR, STATVFS, &m)); | ||||
|   m.VFS_STATVFS1_LEN = strlen(name) + 1; | ||||
|   m.VFS_STATVFS1_NAME = (char *) __UNCONST(name); | ||||
|   m.VFS_STATVFS1_BUF = (char *) buffer; | ||||
|   m.VFS_STATVFS1_FLAGS = flags; | ||||
|   return(_syscall(VFS_PROC_NR, STATVFS1, &m)); | ||||
| } | ||||
| 
 | ||||
| int statvfs(const char *name, struct statvfs *buffer) | ||||
| { | ||||
|   return statvfs1(name, buffer, ST_WAIT); | ||||
| } | ||||
|  | ||||
| @ -272,6 +272,7 @@ MLINKS+=chmod.2 fchmod.2 chmod.2 lchmod.2 | ||||
| MLINKS+=chown.2 fchown.2 chown.2 lchown.2 | ||||
| MLINKS+=chroot.2 fchroot.2 | ||||
| .else | ||||
| MAN+=	statvfs.2 | ||||
| MLINKS+=clock_settime.2 clock_gettime.2 | ||||
| MLINKS+=clock_settime.2 clock_getres.2 | ||||
| .endif # !defined(__MINIX)
 | ||||
| @ -339,6 +340,9 @@ MLINKS+=wait.2 wait3.2 wait.2 wait4.2 wait.2 waitpid.2 | ||||
| MLINKS+=write.2 writev.2 write.2 pwrite.2 write.2 pwritev.2 | ||||
| .else | ||||
| MLINKS+=pipe.2 pipe2.2 | ||||
| MLINKS+=statvfs.2 fstatvfs.2 | ||||
| MLINKS+=statvfs.2 statvfs1.2 | ||||
| MLINKS+=statvfs.2 fstatvfs1.2 | ||||
| .endif # !defined(__MINIX)
 | ||||
| .if !defined(__MINIX) | ||||
| MLINKS+=accept.2 paccept.2 | ||||
|  | ||||
| @ -8,7 +8,7 @@ MAN=	accept.2 access.2 alarm.2 bind.2 brk.2 chdir.2 chmod.2 chown.2 \ | ||||
| 	rmdir.2 select.2 send.2 sendmsg.2 sendto.2 setsid.2 \
 | ||||
| 	setsockopt.2 setuid.2 shutdown.2 sigaction.2 sigpending.2 \
 | ||||
| 	sigprocmask.2 sigsuspend.2 socket.2 socketpair.2 \
 | ||||
| 	statvfs.2 svrctl.2 symlink.2 sync.2 time.2 times.2 truncate.2 \
 | ||||
| 	svrctl.2 symlink.2 sync.2 time.2 times.2 truncate.2 \
 | ||||
| 	umask.2 uname.2 unlink.2 utime.2 wait.2 write.2 | ||||
| 
 | ||||
| MLINKS += select.2 FD_CLR.2 | ||||
| @ -16,7 +16,6 @@ MLINKS += select.2 FD_ISSET.2 | ||||
| MLINKS += select.2 FD_SET.2 | ||||
| MLINKS += setuid.2 seteuid.2 | ||||
| MLINKS += setuid.2 setgid.2 | ||||
| MLINKS += statvfs.2 fstatvfs.2 | ||||
| 
 | ||||
| .include <bsd.man.mk> | ||||
| .include <bsd.subdir.mk> | ||||
|  | ||||
| @ -1,133 +0,0 @@ | ||||
| .\"	$NetBSD: statvfs.2,v 1.4 2005/11/04 06:09:20 gendalia Exp $ | ||||
| .\" | ||||
| .\" Copyright (c) 1989, 1991, 1993 | ||||
| .\"	The Regents of the University of California.  All rights reserved. | ||||
| .\" | ||||
| .\" Redistribution and use in source and binary forms, with or without | ||||
| .\" modification, are permitted provided that the following conditions | ||||
| .\" are met: | ||||
| .\" 1. Redistributions of source code must retain the above copyright | ||||
| .\"    notice, this list of conditions and the following disclaimer. | ||||
| .\" 2. Redistributions in binary form must reproduce the above copyright | ||||
| .\"    notice, this list of conditions and the following disclaimer in the | ||||
| .\"    documentation and/or other materials provided with the distribution. | ||||
| .\" 3. Neither the name of the University nor the names of its contributors | ||||
| .\"    may be used to endorse or promote products derived from this software | ||||
| .\"    without specific prior written permission. | ||||
| .\" | ||||
| .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND | ||||
| .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| .\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | ||||
| .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||||
| .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||||
| .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||||
| .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||
| .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | ||||
| .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||||
| .\" SUCH DAMAGE. | ||||
| .\" | ||||
| .\"	@(#)statfs.2	8.5 (Berkeley) 5/24/95 | ||||
| .\" | ||||
| .Dd April 14, 2004 | ||||
| .Dt STATVFS 2 | ||||
| .Os | ||||
| .Sh NAME | ||||
| .Nm statvfs , | ||||
| .Nm fstatvfs , | ||||
| .Nd get file system statistics | ||||
| .Sh LIBRARY | ||||
| .Lb libc | ||||
| .Sh SYNOPSIS | ||||
| .In sys/statvfs.h | ||||
| .Ft int | ||||
| .Fn statvfs "const char *path" "struct statvfs *buf" | ||||
| .Ft int | ||||
| .Fn fstatvfs "int fd" "struct statvfs *buf" | ||||
| .Sh DESCRIPTION | ||||
| .Fn statvfs | ||||
| returns information about a mounted file system. | ||||
| .Fa path | ||||
| is the path name of any file within the mounted file system. | ||||
| .Fa buf | ||||
| is a pointer to a | ||||
| .Nm statvfs | ||||
| structure defined in | ||||
| .Xr statvfs 5 . | ||||
| .Pp | ||||
| .Fn fstatvfs | ||||
| returns the same information about an open file referenced by descriptor | ||||
| .Fa fd . | ||||
| .Pp | ||||
| .Sh RETURN VALUES | ||||
| Upon successful completion, a value of 0 is returned. | ||||
| Otherwise, \-1 is returned and the global variable | ||||
| .Va errno | ||||
| is set to indicate the error. | ||||
| .Sh ERRORS | ||||
| .Fn statvfs | ||||
| fails if one or more of the following are true: | ||||
| .Bl -tag -width Er | ||||
| .It Bq Er ENOTDIR | ||||
| A component of the path prefix of | ||||
| .Fa path | ||||
| is not a directory. | ||||
| .It Bq Er ENAMETOOLONG | ||||
| The length of a component of | ||||
| .Fa path | ||||
| exceeds | ||||
| .Dv NAME_MAX | ||||
| characters, or the length of | ||||
| .Fa path | ||||
| exceeds | ||||
| .Dv PATH_MAX | ||||
| characters. | ||||
| .It Bq Er ENOENT | ||||
| The file referred to by | ||||
| .Fa path | ||||
| does not exist. | ||||
| .It Bq Er EACCES | ||||
| Search permission is denied for a component of the path prefix of | ||||
| .Fa path . | ||||
| .It Bq Er ELOOP | ||||
| Too many symbolic links were encountered in translating | ||||
| .Fa path . | ||||
| .It Bq Er EFAULT | ||||
| .Fa buf | ||||
| or | ||||
| .Fa path | ||||
| points to an invalid address. | ||||
| .It Bq Er EIO | ||||
| An | ||||
| .Tn I/O | ||||
| error occurred while reading from or writing to the file system. | ||||
| .El | ||||
| .Pp | ||||
| .Fn fstatvfs | ||||
| fails if one or more of the following are true: | ||||
| .Bl -tag -width Er | ||||
| .It Bq Er EBADF | ||||
| .Fa fd | ||||
| is not a valid open file descriptor. | ||||
| .It Bq Er EFAULT | ||||
| .Fa buf | ||||
| points to an invalid address. | ||||
| .It Bq Er EIO | ||||
| An | ||||
| .Tn I/O | ||||
| error occurred while reading from or writing to the file system. | ||||
| .El | ||||
| .Sh SEE ALSO | ||||
| .Xr statvfs 5 | ||||
| .Sh HISTORY | ||||
| The | ||||
| .Fn statvfs , | ||||
| and | ||||
| .Fn fstatvfs , | ||||
| functions first appeared in | ||||
| .Nx 3.0 | ||||
| to replace | ||||
| the | ||||
| .Fn statfs | ||||
| family of functions which first appeared in | ||||
| .Bx 4.4 . | ||||
| @ -7,8 +7,8 @@ | ||||
|  *   do_lstat:  perform the LSTAT system call | ||||
|  *   do_stat:	perform the STAT system call | ||||
|  *   do_fstat:	perform the FSTAT system call | ||||
|  *   do_statvfs: perform the STATVFS system call | ||||
|  *   do_fstatvfs: perform the FSTATVFS system call | ||||
|  *   do_statvfs:    perform the STATVFS1 system call | ||||
|  *   do_fstatvfs:   perform the FSTATVFS1 system call | ||||
|  *   do_getvfsstat: perform the GETVFSSTAT system call | ||||
|  */ | ||||
| 
 | ||||
| @ -310,8 +310,8 @@ static int fill_statvfs(struct vmnt *vmp, endpoint_t endpt, vir_bytes buf_addr, | ||||
|  *===========================================================================*/ | ||||
| int do_statvfs(message *UNUSED(m_out)) | ||||
| { | ||||
| /* Perform the statvfs(name, buf) system call. */ | ||||
|   int r; | ||||
| /* Perform the statvfs1(name, buf, flags) system call. */ | ||||
|   int r, flags; | ||||
|   struct vnode *vp; | ||||
|   struct vmnt *vmp; | ||||
|   char fullpath[PATH_MAX]; | ||||
| @ -319,9 +319,10 @@ int do_statvfs(message *UNUSED(m_out)) | ||||
|   vir_bytes vname1, statbuf; | ||||
|   size_t vname1_length; | ||||
| 
 | ||||
|   vname1 = (vir_bytes) job_m_in.name1; | ||||
|   vname1_length = (size_t) job_m_in.name1_length; | ||||
|   statbuf = (vir_bytes) job_m_in.name2; | ||||
|   vname1 = (vir_bytes) job_m_in.VFS_STATVFS1_NAME; | ||||
|   vname1_length = (size_t) job_m_in.VFS_STATVFS1_LEN; | ||||
|   statbuf = (vir_bytes) job_m_in.VFS_STATVFS1_BUF; | ||||
|   flags = job_m_in.VFS_STATVFS1_FLAGS; | ||||
| 
 | ||||
|   lookup_init(&resolve, fullpath, PATH_NOFLAGS, &vmp, &vp); | ||||
|   resolve.l_vmnt_lock = VMNT_READ; | ||||
| @ -329,7 +330,7 @@ int do_statvfs(message *UNUSED(m_out)) | ||||
| 
 | ||||
|   if (fetch_name(vname1, vname1_length, fullpath) != OK) return(err_code); | ||||
|   if ((vp = eat_path(&resolve, fp)) == NULL) return(err_code); | ||||
|   r = fill_statvfs(vp->v_vmnt, who_e, statbuf, ST_WAIT); | ||||
|   r = fill_statvfs(vp->v_vmnt, who_e, statbuf, flags); | ||||
| 
 | ||||
|   unlock_vnode(vp); | ||||
|   unlock_vmnt(vmp); | ||||
| @ -343,17 +344,18 @@ int do_statvfs(message *UNUSED(m_out)) | ||||
|  *===========================================================================*/ | ||||
| int do_fstatvfs(message *UNUSED(m_out)) | ||||
| { | ||||
| /* Perform the fstatvfs(fd, buf) system call. */ | ||||
| /* Perform the fstatvfs1(fd, buf, flags) system call. */ | ||||
|   register struct filp *rfilp; | ||||
|   int r, rfd; | ||||
|   int r, rfd, flags; | ||||
|   vir_bytes statbuf; | ||||
| 
 | ||||
|   rfd = job_m_in.fd; | ||||
|   statbuf = (vir_bytes) job_m_in.name2; | ||||
|   rfd = job_m_in.VFS_FSTATVFS1_FD; | ||||
|   statbuf = (vir_bytes) job_m_in.VFS_FSTATVFS1_BUF; | ||||
|   flags = job_m_in.VFS_FSTATVFS1_FLAGS; | ||||
| 
 | ||||
|   /* Is the file descriptor valid? */ | ||||
|   if ((rfilp = get_filp(rfd, VNODE_READ)) == NULL) return(err_code); | ||||
|   r = fill_statvfs(rfilp->filp_vno->v_vmnt, who_e, statbuf, ST_WAIT); | ||||
|   r = fill_statvfs(rfilp->filp_vno->v_vmnt, who_e, statbuf, flags); | ||||
| 
 | ||||
|   unlock_filp(rfilp); | ||||
| 
 | ||||
|  | ||||
| @ -118,6 +118,9 @@ __BEGIN_DECLS | ||||
| int	statvfs(const char *__restrict, struct statvfs *__restrict); | ||||
| int	fstatvfs(int, struct statvfs *); | ||||
| int	getvfsstat(struct statvfs *, size_t, int); | ||||
| 
 | ||||
| int	statvfs1(const char *__restrict, struct statvfs *__restrict, int); | ||||
| int	fstatvfs1(int, struct statvfs *, int); | ||||
| __END_DECLS | ||||
| 
 | ||||
| #endif /* !_SYS_STATVFS_H_ */ | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 David van Moolenbroek
						David van Moolenbroek