TCSBRK implementation for linux compat

Hi.

I needed suport for this feature in FreeBSD linux emulation, because I have to use precompiled linux library/binary that uses it. There was a lot of errors in logs like:

Code:
... ioctl fd=52, cmd=0x5409 ('T',9) is not implemented

I could not find any help so I had to do that by myself :D

I found implementation in NetBSD sources, and just 'translated' it to the FreeBSD :e

There is my work:

Code:
--- linux_ioctl.orig    2012-08-06 01:54:33.000000000 +0200
+++ linux_ioctl.c       2012-10-25 13:59:12.000000000 +0200
@@ -778,8 +778,26 @@
                    td));
                break;

-       /* LINUX_TCSBRK */
-
+       case LINUX_TCSBRK:
+               if (args->arg)
+                   {
+                       args->cmd = TIOCDRAIN;
+                       error = (sys_ioctl(td, (struct ioctl_args *)args));
+                       break;
+                   }
+               else
+                   {
+                       if ((error = fo_ioctl(fp, TIOCSBRK, NULL, td->td_ucred,td)) != 0)
+                           break;
+                       error = tsleep(&args->arg, PZERO | PCATCH, "linux_tcsbrk", hz / 4);
+                       if (error == EINTR || error == ERESTART) {
+                           fo_ioctl(fp, TIOCCBRK, NULL, td->td_ucred, td);
+                           error = EINTR;
+                       } else
+                           error = fo_ioctl (fp, TIOCCBRK, NULL, td->td_ucred, td);
+                       break;
+                   }
+
        case LINUX_TCXONC: {
                switch (args->arg) {
                case LINUX_TCOOFF:

Could someone have a look at this if the code is correct?
Sorry but I do not have kernel developing experience and this is my first patch :stud
I'm testing this patch for over 12 hours now and it seems to work well. No errors, load average dropped from 2.5 to 0.5 :D
And sorry for my bad english...
 
Back
Top