588 //sys Adjtime(delta *Timeval, olddelta *Timeval) (err error) |
588 //sys Adjtime(delta *Timeval, olddelta *Timeval) (err error) |
589 //sys Chdir(path string) (err error) |
589 //sys Chdir(path string) (err error) |
590 //sys Chmod(path string, mode uint32) (err error) |
590 //sys Chmod(path string, mode uint32) (err error) |
591 //sys Chown(path string, uid int, gid int) (err error) |
591 //sys Chown(path string, uid int, gid int) (err error) |
592 //sys Chroot(path string) (err error) |
592 //sys Chroot(path string) (err error) |
|
593 //sys ClockGettime(clockid int32, time *Timespec) (err error) |
593 //sys Close(fd int) (err error) |
594 //sys Close(fd int) (err error) |
594 //sys Creat(path string, mode uint32) (fd int, err error) |
595 //sys Creat(path string, mode uint32) (fd int, err error) |
595 //sys Dup(fd int) (nfd int, err error) |
596 //sys Dup(fd int) (nfd int, err error) |
596 //sys Dup2(oldfd int, newfd int) (err error) |
597 //sys Dup2(oldfd int, newfd int) (err error) |
597 //sys Exit(code int) |
598 //sys Exit(code int) |
1024 } |
1025 } |
1025 valid = i + 1 |
1026 valid = i + 1 |
1026 } |
1027 } |
1027 return valid, err |
1028 return valid, err |
1028 } |
1029 } |
|
1030 |
|
1031 //sys putmsg(fd int, clptr *strbuf, dataptr *strbuf, flags int) (err error) |
|
1032 |
|
1033 func Putmsg(fd int, cl []byte, data []byte, flags int) (err error) { |
|
1034 var clp, datap *strbuf |
|
1035 if len(cl) > 0 { |
|
1036 clp = &strbuf{ |
|
1037 Len: int32(len(cl)), |
|
1038 Buf: (*int8)(unsafe.Pointer(&cl[0])), |
|
1039 } |
|
1040 } |
|
1041 if len(data) > 0 { |
|
1042 datap = &strbuf{ |
|
1043 Len: int32(len(data)), |
|
1044 Buf: (*int8)(unsafe.Pointer(&data[0])), |
|
1045 } |
|
1046 } |
|
1047 return putmsg(fd, clp, datap, flags) |
|
1048 } |
|
1049 |
|
1050 //sys getmsg(fd int, clptr *strbuf, dataptr *strbuf, flags *int) (err error) |
|
1051 |
|
1052 func Getmsg(fd int, cl []byte, data []byte) (retCl []byte, retData []byte, flags int, err error) { |
|
1053 var clp, datap *strbuf |
|
1054 if len(cl) > 0 { |
|
1055 clp = &strbuf{ |
|
1056 Maxlen: int32(len(cl)), |
|
1057 Buf: (*int8)(unsafe.Pointer(&cl[0])), |
|
1058 } |
|
1059 } |
|
1060 if len(data) > 0 { |
|
1061 datap = &strbuf{ |
|
1062 Maxlen: int32(len(data)), |
|
1063 Buf: (*int8)(unsafe.Pointer(&data[0])), |
|
1064 } |
|
1065 } |
|
1066 |
|
1067 if err = getmsg(fd, clp, datap, &flags); err != nil { |
|
1068 return nil, nil, 0, err |
|
1069 } |
|
1070 |
|
1071 if len(cl) > 0 { |
|
1072 retCl = cl[:clp.Len] |
|
1073 } |
|
1074 if len(data) > 0 { |
|
1075 retData = data[:datap.Len] |
|
1076 } |
|
1077 return retCl, retData, flags, nil |
|
1078 } |
|
1079 |
|
1080 func IoctlSetIntRetInt(fd int, req uint, arg int) (int, error) { |
|
1081 return ioctlRet(fd, req, uintptr(arg)) |
|
1082 } |
|
1083 |
|
1084 func IoctlSetString(fd int, req uint, val string) error { |
|
1085 bs := make([]byte, len(val)+1) |
|
1086 copy(bs[:len(bs)-1], val) |
|
1087 err := ioctl(fd, req, uintptr(unsafe.Pointer(&bs[0]))) |
|
1088 runtime.KeepAlive(&bs[0]) |
|
1089 return err |
|
1090 } |
|
1091 |
|
1092 // Lifreq Helpers |
|
1093 |
|
1094 func (l *Lifreq) SetName(name string) error { |
|
1095 if len(name) >= len(l.Name) { |
|
1096 return fmt.Errorf("name cannot be more than %d characters", len(l.Name)-1) |
|
1097 } |
|
1098 for i := range name { |
|
1099 l.Name[i] = int8(name[i]) |
|
1100 } |
|
1101 return nil |
|
1102 } |
|
1103 |
|
1104 func (l *Lifreq) SetLifruInt(d int) { |
|
1105 *(*int)(unsafe.Pointer(&l.Lifru[0])) = d |
|
1106 } |
|
1107 |
|
1108 func (l *Lifreq) GetLifruInt() int { |
|
1109 return *(*int)(unsafe.Pointer(&l.Lifru[0])) |
|
1110 } |
|
1111 |
|
1112 func (l *Lifreq) SetLifruUint(d uint) { |
|
1113 *(*uint)(unsafe.Pointer(&l.Lifru[0])) = d |
|
1114 } |
|
1115 |
|
1116 func (l *Lifreq) GetLifruUint() uint { |
|
1117 return *(*uint)(unsafe.Pointer(&l.Lifru[0])) |
|
1118 } |
|
1119 |
|
1120 func IoctlLifreq(fd int, req uint, l *Lifreq) error { |
|
1121 return ioctl(fd, req, uintptr(unsafe.Pointer(l))) |
|
1122 } |
|
1123 |
|
1124 // Strioctl Helpers |
|
1125 |
|
1126 func (s *Strioctl) SetInt(i int) { |
|
1127 s.Len = int32(unsafe.Sizeof(i)) |
|
1128 s.Dp = (*int8)(unsafe.Pointer(&i)) |
|
1129 } |
|
1130 |
|
1131 func IoctlSetStrioctlRetInt(fd int, req uint, s *Strioctl) (int, error) { |
|
1132 return ioctlRet(fd, req, uintptr(unsafe.Pointer(s))) |
|
1133 } |