2
我在学习go语言方面颇为新颖,并且我开始成为这种 语言的伟大爱好者。 我希望我很快会成为一个好的地鼠。目前,我尝试调用C函数 读取影子文件,我的代码是:从调用C函数开始
// #cgo CFLAGS: -D_POSIX_SOURCE=1
// #include <stdlib.h>
// #include <shadow.h>
// size_t size_of_shadow() { return sizeof(struct spwd); }
import "C"
import "unsafe"
import "fmt"
type Shadow struct {
Name string
Passwd string
}
func Getspnam(name string) (*Shadow, error) {
cname := C.CString(name)
cspwd := (*C.struct_passwd)(C.malloc(C.size_of_shadow()))
buf := (*C.char)(C.malloc(1024))
_, err := C.getspnam_r(cname, cspwd, 1024, &cpwd)
if unsafe.Pointer(cspwd) == unsafe.Pointer(uintptr(0)) {
C.free(unsafe.Pointer(cname))
if err == nil {
err = fmt.Errorf("User %s not found", name)
}
return nil, err
}
s := Shadow{
Name: C.GoString(cspwd.sp_namp),
Passwd: C.GoString(cspwd.sp_pwdp),
}
C.free(unsafe.Pointer(cname))
C.free(unsafe.Pointer(cspwd))
C.free(unsafe.Pointer(buf))
return &s, nil
}
通过这个小项目和 当然函数的文档的启发:
https://github.com/LTD-Beget/passwd http://linux.die.net/man/3/getspnam
我在debian stretch上运行1.6版本,并与软件包管理器一起安装。 当我尝试编译我的文件,我得到了一个错误:
could not determine kind of name for C.getspnam_r
但是当我打开头文件shadow.h,功能却出现在 文件。
为什么你有'-D_POSIX_SOURCE = 1'? 'getspnam_r'函数不是POSIX,所以我认为这个宏是干扰的。 – JimB
因为没有此标志,我得到了另一个错误,请参阅https://friendpaste.com/2EFrPk78Ghx96kE4CW0V2Z – Hobbestigrou
使用'C.struct_spwd'而不是'C.struct_passwd'。编译器应该能够从那里指出其余的问题。你也应该把你的电话推迟到'免费',因为当你提早回来时你没有释放内存。 – JimB