Annotation of sys/compat/ibcs2/ibcs2_stat.c, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: ibcs2_stat.c,v 1.13 2004/07/09 23:52:02 millert Exp $ */
2: /* $NetBSD: ibcs2_stat.c,v 1.5 1996/05/03 17:05:32 christos Exp $ */
3:
4: /*
5: * Copyright (c) 1995 Scott Bartram
6: * All rights reserved.
7: *
8: * Redistribution and use in source and binary forms, with or without
9: * modification, are permitted provided that the following conditions
10: * are met:
11: * 1. Redistributions of source code must retain the above copyright
12: * notice, this list of conditions and the following disclaimer.
13: * 2. Redistributions in binary form must reproduce the above copyright
14: * notice, this list of conditions and the following disclaimer in the
15: * documentation and/or other materials provided with the distribution.
16: * 3. The name of the author may not be used to endorse or promote products
17: * derived from this software without specific prior written permission
18: *
19: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
20: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22: * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
23: * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
24: * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28: * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29: */
30:
31: #include <sys/param.h>
32: #include <sys/systm.h>
33: #include <sys/namei.h>
34: #include <sys/proc.h>
35: #include <sys/file.h>
36: #include <sys/stat.h>
37: #include <sys/filedesc.h>
38: #include <sys/ioctl.h>
39: #include <sys/kernel.h>
40: #include <sys/mount.h>
41: #include <sys/malloc.h>
42: #include <sys/vnode.h>
43: #include <sys/syscallargs.h>
44:
45: #include <uvm/uvm_extern.h>
46:
47: #include <compat/ibcs2/ibcs2_types.h>
48: #include <compat/ibcs2/ibcs2_fcntl.h>
49: #include <compat/ibcs2/ibcs2_signal.h>
50: #include <compat/ibcs2/ibcs2_stat.h>
51: #include <compat/ibcs2/ibcs2_statfs.h>
52: #include <compat/ibcs2/ibcs2_syscallargs.h>
53: #include <compat/ibcs2/ibcs2_ustat.h>
54: #include <compat/ibcs2/ibcs2_util.h>
55: #include <compat/ibcs2/ibcs2_utsname.h>
56:
57: static void bsd_stat2ibcs_stat(struct stat43 *, struct ibcs2_stat *);
58: static int cvt_statfs(struct statfs *, caddr_t, int);
59:
60: static void
61: bsd_stat2ibcs_stat(st, st4)
62: struct stat43 *st;
63: struct ibcs2_stat *st4;
64: {
65: bzero(st4, sizeof(*st4));
66: st4->st_dev = (ibcs2_dev_t)st->st_dev;
67: st4->st_ino = (ibcs2_ino_t)st->st_ino;
68: st4->st_mode = (ibcs2_mode_t)st->st_mode;
69: st4->st_nlink = (ibcs2_nlink_t)st->st_nlink;
70: st4->st_uid = (ibcs2_uid_t)st->st_uid;
71: st4->st_gid = (ibcs2_gid_t)st->st_gid;
72: st4->st_rdev = (ibcs2_dev_t)st->st_rdev;
73: st4->st_size = (ibcs2_off_t)st->st_size;
74: st4->st_atim = (ibcs2_time_t)st->st_atime;
75: st4->st_mtim = (ibcs2_time_t)st->st_mtime;
76: st4->st_ctim = (ibcs2_time_t)st->st_ctime;
77: }
78:
79: static int
80: cvt_statfs(sp, buf, len)
81: struct statfs *sp;
82: caddr_t buf;
83: int len;
84: {
85: struct ibcs2_statfs ssfs;
86:
87: if (len < 0)
88: return (EINVAL);
89: if (len > sizeof(ssfs))
90: len = sizeof(ssfs);
91:
92: bzero(&ssfs, sizeof ssfs);
93: ssfs.f_fstyp = 0;
94: ssfs.f_bsize = sp->f_bsize;
95: ssfs.f_frsize = 0;
96: ssfs.f_blocks = sp->f_blocks;
97: ssfs.f_bfree = sp->f_bfree;
98: ssfs.f_files = sp->f_files;
99: ssfs.f_ffree = sp->f_ffree;
100: ssfs.f_fname[0] = 0;
101: ssfs.f_fpack[0] = 0;
102: return copyout((caddr_t)&ssfs, buf, len);
103: }
104:
105: int
106: ibcs2_sys_statfs(p, v, retval)
107: struct proc *p;
108: void *v;
109: register_t *retval;
110: {
111: struct ibcs2_sys_statfs_args /* {
112: syscallarg(char *) path;
113: syscallarg(struct ibcs2_statfs *) buf;
114: syscallarg(int) len;
115: syscallarg(int) fstype;
116: } */ *uap = v;
117: register struct mount *mp;
118: register struct statfs *sp;
119: int error;
120: struct nameidata nd;
121: caddr_t sg = stackgap_init(p->p_emul);
122:
123: IBCS2_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
124: NDINIT(&nd, LOOKUP, FOLLOW, UIO_USERSPACE, SCARG(uap, path), p);
125: if ((error = namei(&nd)) != 0)
126: return (error);
127: mp = nd.ni_vp->v_mount;
128: sp = &mp->mnt_stat;
129: vrele(nd.ni_vp);
130: if ((error = VFS_STATFS(mp, sp, p)) != 0)
131: return (error);
132: sp->f_flags = mp->mnt_flag & MNT_VISFLAGMASK;
133: return cvt_statfs(sp, (caddr_t)SCARG(uap, buf), SCARG(uap, len));
134: }
135:
136: int
137: ibcs2_sys_fstatfs(p, v, retval)
138: struct proc *p;
139: void *v;
140: register_t *retval;
141: {
142: struct ibcs2_sys_fstatfs_args /* {
143: syscallarg(int) fd;
144: syscallarg(struct ibcs2_statfs *) buf;
145: syscallarg(int) len;
146: syscallarg(int) fstype;
147: } */ *uap = v;
148: struct file *fp;
149: struct mount *mp;
150: register struct statfs *sp;
151: int error;
152:
153: if ((error = getvnode(p->p_fd, SCARG(uap, fd), &fp)) != 0)
154: return (error);
155: mp = ((struct vnode *)fp->f_data)->v_mount;
156: sp = &mp->mnt_stat;
157: error = VFS_STATFS(mp, sp, p);
158: FRELE(fp);
159: if (error)
160: return (error);
161: sp->f_flags = mp->mnt_flag & MNT_VISFLAGMASK;
162: return cvt_statfs(sp, (caddr_t)SCARG(uap, buf), SCARG(uap, len));
163: }
164:
165: int
166: ibcs2_sys_stat(p, v, retval)
167: struct proc *p;
168: void *v;
169: register_t *retval;
170: {
171: struct ibcs2_sys_stat_args /* {
172: syscallarg(char *) path;
173: syscallarg(struct ibcs2_stat *) st;
174: } */ *uap = v;
175: struct stat43 st;
176: struct ibcs2_stat ibcs2_st;
177: struct compat_43_sys_stat_args cup;
178: int error;
179: caddr_t sg = stackgap_init(p->p_emul);
180:
181: SCARG(&cup, ub) = stackgap_alloc(&sg, sizeof(st));
182: IBCS2_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
183: SCARG(&cup, path) = SCARG(uap, path);
184:
185: if ((error = compat_43_sys_stat(p, &cup, retval)) != 0)
186: return error;
187: if ((error = copyin(SCARG(&cup, ub), &st, sizeof(st))) != 0)
188: return error;
189: bsd_stat2ibcs_stat(&st, &ibcs2_st);
190: return copyout((caddr_t)&ibcs2_st, (caddr_t)SCARG(uap, st),
191: ibcs2_stat_len);
192: }
193:
194: int
195: ibcs2_sys_lstat(p, v, retval)
196: struct proc *p;
197: void *v;
198: register_t *retval;
199: {
200: struct ibcs2_sys_lstat_args /* {
201: syscallarg(char *) path;
202: syscallarg(struct ibcs2_stat *) st;
203: } */ *uap = v;
204: struct stat43 st;
205: struct ibcs2_stat ibcs2_st;
206: struct compat_43_sys_lstat_args cup;
207: int error;
208: caddr_t sg = stackgap_init(p->p_emul);
209:
210: SCARG(&cup, ub) = stackgap_alloc(&sg, sizeof(st));
211: IBCS2_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
212: SCARG(&cup, path) = SCARG(uap, path);
213:
214: if ((error = compat_43_sys_lstat(p, &cup, retval)) != 0)
215: return error;
216: if ((error = copyin(SCARG(&cup, ub), &st, sizeof(st))) != 0)
217: return error;
218: bsd_stat2ibcs_stat(&st, &ibcs2_st);
219: return copyout((caddr_t)&ibcs2_st, (caddr_t)SCARG(uap, st),
220: ibcs2_stat_len);
221: }
222:
223: int
224: ibcs2_sys_fstat(p, v, retval)
225: struct proc *p;
226: void *v;
227: register_t *retval;
228: {
229: struct ibcs2_sys_fstat_args /* {
230: syscallarg(int) fd;
231: syscallarg(struct ibcs2_stat *) st;
232: } */ *uap = v;
233: struct stat43 st;
234: struct ibcs2_stat ibcs2_st;
235: struct compat_43_sys_fstat_args cup;
236: int error;
237: caddr_t sg = stackgap_init(p->p_emul);
238:
239: SCARG(&cup, fd) = SCARG(uap, fd);
240: SCARG(&cup, sb) = stackgap_alloc(&sg, sizeof(st));
241: if ((error = compat_43_sys_fstat(p, &cup, retval)) != 0)
242: return error;
243: if ((error = copyin(SCARG(&cup, sb), &st, sizeof(st))) != 0)
244: return error;
245: bsd_stat2ibcs_stat(&st, &ibcs2_st);
246: return copyout((caddr_t)&ibcs2_st, (caddr_t)SCARG(uap, st),
247: ibcs2_stat_len);
248: }
249:
250: int
251: ibcs2_sys_utssys(p, v, retval)
252: struct proc *p;
253: void *v;
254: register_t *retval;
255: {
256: struct ibcs2_sys_utssys_args /* {
257: syscallarg(int) a1;
258: syscallarg(int) a2;
259: syscallarg(int) flag;
260: } */ *uap = v;
261:
262: switch (SCARG(uap, flag)) {
263: case 0: /* uname(2) */
264: {
265: struct ibcs2_utsname sut;
266: extern char machine[];
267:
268: bzero(&sut, ibcs2_utsname_len);
269: bcopy(ostype, sut.sysname, sizeof(sut.sysname) - 1);
270: bcopy(hostname, sut.nodename, sizeof(sut.nodename));
271: sut.nodename[sizeof(sut.nodename)-1] = '\0';
272: bcopy(osrelease, sut.release, sizeof(sut.release) - 1);
273: strlcpy(sut.version, "1", sizeof(sut.version));
274: bcopy(machine, sut.machine, sizeof(sut.machine) - 1);
275:
276: return copyout((caddr_t)&sut, (caddr_t)SCARG(uap, a1),
277: ibcs2_utsname_len);
278: }
279:
280: case 2: /* ustat(2) */
281: {
282: return ENOSYS; /* XXX - TODO */
283: }
284:
285: default:
286: return ENOSYS;
287: }
288: }
CVSweb