Je suis assez nouveau sur apprendre la langue, et je commence à être un grand amoureux de ce langage . J'espère, je serai un bon gopher bientôt. À l'heure actuelle, je tente d'appeler une fonction C pour lire le fichier d'ombre, mon code est:Appelez une fonction C à partir de
// #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
}
Inspiré par ce petit projet et la documentation de la fonction de cours:
https://github.com/LTD-Beget/passwd http://linux.die.net/man/3/getspnam
Je suis sur Debian Stretch et Go Version 1.6, installé avec le gestionnaire de paquets. Je suis une erreur lorsque je tente de compiler mon dossier:
could not determine kind of name for C.getspnam_r
Mais quand j'ouvre le fichier d'en-tête shadow.h, la fonction est cependant présent sur le fichier.
Pourquoi avez-vous '-D_POSIX_SOURCE = 1'? La fonction 'getspnam_r' n'est pas POSIX, donc je pense que la macro est ce qui interfère. – JimB
Parce que sans ce drapeau, j'ai eu une autre erreur voir https://friendpaste.com/2EFrPk78Ghx96kE4CW0V2Z – Hobbestigrou
Utilisez 'C.struct_spwd' au lieu de' C.struct_passwd'. Le compilateur devrait être capable de pointer le reste des problèmes à partir de là. Vous devriez également reporter vos appels à 'free', car vous ne libérez pas la mémoire lorsque vous revenez plus tôt. – JimB