comparison vendor/golang.org/x/sys/unix/fstatfs_zos.go @ 66:787b5ee0289d draft

Use vendored modules Signed-off-by: Izuru Yakumo <yakumo.izuru@chaotic.ninja>
author yakumo.izuru
date Sun, 23 Jul 2023 13:18:53 +0000
parents
children
comparison
equal deleted inserted replaced
65:6d985efa0f7a 66:787b5ee0289d
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 }