9p: darwin: Handle struct stat(fs) differences
Signed-off-by: Keno Fischer <keno@juliacomputing.com>
Signed-off-by: Michael Roitzsch <reactorcontrol@icloud.com>
[Will Cohen: - Note lack of f_namelen and f_frsize on Darwin
             - Ensure that tv_sec and tv_nsec are both
               initialized for Darwin and non-Darwin]
Signed-off-by: Will Cohen <wwcohen@gmail.com>
Message-Id: <20220227223522.91937-4-wwcohen@gmail.com>
Signed-off-by: Christian Schoenebeck <qemu_oss@crudebyte.com>
Reviewed-by: Christian Schoenebeck <qemu_oss@crudebyte.com>
			
			
This commit is contained in:
		
							parent
							
								
									6450084a66
								
							
						
					
					
						commit
						f41db099c7
					
				@ -123,10 +123,16 @@ static void prstatfs_to_statfs(struct statfs *stfs, ProxyStatFS *prstfs)
 | 
			
		||||
    stfs->f_bavail = prstfs->f_bavail;
 | 
			
		||||
    stfs->f_files = prstfs->f_files;
 | 
			
		||||
    stfs->f_ffree = prstfs->f_ffree;
 | 
			
		||||
#ifdef CONFIG_DARWIN
 | 
			
		||||
    /* f_namelen and f_frsize do not exist on Darwin */
 | 
			
		||||
    stfs->f_fsid.val[0] = prstfs->f_fsid[0] & 0xFFFFFFFFU;
 | 
			
		||||
    stfs->f_fsid.val[1] = prstfs->f_fsid[1] >> 32 & 0xFFFFFFFFU;
 | 
			
		||||
#else
 | 
			
		||||
    stfs->f_fsid.__val[0] = prstfs->f_fsid[0] & 0xFFFFFFFFU;
 | 
			
		||||
    stfs->f_fsid.__val[1] = prstfs->f_fsid[1] >> 32 & 0xFFFFFFFFU;
 | 
			
		||||
    stfs->f_namelen = prstfs->f_namelen;
 | 
			
		||||
    stfs->f_frsize = prstfs->f_frsize;
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Converts proxy_stat structure to VFS stat structure */
 | 
			
		||||
@ -143,12 +149,24 @@ static void prstat_to_stat(struct stat *stbuf, ProxyStat *prstat)
 | 
			
		||||
   stbuf->st_size = prstat->st_size;
 | 
			
		||||
   stbuf->st_blksize = prstat->st_blksize;
 | 
			
		||||
   stbuf->st_blocks = prstat->st_blocks;
 | 
			
		||||
   stbuf->st_atim.tv_sec = prstat->st_atim_sec;
 | 
			
		||||
   stbuf->st_atim.tv_nsec = prstat->st_atim_nsec;
 | 
			
		||||
   stbuf->st_atime = prstat->st_atim_sec;
 | 
			
		||||
   stbuf->st_mtime = prstat->st_mtim_sec;
 | 
			
		||||
   stbuf->st_mtim.tv_nsec = prstat->st_mtim_nsec;
 | 
			
		||||
   stbuf->st_ctime = prstat->st_ctim_sec;
 | 
			
		||||
#ifdef CONFIG_DARWIN
 | 
			
		||||
   stbuf->st_atimespec.tv_sec = prstat->st_atim_sec;
 | 
			
		||||
   stbuf->st_mtimespec.tv_sec = prstat->st_mtim_sec;
 | 
			
		||||
   stbuf->st_ctimespec.tv_sec = prstat->st_ctim_sec;
 | 
			
		||||
   stbuf->st_atimespec.tv_nsec = prstat->st_atim_nsec;
 | 
			
		||||
   stbuf->st_mtimespec.tv_nsec = prstat->st_mtim_nsec;
 | 
			
		||||
   stbuf->st_ctimespec.tv_nsec = prstat->st_ctim_nsec;
 | 
			
		||||
