Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Calling ioctl() under linux - problem
Forum Updated to NodeBB v4.3 + New Features

Calling ioctl() under linux - problem

Scheduled Pinned Locked Moved General and Desktop
14 Posts 5 Posters 11.4k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • T Offline
    T Offline
    tobias.hunger
    wrote on last edited by
    #5

    Please do not run Qt Creator as root! Running big applications with plugins and whatnot as root is never a good idea.

    You can always start your application as root inside creator: Just add a custom executable run configuration and call a script that does the sudo and then starts your application.

    I would go deeper and try to figure out this issue: I see no reason why g++ should calculate another offset as gcc. Maybe it is a compiler bug or some issue with include files (you did use extern "C", didn't you?). I would be afraid that this workaround will fail after some upgrade of ubuntu (when the root cause is fixed:-).

    1 Reply Last reply
    0
    • P Offline
      P Offline
      paa123456
      wrote on last edited by
      #6

      Hello Tobias,

      If I run qt regularly , not as root, and I run in debug mode to test my app - can I do 'open' of a driver?
      Normally it fails if run not as root .

      How do I do this -

      add a custom executable run configuration and call a script that does the sudo and then starts your application

      Regarding my fix - once the app is built it will run ok regardless of fixes in ubuntu or qt.
      I will pay attention if rebuilding the app with fixed ubuntu or qt.

      Paul.

      1 Reply Last reply
      0
      • F Offline
        F Offline
        Franzk
        wrote on last edited by
        #7

        You can also set the permissions for the specific device so that your development user has the necessary rights. This is a much safer approach generally.

        I find it hard to believe that you have to subtract 0xa0 from your file descriptor in order for the ioctl to work and that it is a bug in ubuntu. Please post your code, preferably your entire project (tarred of course).

        "Horse sense is the thing a horse has which keeps it from betting on people." -- W.C. Fields

        http://www.catb.org/~esr/faqs/smart-questions.html

        1 Reply Last reply
        0
        • T Offline
          T Offline
          tobias.hunger
          wrote on last edited by
          #8

          Franzk: You are right, this is most likely not a bug in ubuntu. I just wanted to point out that this will come back to bite paa123456 sooner or later if not properly investigated.

          1 Reply Last reply
          0
          • G Offline
            G Offline
            goetz
            wrote on last edited by
            #9

            And nobody thinks about some brave users who will crash their files by using this program. It is scary that such software will be out in the wild!

            http://www.catb.org/~esr/faqs/smart-questions.html

            1 Reply Last reply
            0
            • F Offline
              F Offline
              Franzk
              wrote on last edited by
              #10

              I was actually kind of hoping the program wouldn't be released into the wild like that.

              "Horse sense is the thing a horse has which keeps it from betting on people." -- W.C. Fields

              http://www.catb.org/~esr/faqs/smart-questions.html

              1 Reply Last reply
              0
              • P Offline
                P Offline
                paa123456
                wrote on last edited by
                #11

                Hi ,

                I wrote -

                I did found the issue – linux kernel headers have a macro – _IOWR(….)
                which calculates the ioctl number passed to – ioctl()

                It seems gcc compiler calculates it properly.
                However qt (or g++) makes the ioctl number with 0xa0 added.
                I am not going to dig deeper, I just did subtract 0xa0 from the number in my qt program.

                Here is the simplified code -

                @
                #include <stdio.h>

                #include <fcntl.h> /* open /
                #include <unistd.h> /
                exit /
                #include <sys/ioctl.h> /
                ioctl */

                #include <pthread.h>

                #include <sys/stat.h>
                #include <sys/types.h>

                #include <sys/mman.h>
                #include <sys/syscall.h>
                #include <sys/utsname.h>

                #define BYTE unsigned char
                #define WORD unsigned short
                #define DWORD unsigned int

                #define TRUE 1
                #define FALSE 0

                #define FILE_DEVICE_UNKNOWN
                #define METHOD_BUFFERED
                #define FILE_ANY_ACCESS
                #define CTL_CODE(a, b,c, d) _IOWR(0, b, int) // !!! linux specific |0x4000

                // usl related
                #define ARS_IOCTL_INDEX 0x000

                #define IOCTL_ARS_IO_INP CTL_CODE(FILE_DEVICE_UNKNOWN,
                ARS_IOCTL_INDEX + 0x2b,
                METHOD_BUFFERED,
                FILE_ANY_ACCESS)

                int main ()
                {
                DWORD dw;
                // void *drvadr;

                dw = IOCTL_ARS_IO_INP;
                printf("\n IOCTL_ARS_IO_INP = %x\n", dw);

                return 0;
                

                }
                @

                You can -

                • save it as file and build it with gcc
                • make a simple qtcreator app and include code

                Paul.

                [edit: code highlighted / Denis Kormalev]

                1 Reply Last reply
                0
                • F Offline
                  F Offline
                  Franzk
                  wrote on last edited by
                  #12

                  Did you try to compile this yourself?

                  "Horse sense is the thing a horse has which keeps it from betting on people." -- W.C. Fields

                  http://www.catb.org/~esr/faqs/smart-questions.html

                  1 Reply Last reply
                  0
                  • F Offline
                    F Offline
                    Franzk
                    wrote on last edited by
                    #13

                    Some copy issue that was. Both gcc and g++ give the same result for me. (Gentoo, gcc 4.5.2)

                    "Horse sense is the thing a horse has which keeps it from betting on people." -- W.C. Fields

                    http://www.catb.org/~esr/faqs/smart-questions.html

                    1 Reply Last reply
                    0
                    • D Offline
                      D Offline
                      DenisKormalev
                      wrote on last edited by
                      #14

                      paa123456, please use @ to highlight code

                      1 Reply Last reply
                      0

                      • Login

                      • Login or register to search.
                      • First post
                        Last post
                      0
                      • Categories
                      • Recent
                      • Tags
                      • Popular
                      • Users
                      • Groups
                      • Search
                      • Get Qt Extensions
                      • Unsolved