0

I'm trying to access a c struct in cgo, but go this

could not determine kind of name for C.utmpx

utmpx is a c struct

here is the go code:

/*
#include <stdio.h>
#include <stdlib.h>
#include <utmpx.h>
#include <fcntl.h>
#include <unistd.h>
*/
import "C"

type record C.utmpx

fd, err := os.Open(C._PATH_UTMPX) // this works
fd, err := os.Open(C.UTMPX_FILE)  // error

In the utmpx.h file , there is

 #define    _PATH_UTMPX     "/var/run/utmpx"
 #define    UTMPX_FILE  _PATH_UTMPX

I can use _PATH_UTMPX but get the same warn when using UTMPX_FILE, why?

It seems that I cannot access these variables declared in .h file How can i do this ?

platform: macOS sirria,go 1.8

2
  • Problem solved? Commented May 22, 2017 at 1:26
  • @RicardoBranco really sorry for the delay Commented Jul 24, 2017 at 5:00

1 Answer 1

0

#define's are problematic with CGo. I could get it to work with Go 1.8.1 on Linux amd64 like this:

package main

import "os"

/*
#define _GNU_SOURCE 1
#include <stdio.h>
#include <stdlib.h>
#include <utmpx.h>
#include <fcntl.h>
#include <unistd.h>

char *path_utmpx = UTMPX_FILE;

typedef struct utmpx utmpx;
*/
import "C"

type record C.utmpx

func main() {
    path := C.GoString(C.path_utmpx)
    fd, err := os.Open(path)
    if err != nil {
        panic("bad")
    }
    fd.Close()
}
  1. I had to define _GNU_SOURCE to get the UTMPX_FILE definition.
  2. I had to create the path_utmpx variable to get around the #define problems with CGo.
  3. I had to do the typedef to get type record C.utmpx compile.
  4. With Go, you can't use C strings directly. You must convert them to Go strings. Similarly, if you want to call C functions with Go strings, you must convert them to C strings (and free the space allocated in the heap).

A few pointers:

Good luck!

Sign up to request clarification or add additional context in comments.

1 Comment

Great greate answer. It works without #define _GNU_SOURCE 1 for me. go version number is 1.8, and os is macOS el capitan.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.