#else
 | 
			
		||||
   stbuf->st_atim.tv_sec = prstat->st_atim_sec;
 | 
			
		||||
   stbuf->st_mtim.tv_sec = prstat->st_mtim_sec;
 | 
			
		||||
   stbuf->st_ctim.tv_sec = prstat->st_ctim_sec;
 | 
			
		||||
   stbuf->st_atim.tv_nsec = prstat->st_atim_nsec;
 | 
			
		||||
   stbuf->st_mtim.tv_nsec = prstat->st_mtim_nsec;
 | 
			
		||||
   stbuf->st_ctim.tv_nsec = prstat->st_ctim_nsec;
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
@ -439,7 +439,9 @@ static int synth_statfs(FsContext *s, V9fsPath *fs_path,
 | 
			
		||||
    stbuf->f_bsize = 512;
 | 
			
		||||
    stbuf->f_blocks = 0;
 | 
			
		||||
    stbuf->f_files = synth_node_count;
 | 
			
		||||
#ifndef CONFIG_DARWIN
 | 
			
		||||
    stbuf->f_namelen = NAME_MAX;
 | 
			
		||||
#endif
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										16
									
								
								hw/9pfs/9p.c
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								hw/9pfs/9p.c
									
									
									
									
									
								
							@ -1313,11 +1313,17 @@ static int stat_to_v9stat_dotl(V9fsPDU *pdu, const struct stat *stbuf,
 | 
			
		||||
    v9lstat->st_blksize = stat_to_iounit(pdu, stbuf);
 | 
			
		||||
    v9lstat->st_blocks = stbuf->st_blocks;
 | 
			
		||||
    v9lstat->st_atime_sec = stbuf->st_atime;
 | 
			
		||||
    v9lstat->st_atime_nsec = stbuf->st_atim.tv_nsec;
 | 
			
		||||
    v9lstat->st_mtime_sec = stbuf->st_mtime;
 | 
			
		||||
    v9lstat->st_mtime_nsec = stbuf->st_mtim.tv_nsec;
 | 
			
		||||
    v9lstat->st_ctime_sec = stbuf->st_ctime;
 | 
			
		||||
#ifdef CONFIG_DARWIN
 | 
			
		||||
    v9lstat->st_atime_nsec = stbuf->st_atimespec.tv_nsec;
 | 
			
		||||
    v9lstat->st_mtime_nsec = stbuf->st_mtimespec.tv_nsec;
 | 
			
		||||
    v9lstat->st_ctime_nsec = stbuf->st_ctimespec.tv_nsec;
 | 
			
		||||
#else
 | 
			
		||||
    v9lstat->st_atime_nsec = stbuf->st_atim.tv_nsec;
 | 
			
		||||
    v9lstat->st_mtime_nsec = stbuf->st_mtim.tv_nsec;
 | 
			
		||||
    v9lstat->st_ctime_nsec = stbuf->st_ctim.tv_nsec;
 | 
			
		||||
#endif
 | 
			
		||||
    /* Currently we only support BASIC fields in stat */
 | 
			
		||||
    v9lstat->st_result_mask = P9_STATS_BASIC;
 | 
			
		||||
 | 
			
		||||
@ -3519,9 +3525,15 @@ static int v9fs_fill_statfs(V9fsState *s, V9fsPDU *pdu, struct statfs *stbuf)
 | 
			
		||||
    f_bavail = stbuf->f_bavail / bsize_factor;
 | 
			
		||||
    f_files  = stbuf->f_files;
 | 
			
		||||
    f_ffree  = stbuf->f_ffree;
 | 
			
		||||
#ifdef CONFIG_DARWIN
 | 
			
		||||
    fsid_val = (unsigned int)stbuf->f_fsid.val[0] |
 | 
			
		||||
               (unsigned long long)stbuf->f_fsid.val[1] << 32;
 | 
			
		||||
    f_namelen = NAME_MAX;
 | 
			
		||||
#else
 | 
			
		||||
    fsid_val = (unsigned int) stbuf->f_fsid.__val[0] |
 | 
			
		||||
               (unsigned long long)stbuf->f_fsid.__val[1] << 32;
 | 
			
		||||
    f_namelen = stbuf->f_namelen;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    return pdu_marshal(pdu, offset, "ddqqqqqqd",
 | 
			
		||||
                       f_type, f_bsize, f_blocks, f_bfree,
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user