title: Linux kernel module compile error: implicit declaration of function ‘open’
body: <p>I'm trying to write a simple sniffer-driver for linux, which will redirect all the requests to the real serial port (and also will print all the messages into system log). I found some examples on the Internet and implemented few functions. For example, function that invokes when ouw fake device is opened:</p>
  
  <pre><code>static int dev_open(struct inode *inodep, struct file *filep) {
     numberOpens++;
     printk(KERN_INFO "sniffer: Device has been opened %d time(s)\n", numberOpens);
  
     /// Connecting to real device   
     fd = open (real_device, O_RDWR | O_NOCTTY | O_SYNC);
     if (fd &lt; 0) {
        printk(KERN_INFO "sniffer: cannot open device %s\n", real_device);
       return 1;
     }
  
     set_interface_attribs (fd, B115200, 0);  // set speed to 115,200 bps, 8n1 (no parity)
     set_blocking (fd, 0);                     // set no blocking
     return 0;
  }
  </code></pre>
  
  <p>As you can see, this function just opens the real device using standart linux <code>open</code> system call. Or function that sets real device settings (speed and parity):</p>
  
  <pre><code>int set_interface_attribs (int fd, int speed, int parity) {
      struct termios tty;
      memset (&amp;tty, 0, sizeof tty);
      if (tcgetattr (fd, &amp;tty) != 0) {
          // error_message ("error %d from tcgetattr", errno);
          printk(KERN_INFO "sniffer: cannot get device attributes\n");
          return -1;
      }
  
      cfsetospeed (&amp;tty, speed);
      cfsetispeed (&amp;tty, speed);
  
      tty.c_cflag = (tty.c_cflag &amp; ~CSIZE) | CS8;     // 8-bit chars
      // disable IGNBRK for mismatched speed tests; otherwise receive break
      // as \000 chars
      tty.c_iflag &amp;= ~IGNBRK;         // disable break processing
      tty.c_lflag = 0;                // no signaling chars, no echo,
                                  // no canonical processing
      tty.c_oflag = 0;                // no remapping, no delays
      tty.c_cc[VMIN]  = 0;            // read doesn't block
      tty.c_cc[VTIME] = 5;            // 0.5 seconds read timeout
  
      tty.c_iflag &amp;= ~(IXON | IXOFF | IXANY); // shut off xon/xoff ctrl
  
      tty.c_cflag |= (CLOCAL | CREAD);// ignore modem controls,
                                      // enable reading
      tty.c_cflag &amp;= ~(PARENB | PARODD);      // shut off parity
      tty.c_cflag |= parity;
      tty.c_cflag &amp;= ~CSTOPB;
      tty.c_cflag &amp;= ~CRTSCTS;
  
      if (tcsetattr (fd, TCSANOW, &amp;tty) != 0) {
          printk(KERN_INFO "sniffer: cannot set device attributes\n");
          return -1;
      }
      return -1;
  }
  </code></pre>
  
  <p>It uses <code>tcgetattr</code> and <code>tcsetattr</code> system calls. </p>
  
  <p>I included all required header files:</p>
  
  <pre><code>#include &lt;linux/init.h&gt;
  #include &lt;linux/module.h&gt;
  #include &lt;linux/device.h&gt;
  #include &lt;linux/kernel.h&gt;
  #include &lt;linux/fcntl.h&gt; 
  #include &lt;linux/unistd.h&gt;
  #include &lt;linux/string.h&gt;
  #include &lt;linux/termios.h&gt;
  #include &lt;linux/fs.h&gt;
  #include &lt;asm/uaccess.h&gt;
  </code></pre>
  
  <p>But when I try to compile this module i get "implicit declaration of function" errors for this system calls.</p>
  
  <p>My Makefile:</p>
  
  <pre><code>obj-m += sniffer.o
  
  all:
      $(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
  
  clean:
      make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
  </code></pre>
  
  <p>Compile errors:</p>
  
  <pre><code>sniffer.c: In function ‘set_interface_attribs’:
  sniffer.c:51:9: error: implicit declaration of function ‘tcgetattr’ [-Werror=implicit-function-declaration]
       if (tcgetattr (fd, &amp;tty) != 0) {
           ^
  sniffer.c:57:5: error: implicit declaration of function ‘cfsetospeed’ [-Werror=implicit-function-declaration]
       cfsetospeed (&amp;tty, speed);
       ^
  sniffer.c:58:5: error: implicit declaration of function ‘cfsetispeed’ [-Werror=implicit-function-declaration]
       cfsetispeed (&amp;tty, speed);
       ^
  sniffer.c:79:9: error: implicit declaration of function ‘tcsetattr’ [-Werror=implicit-function-declaration]
       if (tcsetattr (fd, TCSANOW, &amp;tty) != 0) {
           ^
  sniffer.c: In function ‘dev_open’:
  sniffer.c:151:9: error: implicit declaration of function ‘open’ [-Werror=implicit-function-declaration]
      fd = open (real_device, O_RDWR | O_NOCTTY | O_SYNC);
           ^
  sniffer.c: In function ‘dev_read’:
  sniffer.c:164:18: error: implicit declaration of function ‘read’ [-Werror=implicit-function-declaration]
      error_count = read(fd, buffer, len);
                    ^
  sniffer.c: In function ‘dev_write’:
  sniffer.c:177:4: error: implicit declaration of function ‘write’ [-Werror=implicit-function-declaration]
      write (fd, buffer, len);
      ^
  sniffer.c: In function ‘dev_release’:
  sniffer.c:184:4: error: implicit declaration of function ‘close’ [-Werror=implicit-function-declaration]
      close(fd);
      ^
  </code></pre>
  
  <p>What can it be? All the examples that i found just say that I should include <code>&lt;linux/unistd.h&gt;</code> and <code>&lt;linux/termios.h&gt;</code>.</p>