// Copyright 2010 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE-GO file.

// Modifications Copyright 2020 The Libc Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package libc // import "modernc.org/libc"

import (
	
	
	
	
	

	
)

// Random number state.
// We generate random temporary file names so that there's a good
// chance the file doesn't exist yet - keeps the number of tries in
// TempFile to a minimum.
var randState uint32
var randStateMu sync.Mutex

func () uint32 {
	return uint32(time.Now().UnixNano() + int64(os.Getpid()))
}

func ( uintptr) {
	randStateMu.Lock()
	 := randState
	if  == 0 {
		 = reseed()
	}
	 = *1664525 + 1013904223 // constants from Numerical Recipes
	randState = 
	randStateMu.Unlock()
	copy((*RawMem)(unsafe.Pointer())[:6:6], fmt.Sprintf("%06d", int(1e9+%1e9)%1e6))
}

func (,  uintptr) ( int,  error) {
	const  = 10000
	 := 0
	for  := 0;  < ; ++ {
		nextRandom()
		if ,  = unix.Open(GoString(), os.O_RDWR|os.O_CREATE|os.O_EXCL, 0600);  == nil {
			return , nil
		}

		if !os.IsExist() {
			return -1, 
		}

		if ++;  > 10 {
			randStateMu.Lock()
			randState = reseed()
			 = 0
			randStateMu.Unlock()
		}
	}
	return -1, 
}