...

Source file src/github.com/tklauser/go-sysconf/sysconf_netbsd.go

Documentation: github.com/tklauser/go-sysconf

     1  // Copyright 2018 Tobias Klauser. 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  package sysconf
     6  
     7  import (
     8  	"sync"
     9  
    10  	"golang.org/x/sys/unix"
    11  )
    12  
    13  const (
    14  	_HOST_NAME_MAX  = _MAXHOSTNAMELEN
    15  	_LOGIN_NAME_MAX = _MAXLOGNAME + 1
    16  	_SYMLOOP_MAX    = _MAXSYMLINKS
    17  
    18  	_POSIX2_C_BIND    = 1
    19  	_POSIX2_C_DEV     = -1
    20  	_POSIX2_CHAR_TERM = -1
    21  	_POSIX2_FORT_DEV  = -1
    22  	_POSIX2_FORT_RUN  = -1
    23  	_POSIX2_LOCALEDEF = -1
    24  	_POSIX2_SW_DEV    = -1
    25  	_POSIX2_UPE       = -1
    26  )
    27  
    28  var (
    29  	clktck     int64
    30  	clktckOnce sync.Once
    31  )
    32  
    33  func sysconfPOSIX(name int) (int64, error) {
    34  	// NetBSD does not define all _POSIX_* values used in sysconf_posix.go
    35  	// The supported ones are handled in sysconf below.
    36  	return -1, errInvalid
    37  }
    38  
    39  func sysconf(name int) (int64, error) {
    40  	// NetBSD uses sysctl to get some of these values. For the user.* namespace,
    41  	// calls get handled by user_sysctl in /usr/src/lib/libc/gen/sysctl.c
    42  	// Duplicate the relevant values here.
    43  
    44  	switch name {
    45  
    46  	// 1003.1
    47  	case SC_ARG_MAX:
    48  		return sysctl32("kern.argmax"), nil
    49  	case SC_CHILD_MAX:
    50  		var rlim unix.Rlimit
    51  		if err := unix.Getrlimit(unix.RLIMIT_NPROC, &rlim); err == nil {
    52  			if rlim.Cur != unix.RLIM_INFINITY {
    53  				return int64(rlim.Cur), nil
    54  			}
    55  		}
    56  		return -1, nil
    57  	case SC_CLK_TCK:
    58  		clktckOnce.Do(func() {
    59  			clktck = -1
    60  			if ci, err := unix.SysctlClockinfo("kern.clockrate"); err == nil {
    61  				clktck = int64(ci.Hz)
    62  			}
    63  		})
    64  		return clktck, nil
    65  	case SC_NGROUPS_MAX:
    66  		return sysctl32("kern.ngroups"), nil
    67  	case SC_JOB_CONTROL:
    68  		return sysctl32("kern.job_control"), nil
    69  	case SC_OPEN_MAX:
    70  		var rlim unix.Rlimit
    71  		if err := unix.Getrlimit(unix.RLIMIT_NOFILE, &rlim); err == nil {
    72  			return int64(rlim.Cur), nil
    73  		}
    74  		return -1, nil
    75  	case SC_STREAM_MAX:
    76  		// sysctl("user.stream_max")
    77  		return _FOPEN_MAX, nil
    78  	case SC_TZNAME_MAX:
    79  		// sysctl("user.tzname_max")
    80  		return _NAME_MAX, nil
    81  	case SC_SAVED_IDS:
    82  		return yesno(sysctl32("kern.saved_ids")), nil
    83  	case SC_VERSION:
    84  		return sysctl32("kern.posix1version"), nil
    85  
    86  	// 1003.1b
    87  	case SC_FSYNC:
    88  		return sysctl32("kern.fsync"), nil
    89  	case SC_SYNCHRONIZED_IO:
    90  		return sysctl32("kern.synchronized_io"), nil
    91  	case SC_MAPPED_FILES:
    92  		return sysctl32("kern.mapped_files"), nil
    93  	case SC_MEMLOCK:
    94  		return sysctl32("kern.memlock"), nil
    95  	case SC_MEMLOCK_RANGE:
    96  		return sysctl32("kern.memlock_range"), nil
    97  	case SC_MEMORY_PROTECTION:
    98  		return sysctl32("kern.memory_protection"), nil
    99  	case SC_MONOTONIC_CLOCK:
   100  		return sysctl32("kern.monotonic_clock"), nil
   101  	case SC_SEMAPHORES:
   102  		return sysctl32("kern.posix_semaphores"), nil
   103  	case SC_TIMERS:
   104  		return sysctl32("kern.posix_timers"), nil
   105  
   106  	// 1003.1c
   107  	case SC_LOGIN_NAME_MAX:
   108  		return sysctl32("kern.login_name_max"), nil
   109  	case SC_THREADS:
   110  		return sysctl32("kern.posix_threads"), nil
   111  
   112  	// 1003.1j
   113  	case SC_BARRIERS:
   114  		return yesno(sysctl32("kern.posix_barriers")), nil
   115  	case SC_SPIN_LOCKS:
   116  		return yesno(sysctl32("kern.posix_spin_locks")), nil
   117  	case SC_READER_WRITER_LOCKS:
   118  		return yesno(sysctl32("kern.posix_reader_writer_locks")), nil
   119  
   120  	// 1003.2
   121  	case SC_2_VERSION:
   122  		// sysctl user.posix2_version
   123  		return _POSIX2_VERSION, nil
   124  	case SC_2_C_BIND:
   125  		// sysctl user.posix2_c_bind
   126  		return _POSIX2_C_BIND, nil
   127  	case SC_2_C_DEV:
   128  		// sysctl user.posix2_c_dev
   129  		return _POSIX2_C_DEV, nil
   130  	case SC_2_CHAR_TERM:
   131  		// sysctl user.posix2_char_term
   132  		return _POSIX2_CHAR_TERM, nil
   133  	case SC_2_FORT_DEV:
   134  		// sysctl user.posix2_fort_dev
   135  		return _POSIX2_FORT_DEV, nil
   136  	case SC_2_FORT_RUN:
   137  		// sysctl user.posix2_fort_run
   138  		return _POSIX2_FORT_RUN, nil
   139  	case SC_2_LOCALEDEF:
   140  		// sysctl user.posix2_localedef
   141  		return _POSIX2_LOCALEDEF, nil
   142  	case SC_2_SW_DEV:
   143  		// sysctl user.posix2_sw_dev
   144  		return _POSIX2_SW_DEV, nil
   145  	case SC_2_UPE:
   146  		// sysctl user.posix2_upe
   147  		return _POSIX2_UPE, nil
   148  
   149  	// XPG 4.2
   150  	case SC_IOV_MAX:
   151  		return sysctl32("kern.iov_max"), nil
   152  	case SC_XOPEN_SHM:
   153  		return yesno(sysctl32("kern.ipc.sysvshm")), nil
   154  
   155  	// 1003.1-2001, XSI Option Group
   156  	case SC_AIO_LISTIO_MAX:
   157  		return sysctl32("kern.aio_listio_max"), nil
   158  	case SC_AIO_MAX:
   159  		return sysctl32("kern.aio_max"), nil
   160  	case SC_ASYNCHRONOUS_IO:
   161  		return yesno(sysctl32("kern.posix_aio")), nil
   162  	case SC_MESSAGE_PASSING:
   163  		return yesno(sysctl32("kern.posix_msg")), nil
   164  	case SC_MQ_OPEN_MAX:
   165  		return sysctl32("kern.mqueue.mq_open_max"), nil
   166  	case SC_MQ_PRIO_MAX:
   167  		return sysctl32("kern.mqueue.mq_prio_max"), nil
   168  	case SC_PRIORITY_SCHEDULING:
   169  		return yesno(sysctl32("kern.posix_sched")), nil
   170  	case SC_ATEXIT_MAX:
   171  		// sysctl("user.atexit_max")
   172  		return -1, nil // TODO
   173  
   174  	// 1003.1-2001, TSF
   175  	case SC_GETGR_R_SIZE_MAX:
   176  		return _GETGR_R_SIZE_MAX, nil
   177  	case SC_GETPW_R_SIZE_MAX:
   178  		return _GETPW_R_SIZE_MAX, nil
   179  
   180  	// Unsorted
   181  	case SC_HOST_NAME_MAX:
   182  		return _MAXHOSTNAMELEN, nil
   183  	case SC_PASS_MAX:
   184  		return _PASSWORD_LEN, nil
   185  	case SC_REGEXP:
   186  		return _POSIX_REGEXP, nil
   187  	case SC_SHARED_MEMORY_OBJECTS:
   188  		return _POSIX_SHARED_MEMORY_OBJECTS, nil
   189  	case SC_SHELL:
   190  		return _POSIX_SHELL, nil
   191  	case SC_SPAWN:
   192  		return _POSIX_SPAWN, nil
   193  
   194  	// Extensions
   195  	case SC_NPROCESSORS_CONF:
   196  		return sysctl32("hw.ncpu"), nil
   197  	case SC_NPROCESSORS_ONLN:
   198  		return sysctl32("hw.ncpuonline"), nil
   199  
   200  	// Linux/Solaris
   201  	case SC_PHYS_PAGES:
   202  		return sysctl64("hw.physmem64") / int64(unix.Getpagesize()), nil
   203  
   204  	// Native
   205  	case SC_SCHED_RT_TS:
   206  		return sysctl32("kern.sched.rtts"), nil
   207  	case SC_SCHED_PRI_MIN:
   208  		return sysctl32("kern.sched.pri_min"), nil
   209  	case SC_SCHED_PRI_MAX:
   210  		return sysctl32("kern.sched.pri_max"), nil
   211  	case SC_THREAD_DESTRUCTOR_ITERATIONS:
   212  		return _POSIX_THREAD_DESTRUCTOR_ITERATIONS, nil
   213  	case SC_THREAD_KEYS_MAX:
   214  		return _POSIX_THREAD_KEYS_MAX, nil
   215  	case SC_THREAD_STACK_MIN:
   216  		return int64(unix.Getpagesize()), nil
   217  	case SC_THREAD_THREADS_MAX:
   218  		return sysctl32("kern.maxproc"), nil
   219  	case SC_THREAD_ATTR_STACKADDR:
   220  		return _POSIX_THREAD_ATTR_STACKADDR, nil
   221  	case SC_THREAD_ATTR_STACKSIZE:
   222  		return _POSIX_THREAD_ATTR_STACKSIZE, nil
   223  	case SC_THREAD_SAFE_FUNCTIONS:
   224  		return _POSIX_THREAD_SAFE_FUNCTIONS, nil
   225  	case SC_THREAD_PRIO_PROTECT:
   226  		return _POSIX_THREAD_PRIO_PROTECT, nil
   227  	case SC_THREAD_PRIORITY_SCHEDULING,
   228  		SC_THREAD_PRIO_INHERIT,
   229  		SC_THREAD_PROCESS_SHARED:
   230  		return -1, nil
   231  	case SC_TTY_NAME_MAX:
   232  		return pathconf(_PATH_DEV, _PC_NAME_MAX), nil
   233  	case SC_TIMER_MAX:
   234  		return _POSIX_TIMER_MAX, nil
   235  	case SC_SEM_NSEMS_MAX:
   236  		return _LONG_MAX, nil
   237  	case SC_CPUTIME:
   238  		return _POSIX_CPUTIME, nil
   239  	case SC_THREAD_CPUTIME:
   240  		return _POSIX_THREAD_CPUTIME, nil
   241  	case SC_DELAYTIMER_MAX:
   242  		return _POSIX_DELAYTIMER_MAX, nil
   243  	case SC_SIGQUEUE_MAX:
   244  		return _POSIX_SIGQUEUE_MAX, nil
   245  	case SC_REALTIME_SIGNALS:
   246  		return 200112, nil
   247  	}
   248  
   249  	return sysconfGeneric(name)
   250  }
   251  

View as plain text