Source file src/os/user/cgo_lookup_cgo.go

     1  // Copyright 2011 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  //go:build cgo && !osusergo && unix && !android && !darwin
     6  
     7  package user
     8  
     9  import (
    10  	"syscall"
    11  )
    12  
    13  /*
    14  #cgo solaris CFLAGS: -D_POSIX_PTHREAD_SEMANTICS
    15  #cgo CFLAGS: -fno-stack-protector
    16  #include <unistd.h>
    17  #include <sys/types.h>
    18  #include <pwd.h>
    19  #include <grp.h>
    20  #include <stdlib.h>
    21  #include <string.h>
    22  
    23  static struct passwd mygetpwuid_r(int uid, char *buf, size_t buflen, int *found, int *perr) {
    24  	struct passwd pwd;
    25  	struct passwd *result;
    26  	memset (&pwd, 0, sizeof(pwd));
    27  	*perr = getpwuid_r(uid, &pwd, buf, buflen, &result);
    28  	*found = result != NULL;
    29  	return pwd;
    30  }
    31  
    32  static struct passwd mygetpwnam_r(const char *name, char *buf, size_t buflen, int *found, int *perr) {
    33  	struct passwd pwd;
    34  	struct passwd *result;
    35  	memset(&pwd, 0, sizeof(pwd));
    36  	*perr = getpwnam_r(name, &pwd, buf, buflen, &result);
    37  	*found = result != NULL;
    38  	return pwd;
    39  }
    40  
    41  static struct group mygetgrgid_r(int gid, char *buf, size_t buflen, int *found, int *perr) {
    42  	struct group grp;
    43  	struct group *result;
    44  	memset(&grp, 0, sizeof(grp));
    45  	*perr = getgrgid_r(gid, &grp, buf, buflen, &result);
    46  	*found = result != NULL;
    47  	return grp;
    48  }
    49  
    50  static struct group mygetgrnam_r(const char *name, char *buf, size_t buflen, int *found, int *perr) {
    51  	struct group grp;
    52  	struct group *result;
    53  	memset(&grp, 0, sizeof(grp));
    54  	*perr = getgrnam_r(name, &grp, buf, buflen, &result);
    55  	*found = result != NULL;
    56  	return grp;
    57  }
    58  */
    59  import "C"
    60  
    61  type _C_char = C.char
    62  type _C_int = C.int
    63  type _C_gid_t = C.gid_t
    64  type _C_uid_t = C.uid_t
    65  type _C_size_t = C.size_t
    66  type _C_struct_group = C.struct_group
    67  type _C_struct_passwd = C.struct_passwd
    68  type _C_long = C.long
    69  
    70  func _C_pw_uid(p *_C_struct_passwd) _C_uid_t   { return p.pw_uid }
    71  func _C_pw_uidp(p *_C_struct_passwd) *_C_uid_t { return &p.pw_uid }
    72  func _C_pw_gid(p *_C_struct_passwd) _C_gid_t   { return p.pw_gid }
    73  func _C_pw_gidp(p *_C_struct_passwd) *_C_gid_t { return &p.pw_gid }
    74  func _C_pw_name(p *_C_struct_passwd) *_C_char  { return p.pw_name }
    75  func _C_pw_gecos(p *_C_struct_passwd) *_C_char { return p.pw_gecos }
    76  func _C_pw_dir(p *_C_struct_passwd) *_C_char   { return p.pw_dir }
    77  
    78  func _C_gr_gid(g *_C_struct_group) _C_gid_t  { return g.gr_gid }
    79  func _C_gr_name(g *_C_struct_group) *_C_char { return g.gr_name }
    80  
    81  func _C_GoString(p *_C_char) string { return C.GoString(p) }
    82  
    83  func _C_getpwnam_r(name *_C_char, buf *_C_char, size _C_size_t) (pwd _C_struct_passwd, found bool, errno syscall.Errno) {
    84  	var f, e _C_int
    85  	pwd = C.mygetpwnam_r(name, buf, size, &f, &e)
    86  	return pwd, f != 0, syscall.Errno(e)
    87  }
    88  
    89  func _C_getpwuid_r(uid _C_uid_t, buf *_C_char, size _C_size_t) (pwd _C_struct_passwd, found bool, errno syscall.Errno) {
    90  	var f, e _C_int
    91  	pwd = C.mygetpwuid_r(_C_int(uid), buf, size, &f, &e)
    92  	return pwd, f != 0, syscall.Errno(e)
    93  }
    94  
    95  func _C_getgrnam_r(name *_C_char, buf *_C_char, size _C_size_t) (grp _C_struct_group, found bool, errno syscall.Errno) {
    96  	var f, e _C_int
    97  	grp = C.mygetgrnam_r(name, buf, size, &f, &e)
    98  	return grp, f != 0, syscall.Errno(e)
    99  }
   100  
   101  func _C_getgrgid_r(gid _C_gid_t, buf *_C_char, size _C_size_t) (grp _C_struct_group, found bool, errno syscall.Errno) {
   102  	var f, e _C_int
   103  	grp = C.mygetgrgid_r(_C_int(gid), buf, size, &f, &e)
   104  	return grp, f != 0, syscall.Errno(e)
   105  }
   106  
   107  const (
   108  	_C__SC_GETPW_R_SIZE_MAX = C._SC_GETPW_R_SIZE_MAX
   109  	_C__SC_GETGR_R_SIZE_MAX = C._SC_GETGR_R_SIZE_MAX
   110  )
   111  
   112  func _C_sysconf(key _C_int) _C_long { return C.sysconf(key) }
   113  

View as plain text