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 --- |