// 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.

// +build linux darwin

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

import (
	
	gosignal 
	
	
	

	
	
	
	
	
	
)

// sighandler_t signal(int signum, sighandler_t handler);
func ( *TLS,  int32,  uintptr) uintptr { //TODO use sigaction?
	signalsMu.Lock()

	defer signalsMu.Unlock()

	 := signals[]
	signals[] = 
	switch  {
	case signal.SIG_DFL:
		panic(todo("%v %#x", syscall.Signal(), ))
	case signal.SIG_IGN:
		switch  {
		case signal.SIG_DFL:
			gosignal.Ignore(syscall.Signal()) //TODO
		case signal.SIG_IGN:
			gosignal.Ignore(syscall.Signal())
		default:
			panic(todo("%v %#x", syscall.Signal(), ))
		}
	default:
		switch  {
		case signal.SIG_DFL:
			 := make(chan os.Signal, 1)
			gosignal.Notify(, syscall.Signal())
			go func() { //TODO mechanism to stop/cancel
				for {
					<-
					var  func(*TLS, int32)
					*(*uintptr)(unsafe.Pointer(&)) = 
					 := NewTLS()
					(, )
					.Close()
				}
			}()
		case signal.SIG_IGN:
			panic(todo("%v %#x", syscall.Signal(), ))
		default:
			panic(todo("%v %#x", syscall.Signal(), ))
		}
	}
	return 
}

// void rewind(FILE *stream);
func ( *TLS,  uintptr) {
	Xfseek(, , 0, stdio.SEEK_SET)
}

// int putchar(int c);
func ( *TLS,  int32) int32 {
	if ,  := write([]byte{byte()});  != nil {
		return stdio.EOF
	}

	return int32()
}

// int gethostname(char *name, size_t len);
func ( *TLS,  uintptr,  types.Size_t) int32 {
	if  < 0 {
		.setErrno(errno.EINVAL)
		return -1
	}

	if  == 0 {
		return 0
	}

	,  := os.Hostname()
	if  != nil {
		panic(todo(""))
	}

	 := len()
	if len() >= int() {
		 = int() - 1
	}
	 := (*reflect.StringHeader)(unsafe.Pointer(&))
	copy((*RawMem)(unsafe.Pointer())[::], (*RawMem)(unsafe.Pointer(.Data))[::])
	*(*byte)(unsafe.Pointer( + uintptr())) = 0
	return 0
}

// int remove(const char *pathname);
func ( *TLS,  uintptr) int32 {
	panic(todo(""))
}

// long pathconf(const char *path, int name);
func ( *TLS,  uintptr,  int32) long {
	panic(todo(""))
}

// ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
func ( *TLS,  int32,  uintptr,  types.Size_t,  int32, ,  uintptr) types.Ssize_t {
	panic(todo(""))
}

// ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
func ( *TLS,  int32,  uintptr,  types.Size_t,  int32,  uintptr,  socklen_t) types.Ssize_t {
	panic(todo(""))
}

// void srand48(long int seedval);
func ( *TLS,  long) {
	panic(todo(""))
}

// long int lrand48(void);
func ( *TLS) long {
	panic(todo(""))
}

// ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);
func ( *TLS,  int32,  uintptr,  int32) types.Ssize_t {
	panic(todo(""))
}

// int poll(struct pollfd *fds, nfds_t nfds, int timeout);
func ( *TLS,  uintptr,  poll.Nfds_t,  int32) int32 {
	if  == 0 {
		panic(todo(""))
	}

	// if dmesgs {
	// 	dmesg("%v: %#x %v %v, %+v", origin(1), fds, nfds, timeout, (*[1000]unix.PollFd)(unsafe.Pointer(fds))[:nfds:nfds])
	// }
	,  := unix.Poll((*[1000]unix.PollFd)(unsafe.Pointer())[::], int())
	// if dmesgs {
	// 	dmesg("%v: %v %v", origin(1), n, err)
	// }
	if  != nil {
		.setErrno()
		return -1
	}

	return int32()
}

// ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);
func ( *TLS,  int32,  uintptr,  int32) types.Ssize_t {
	, ,  := unix.Syscall(unix.SYS_RECVMSG, uintptr(), , uintptr())
	if  != 0 {
		.setErrno()
		return -1
	}

	return types.Ssize_t()
}

// struct cmsghdr *CMSG_NXTHDR(struct msghdr *msgh, struct cmsghdr *cmsg);
func ( *TLS, ,  uintptr) uintptr {
	panic(todo(""))
}

// wchar_t *wcschr(const wchar_t *wcs, wchar_t wc);
func ( *TLS,  uintptr,  wchar_t) wchar_t {
	panic(todo(""))
}

// gid_t getegid(void);
func ( *TLS) types.Gid_t {
	panic(todo(""))
}

// gid_t getgid(void);
func ( *TLS) types.Gid_t {
	panic(todo(""))
}

// void *shmat(int shmid, const void *shmaddr, int shmflg);
func ( *TLS,  int32,  uintptr,  int32) uintptr {
	panic(todo(""))
}

// int shmctl(int shmid, int cmd, struct shmid_ds *buf);
func ( *TLS, ,  int32,  uintptr) int32 {
	panic(todo(""))
}

// int shmdt(const void *shmaddr);
func ( *TLS,  uintptr) int32 {
	panic(todo(""))
}

// int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid);
func ( *TLS, , ,  uintptr) int32 {
	panic(todo(""))
}

// int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid);
func ( *TLS, , ,  uintptr) int32 {
	panic(todo(""))
}