Deleted Added
full compact
linux_file.c (102814) linux_file.c (102872)
1/*-
2 * Copyright (c) 1994-1995 S�ren Schmidt
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 11 unchanged lines hidden (view full) ---

20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 *
1/*-
2 * Copyright (c) 1994-1995 S�ren Schmidt
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 11 unchanged lines hidden (view full) ---

20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 *
28 * $FreeBSD: head/sys/compat/linux/linux_file.c 102814 2002-09-01 22:30:27Z iedowse $
28 * $FreeBSD: head/sys/compat/linux/linux_file.c 102872 2002-09-02 22:46:05Z iedowse $
29 */
30
31#include "opt_compat.h"
32#include "opt_mac.h"
33
34#include <sys/param.h>
35#include <sys/systm.h>
36#include <sys/conf.h>

--- 889 unchanged lines hidden (view full) ---

926
927#if defined(__alpha__)
928#define linux_fcntl64_args linux_fcntl_args
929#endif
930
931static int
932fcntl_common(struct thread *td, struct linux_fcntl64_args *args)
933{
29 */
30
31#include "opt_compat.h"
32#include "opt_mac.h"
33
34#include <sys/param.h>
35#include <sys/systm.h>
36#include <sys/conf.h>

--- 889 unchanged lines hidden (view full) ---

926
927#if defined(__alpha__)
928#define linux_fcntl64_args linux_fcntl_args
929#endif
930
931static int
932fcntl_common(struct thread *td, struct linux_fcntl64_args *args)
933{
934 struct fcntl_args fcntl_args;
935 struct file *fp;
934 struct file *fp;
935 long arg;
936 int error, result;
937
936 int error, result;
937
938 fcntl_args.fd = args->fd;
939
940 switch (args->cmd) {
941 case LINUX_F_DUPFD:
938 switch (args->cmd) {
939 case LINUX_F_DUPFD:
942 fcntl_args.cmd = F_DUPFD;
943 fcntl_args.arg = args->arg;
944 return (fcntl(td, &fcntl_args));
940 return (kern_fcntl(td, args->fd, F_DUPFD, args->arg));
945
946 case LINUX_F_GETFD:
941
942 case LINUX_F_GETFD:
947 fcntl_args.cmd = F_GETFD;
948 return (fcntl(td, &fcntl_args));
943 return (kern_fcntl(td, args->fd, F_GETFD, 0));
949
950 case LINUX_F_SETFD:
944
945 case LINUX_F_SETFD:
951 fcntl_args.cmd = F_SETFD;
952 fcntl_args.arg = args->arg;
953 return (fcntl(td, &fcntl_args));
946 return (kern_fcntl(td, args->fd, F_SETFD, args->arg));
954
955 case LINUX_F_GETFL:
947
948 case LINUX_F_GETFL:
956 fcntl_args.cmd = F_GETFL;
957 error = fcntl(td, &fcntl_args);
949 error = kern_fcntl(td, args->fd, F_GETFL, 0);
958 result = td->td_retval[0];
959 td->td_retval[0] = 0;
960 if (result & O_RDONLY)
961 td->td_retval[0] |= LINUX_O_RDONLY;
962 if (result & O_WRONLY)
963 td->td_retval[0] |= LINUX_O_WRONLY;
964 if (result & O_RDWR)
965 td->td_retval[0] |= LINUX_O_RDWR;
966 if (result & O_NDELAY)
967 td->td_retval[0] |= LINUX_O_NONBLOCK;
968 if (result & O_APPEND)
969 td->td_retval[0] |= LINUX_O_APPEND;
970 if (result & O_FSYNC)
971 td->td_retval[0] |= LINUX_O_SYNC;
972 if (result & O_ASYNC)
973 td->td_retval[0] |= LINUX_FASYNC;
974 return (error);
975
976 case LINUX_F_SETFL:
950 result = td->td_retval[0];
951 td->td_retval[0] = 0;
952 if (result & O_RDONLY)
953 td->td_retval[0] |= LINUX_O_RDONLY;
954 if (result & O_WRONLY)
955 td->td_retval[0] |= LINUX_O_WRONLY;
956 if (result & O_RDWR)
957 td->td_retval[0] |= LINUX_O_RDWR;
958 if (result & O_NDELAY)
959 td->td_retval[0] |= LINUX_O_NONBLOCK;
960 if (result & O_APPEND)
961 td->td_retval[0] |= LINUX_O_APPEND;
962 if (result & O_FSYNC)
963 td->td_retval[0] |= LINUX_O_SYNC;
964 if (result & O_ASYNC)
965 td->td_retval[0] |= LINUX_FASYNC;
966 return (error);
967
968 case LINUX_F_SETFL:
977 fcntl_args.arg = 0;
969 arg = 0;
978 if (args->arg & LINUX_O_NDELAY)
970 if (args->arg & LINUX_O_NDELAY)
979 fcntl_args.arg |= O_NONBLOCK;
971 arg |= O_NONBLOCK;
980 if (args->arg & LINUX_O_APPEND)
972 if (args->arg & LINUX_O_APPEND)
981 fcntl_args.arg |= O_APPEND;
973 arg |= O_APPEND;
982 if (args->arg & LINUX_O_SYNC)
974 if (args->arg & LINUX_O_SYNC)
983 fcntl_args.arg |= O_FSYNC;
975 arg |= O_FSYNC;
984 if (args->arg & LINUX_FASYNC)
976 if (args->arg & LINUX_FASYNC)
985 fcntl_args.arg |= O_ASYNC;
986 fcntl_args.cmd = F_SETFL;
987 return (fcntl(td, &fcntl_args));
977 arg |= O_ASYNC;
978 return (kern_fcntl(td, args->fd, F_SETFL, arg));
988
989 case LINUX_F_GETOWN:
979
980 case LINUX_F_GETOWN:
990 fcntl_args.cmd = F_GETOWN;
991 return (fcntl(td, &fcntl_args));
981 return (kern_fcntl(td, args->fd, F_GETOWN, 0));
992
993 case LINUX_F_SETOWN:
994 /*
995 * XXX some Linux applications depend on F_SETOWN having no
996 * significant effect for pipes (SIGIO is not delivered for
997 * pipes under Linux-2.2.35 at least).
998 */
999 error = fget(td, args->fd, &fp);
1000 if (error)
1001 return (error);
1002 if (fp->f_type == DTYPE_PIPE) {
1003 fdrop(fp, td);
1004 return (EINVAL);
1005 }
1006 fdrop(fp, td);
1007
982
983 case LINUX_F_SETOWN:
984 /*
985 * XXX some Linux applications depend on F_SETOWN having no
986 * significant effect for pipes (SIGIO is not delivered for
987 * pipes under Linux-2.2.35 at least).
988 */
989 error = fget(td, args->fd, &fp);
990 if (error)
991 return (error);
992 if (fp->f_type == DTYPE_PIPE) {
993 fdrop(fp, td);
994 return (EINVAL);
995 }
996 fdrop(fp, td);
997
1008 fcntl_args.cmd = F_SETOWN;
1009 fcntl_args.arg = args->arg;
1010 return (fcntl(td, &fcntl_args));
998 return (kern_fcntl(td, args->fd, F_SETOWN, args->arg));
1011 }
1012
1013 return (EINVAL);
1014}
1015
1016int
1017linux_fcntl(struct thread *td, struct linux_fcntl_args *args)
1018{
1019 struct linux_fcntl64_args args64;
999 }
1000
1001 return (EINVAL);
1002}
1003
1004int
1005linux_fcntl(struct thread *td, struct linux_fcntl_args *args)
1006{
1007 struct linux_fcntl64_args args64;
1020 struct fcntl_args fcntl_args;
1021 struct l_flock linux_flock;
1008 struct l_flock linux_flock;
1022 struct flock *bsd_flock;
1009 struct flock bsd_flock;
1023 int error;
1010 int error;
1024 caddr_t sg;
1025
1011
1026 sg = stackgap_init();
1027 bsd_flock = (struct flock *)stackgap_alloc(&sg, sizeof(bsd_flock));
1028
1029#ifdef DEBUG
1030 if (ldebug(fcntl))
1031 printf(ARGS(fcntl, "%d, %08x, *"), args->fd, args->cmd);
1032#endif
1033
1034 switch (args->cmd) {
1035 case LINUX_F_GETLK:
1036 error = copyin((caddr_t)args->arg, &linux_flock,
1037 sizeof(linux_flock));
1038 if (error)
1039 return (error);
1012#ifdef DEBUG
1013 if (ldebug(fcntl))
1014 printf(ARGS(fcntl, "%d, %08x, *"), args->fd, args->cmd);
1015#endif
1016
1017 switch (args->cmd) {
1018 case LINUX_F_GETLK:
1019 error = copyin((caddr_t)args->arg, &linux_flock,
1020 sizeof(linux_flock));
1021 if (error)
1022 return (error);
1040 linux_to_bsd_flock(&linux_flock, bsd_flock);
1041 fcntl_args.fd = args->fd;
1042 fcntl_args.cmd = F_GETLK;
1043 fcntl_args.arg = (long)bsd_flock;
1044 error = fcntl(td, &fcntl_args);
1023 linux_to_bsd_flock(&linux_flock, &bsd_flock);
1024 error = kern_fcntl(td, args->fd, F_GETLK, (intptr_t)&bsd_flock);
1045 if (error)
1046 return (error);
1025 if (error)
1026 return (error);
1047 bsd_to_linux_flock(bsd_flock, &linux_flock);
1027 bsd_to_linux_flock(&bsd_flock, &linux_flock);
1048 return (copyout(&linux_flock, (caddr_t)args->arg,
1049 sizeof(linux_flock)));
1050
1051 case LINUX_F_SETLK:
1052 error = copyin((caddr_t)args->arg, &linux_flock,
1053 sizeof(linux_flock));
1054 if (error)
1055 return (error);
1028 return (copyout(&linux_flock, (caddr_t)args->arg,
1029 sizeof(linux_flock)));
1030
1031 case LINUX_F_SETLK:
1032 error = copyin((caddr_t)args->arg, &linux_flock,
1033 sizeof(linux_flock));
1034 if (error)
1035 return (error);
1056 linux_to_bsd_flock(&linux_flock, bsd_flock);
1057 fcntl_args.fd = args->fd;
1058 fcntl_args.cmd = F_SETLK;
1059 fcntl_args.arg = (long)bsd_flock;
1060 return (fcntl(td, &fcntl_args));
1036 linux_to_bsd_flock(&linux_flock, &bsd_flock);
1037 return (kern_fcntl(td, args->fd, F_SETLK,
1038 (intptr_t)&bsd_flock));
1061
1062 case LINUX_F_SETLKW:
1063 error = copyin((caddr_t)args->arg, &linux_flock,
1064 sizeof(linux_flock));
1065 if (error)
1066 return (error);
1039
1040 case LINUX_F_SETLKW:
1041 error = copyin((caddr_t)args->arg, &linux_flock,
1042 sizeof(linux_flock));
1043 if (error)
1044 return (error);
1067 linux_to_bsd_flock(&linux_flock, bsd_flock);
1068 fcntl_args.fd = args->fd;
1069 fcntl_args.cmd = F_SETLKW;
1070 fcntl_args.arg = (long)bsd_flock;
1071 return (fcntl(td, &fcntl_args));
1045 linux_to_bsd_flock(&linux_flock, &bsd_flock);
1046 return (kern_fcntl(td, args->fd, F_SETLKW,
1047 (intptr_t)&bsd_flock));
1072 }
1073
1074 args64.fd = args->fd;
1075 args64.cmd = args->cmd;
1076 args64.arg = args->arg;
1077 return (fcntl_common(td, &args64));
1078}
1079
1080#if defined(__i386__)
1081int
1082linux_fcntl64(struct thread *td, struct linux_fcntl64_args *args)
1083{
1048 }
1049
1050 args64.fd = args->fd;
1051 args64.cmd = args->cmd;
1052 args64.arg = args->arg;
1053 return (fcntl_common(td, &args64));
1054}
1055
1056#if defined(__i386__)
1057int
1058linux_fcntl64(struct thread *td, struct linux_fcntl64_args *args)
1059{
1084 struct fcntl_args fcntl_args;
1085 struct l_flock64 linux_flock;
1060 struct l_flock64 linux_flock;
1086 struct flock *bsd_flock;
1061 struct flock bsd_flock;
1087 int error;
1062 int error;
1088 caddr_t sg;
1089
1063
1090 sg = stackgap_init();
1091 bsd_flock = (struct flock *)stackgap_alloc(&sg, sizeof(bsd_flock));
1092
1093#ifdef DEBUG
1094 if (ldebug(fcntl64))
1095 printf(ARGS(fcntl64, "%d, %08x, *"), args->fd, args->cmd);
1096#endif
1097
1098 switch (args->cmd) {
1099 case LINUX_F_GETLK:
1100 case LINUX_F_GETLK64:
1101 error = copyin((caddr_t)args->arg, &linux_flock,
1102 sizeof(linux_flock));
1103 if (error)
1104 return (error);
1064#ifdef DEBUG
1065 if (ldebug(fcntl64))
1066 printf(ARGS(fcntl64, "%d, %08x, *"), args->fd, args->cmd);
1067#endif
1068
1069 switch (args->cmd) {
1070 case LINUX_F_GETLK:
1071 case LINUX_F_GETLK64:
1072 error = copyin((caddr_t)args->arg, &linux_flock,
1073 sizeof(linux_flock));
1074 if (error)
1075 return (error);
1105 linux_to_bsd_flock64(&linux_flock, bsd_flock);
1106 fcntl_args.fd = args->fd;
1107 fcntl_args.cmd = F_GETLK;
1108 fcntl_args.arg = (long)bsd_flock;
1109 error = fcntl(td, &fcntl_args);
1076 linux_to_bsd_flock64(&linux_flock, &bsd_flock);
1077 error = kern_fcntl(td, args->fd, F_GETLK, (intptr_t)&bsd_flock);
1110 if (error)
1111 return (error);
1078 if (error)
1079 return (error);
1112 bsd_to_linux_flock64(bsd_flock, &linux_flock);
1080 bsd_to_linux_flock64(&bsd_flock, &linux_flock);
1113 return (copyout(&linux_flock, (caddr_t)args->arg,
1114 sizeof(linux_flock)));
1115
1116 case LINUX_F_SETLK:
1117 case LINUX_F_SETLK64:
1118 error = copyin((caddr_t)args->arg, &linux_flock,
1119 sizeof(linux_flock));
1120 if (error)
1121 return (error);
1081 return (copyout(&linux_flock, (caddr_t)args->arg,
1082 sizeof(linux_flock)));
1083
1084 case LINUX_F_SETLK:
1085 case LINUX_F_SETLK64:
1086 error = copyin((caddr_t)args->arg, &linux_flock,
1087 sizeof(linux_flock));
1088 if (error)
1089 return (error);
1122 linux_to_bsd_flock64(&linux_flock, bsd_flock);
1123 fcntl_args.fd = args->fd;
1124 fcntl_args.cmd = F_SETLK;
1125 fcntl_args.arg = (long)bsd_flock;
1126 return (fcntl(td, &fcntl_args));
1090 linux_to_bsd_flock64(&linux_flock, &bsd_flock);
1091 return (kern_fcntl(td, args->fd, F_SETLK,
1092 (intptr_t)&bsd_flock));
1127
1128 case LINUX_F_SETLKW:
1129 case LINUX_F_SETLKW64:
1130 error = copyin((caddr_t)args->arg, &linux_flock,
1131 sizeof(linux_flock));
1132 if (error)
1133 return (error);
1093
1094 case LINUX_F_SETLKW:
1095 case LINUX_F_SETLKW64:
1096 error = copyin((caddr_t)args->arg, &linux_flock,
1097 sizeof(linux_flock));
1098 if (error)
1099 return (error);
1134 linux_to_bsd_flock64(&linux_flock, bsd_flock);
1135 fcntl_args.fd = args->fd;
1136 fcntl_args.cmd = F_SETLKW;
1137 fcntl_args.arg = (long)bsd_flock;
1138 return (fcntl(td, &fcntl_args));
1100 linux_to_bsd_flock64(&linux_flock, &bsd_flock);
1101 return (kern_fcntl(td, args->fd, F_SETLKW,
1102 (intptr_t)&bsd_flock));
1139 }
1140
1141 return (fcntl_common(td, args));
1142}
1143#endif /* __i386__ */
1144
1145int
1146linux_chown(struct thread *td, struct linux_chown_args *args)

--- 31 unchanged lines hidden ---
1103 }
1104
1105 return (fcntl_common(td, args));
1106}
1107#endif /* __i386__ */
1108
1109int
1110linux_chown(struct thread *td, struct linux_chown_args *args)

--- 31 unchanged lines hidden ---