fstatfs_zos.go (4190B)
1 // Copyright 2020 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 //go:build zos && s390x 6 // +build zos,s390x 7 8 package unix 9 10 import ( 11 "unsafe" 12 ) 13 14 // This file simulates fstatfs on z/OS using fstatvfs and w_getmntent. 15 16 func Fstatfs(fd int, stat *Statfs_t) (err error) { 17 var stat_v Statvfs_t 18 err = Fstatvfs(fd, &stat_v) 19 if err == nil { 20 // populate stat 21 stat.Type = 0 22 stat.Bsize = stat_v.Bsize 23 stat.Blocks = stat_v.Blocks 24 stat.Bfree = stat_v.Bfree 25 stat.Bavail = stat_v.Bavail 26 stat.Files = stat_v.Files 27 stat.Ffree = stat_v.Ffree 28 stat.Fsid = stat_v.Fsid 29 stat.Namelen = stat_v.Namemax 30 stat.Frsize = stat_v.Frsize 31 stat.Flags = stat_v.Flag 32 for passn := 0; passn < 5; passn++ { 33 switch passn { 34 case 0: 35 err = tryGetmntent64(stat) 36 break 37 case 1: 38 err = tryGetmntent128(stat) 39 break 40 case 2: 41 err = tryGetmntent256(stat) 42 break 43 case 3: 44 err = tryGetmntent512(stat) 45 break 46 case 4: 47 err = tryGetmntent1024(stat) 48 break 49 default: 50 break 51 } 52 //proceed to return if: err is nil (found), err is nonnil but not ERANGE (another error occurred) 53 if err == nil || err != nil && err != ERANGE { 54 break 55 } 56 } 57 } 58 return err 59 } 60 61 func tryGetmntent64(stat *Statfs_t) (err error) { 62 var mnt_ent_buffer struct { 63 header W_Mnth 64 filesys_info [64]W_Mntent 65 } 66 var buffer_size int = int(unsafe.Sizeof(mnt_ent_buffer)) 67 fs_count, err := W_Getmntent((*byte)(unsafe.Pointer(&mnt_ent_buffer)), buffer_size) 68 if err != nil { 69 return err 70 } 71 err = ERANGE //return ERANGE if no match is found in this batch 72 for i := 0; i < fs_count; i++ { 73 if stat.Fsid == uint64(mnt_ent_buffer.filesys_info[i].Dev) { 74 stat.Type = uint32(mnt_ent_buffer.filesys_info[i].Fstname[0]) 75 err = nil 76 break 77 } 78 } 79 return err 80 } 81 82 func tryGetmntent128(stat *Statfs_t) (err error) { 83 var mnt_ent_buffer struct { 84 header W_Mnth 85 filesys_info [128]W_Mntent 86 } 87 var buffer_size int = int(unsafe.Sizeof(mnt_ent_buffer)) 88 fs_count, err := W_Getmntent((*byte)(unsafe.Pointer(&mnt_ent_buffer)), buffer_size) 89 if err != nil { 90 return err 91 } 92 err = ERANGE //return ERANGE if no match is found in this batch 93 for i := 0; i < fs_count; i++ { 94 if stat.Fsid == uint64(mnt_ent_buffer.filesys_info[i].Dev) { 95 stat.Type = uint32(mnt_ent_buffer.filesys_info[i].Fstname[0]) 96 err = nil 97 break 98 } 99 } 100 return err 101 } 102 103 func tryGetmntent256(stat *Statfs_t) (err error) { 104 var mnt_ent_buffer struct { 105 header W_Mnth 106 filesys_info [256]W_Mntent 107 } 108 var buffer_size int = int(unsafe.Sizeof(mnt_ent_buffer)) 109 fs_count, err := W_Getmntent((*byte)(unsafe.Pointer(&mnt_ent_buffer)), buffer_size) 110 if err != nil { 111 return err 112 } 113 err = ERANGE //return ERANGE if no match is found in this batch 114 for i := 0; i < fs_count; i++ { 115 if stat.Fsid == uint64(mnt_ent_buffer.filesys_info[i].Dev) { 116 stat.Type = uint32(mnt_ent_buffer.filesys_info[i].Fstname[0]) 117 err = nil 118 break 119 } 120 } 121 return err 122 } 123 124 func tryGetmntent512(stat *Statfs_t) (err error) { 125 var mnt_ent_buffer struct { 126 header W_Mnth 127 filesys_info [512]W_Mntent 128 } 129 var buffer_size int = int(unsafe.Sizeof(mnt_ent_buffer)) 130 fs_count, err := W_Getmntent((*byte)(unsafe.Pointer(&mnt_ent_buffer)), buffer_size) 131 if err != nil { 132 return err 133 } 134 err = ERANGE //return ERANGE if no match is found in this batch 135 for i := 0; i < fs_count; i++ { 136 if stat.Fsid == uint64(mnt_ent_buffer.filesys_info[i].Dev) { 137 stat.Type = uint32(mnt_ent_buffer.filesys_info[i].Fstname[0]) 138 err = nil 139 break 140 } 141 } 142 return err 143 } 144 145 func tryGetmntent1024(stat *Statfs_t) (err error) { 146 var mnt_ent_buffer struct { 147 header W_Mnth 148 filesys_info [1024]W_Mntent 149 } 150 var buffer_size int = int(unsafe.Sizeof(mnt_ent_buffer)) 151 fs_count, err := W_Getmntent((*byte)(unsafe.Pointer(&mnt_ent_buffer)), buffer_size) 152 if err != nil { 153 return err 154 } 155 err = ERANGE //return ERANGE if no match is found in this batch 156 for i := 0; i < fs_count; i++ { 157 if stat.Fsid == uint64(mnt_ent_buffer.filesys_info[i].Dev) { 158 stat.Type = uint32(mnt_ent_buffer.filesys_info[i].Fstname[0]) 159 err = nil 160 break 161 } 162 } 163 return err 164 }