| 1089 | } |
| 1090 | |
| 1091 | U32 KProcess::sendFile(U32 outFd, U32 inFd, U32 offset, U32 count) { |
| 1092 | BOXEDWINE_CRITICAL_SECTION_WITH_MUTEX(fdsMutex); |
| 1093 | KFileDescriptorPtr fdOut = getFileDescriptor(outFd); |
| 1094 | KFileDescriptorPtr fdIn = getFileDescriptor(inFd); |
| 1095 | |
| 1096 | if (!fdOut || !fdIn) { |
| 1097 | return -K_EBADFD; |
| 1098 | } |
| 1099 | U64 pos = 0; |
| 1100 | |
| 1101 | if (offset) { |
| 1102 | pos = fdIn->kobject->getPos(); |
| 1103 | fdIn->kobject->seek(memory->readq(offset)); |
| 1104 | } |
| 1105 | |
| 1106 | U8 buffer[1024]; |
| 1107 | while (count) { |
| 1108 | U32 todo = count; |
| 1109 | if (todo > 1024) { |
| 1110 | todo = 1024; |
| 1111 | } |
| 1112 | U32 read = (S32)fdIn->kobject->readNative(buffer, todo); |
| 1113 | if ((S32)read > 0) { |
| 1114 | fdOut->kobject->writeNative(buffer, read); |
| 1115 | count -= read; |
| 1116 | } else if (read == 0) { |
| 1117 | break; |
| 1118 | } else { |
| 1119 | return -K_EIO; |
| 1120 | } |
| 1121 | } |
| 1122 | if (offset) { |
| 1123 | memory->writeq(offset, fdIn->kobject->getPos()); |
| 1124 | fdIn->kobject->seek(pos); |
| 1125 | } |
| 1126 | return 0; |
| 1127 | } |
| 1128 | |
| 1129 | U32 KProcess::write(KThread* thread, FD fildes, U32 bufferAddress, U32 bufferLen) { |
| 1130 | KFileDescriptorPtr fd = this->getFileDescriptor(fildes); |
no test coverage detected