public void SockaddrIn6Test() { if (!Socket.OSSupportsIPv6) { Assert.Ignore("OS does not support IPv6."); } var address1 = new SockaddrIn6 { sin6_family = UnixAddressFamily.AF_INET6, sin6_port = Syscall.htons(1234), sin6_flowinfo = 2, sin6_addr = NativeConvert.ToIn6Addr(IPAddress.IPv6Loopback), sin6_scope_id = 3 }; var storage = address1.ToSockaddrStorage(); var address2 = SockaddrIn6.FromSockaddrStorage(storage); Assert.AreEqual(address1, address2); var sockaddr = Sockaddr.FromSockaddrStorage(storage); Assert.AreEqual(sockaddr.sa_family, address1.sa_family); Assert.AreEqual("{sin6_family=AF_INET6, sin6_port=htons(1234), sin6_flowinfo=2, sin6_addr=::1, sin6_scope_id=3}", address1.ToString()); }
public void should_set_file_permissions() { var tempFile = GetTempFilePath(); File.WriteAllText(tempFile, "File1"); SetWritePermissions(tempFile, false); // Verify test setup Syscall.stat(tempFile, out var fileStat); NativeConvert.ToOctalPermissionString(fileStat.st_mode).Should().Be("0444"); Subject.SetPermissions(tempFile, "644"); Syscall.stat(tempFile, out fileStat); NativeConvert.ToOctalPermissionString(fileStat.st_mode).Should().Be("0644"); Subject.SetPermissions(tempFile, "0644"); Syscall.stat(tempFile, out fileStat); NativeConvert.ToOctalPermissionString(fileStat.st_mode).Should().Be("0644"); if (OsInfo.Os != Os.Bsd) { // This is not allowed on BSD Subject.SetPermissions(tempFile, "1664"); Syscall.stat(tempFile, out fileStat); NativeConvert.ToOctalPermissionString(fileStat.st_mode).Should().Be("1664"); } }
static internal void SetStatInfo(Entry entry, ref Stat stat) { stat.st_mode = NativeConvert.FromOctalPermissionString("0444"); switch (entry.Kind) { case EntryKind.Directory: case EntryKind.ZipDirectoryEntry: case EntryKind.ZipFile: stat.st_mode |= FilePermissions.S_IFDIR | NativeConvert.FromOctalPermissionString("0222"); stat.st_nlink = 2 + ((entry.Node != null) ? (ulong)GetEntriesCount(entry.Node, new EntryKind[] { EntryKind.Directory, EntryKind.ZipFile, EntryKind.ZipDirectoryEntry }) : 0); break; case EntryKind.File: stat.st_mode |= FilePermissions.S_IFLNK | NativeConvert.FromOctalPermissionString("0777"); stat.st_nlink = 1; break; case EntryKind.ZipFileEntry: stat.st_mode |= FilePermissions.S_IFREG; stat.st_nlink = 1; break; } stat.st_size = entry.Size; stat.st_mtime = NativeConvert.FromDateTime(entry.LastWriteTime); }
public void SockaddrInTest() { var address1 = new SockaddrIn { sin_family = UnixAddressFamily.AF_INET, sin_port = Syscall.htons(5678), sin_addr = NativeConvert.ToInAddr(IPAddress.Loopback), }; var storage = address1.ToSockaddrStorage(); var address2 = SockaddrIn.FromSockaddrStorage(storage); Assert.AreEqual(address1, address2); var sockaddr = Sockaddr.FromSockaddrStorage(storage); Assert.AreEqual(sockaddr.sa_family, address1.sa_family); var storage2 = storage.ToSockaddrStorage(); Assert.AreEqual(storage, storage2); var storage3 = new SockaddrStorage(123); storage2.CopyTo(storage3); Assert.AreEqual(storage, storage3); Assert.AreEqual("{sin_family=AF_INET, sin_port=htons(5678), sin_addr=127.0.0.1}", address1.ToString()); }
private static int EventSystemGroupMemberDecrease(int subType, int sendTime, long fromGroup, long fromQQ, long beingOperateQQ) { CqGroupMemberDecreaseEventArgs args = new CqGroupMemberDecreaseEventArgs(); args.SendTime = NativeConvert.FotmatUnixTime(sendTime.ToString()); args.FromGroup = fromGroup; args.FromQQ = fromQQ; args.BeingOperateQQ = beingOperateQQ; args.Handler = false; if (subType == 1) // 群员离开 { args.FromQQ = beingOperateQQ; // 此时 FormQQ 为操作者QQ ReceiveMemberLeave(null, args); } else if (subType == 2) { ReceiveMemberRemove(null, args); } else { Common.CqApi.AddLoger(LogerLevel.Info, "Native提示", "EventSystemGroupMemberDecrease 方法发现新的消息类型"); } return((int)(args.Handler ? MessageHanding.Intercept : MessageHanding.Ignored)); //如果处理过就截断消息 }
public void should_set_folder_permissions() { var tempPath = GetTempFilePath(); Directory.CreateDirectory(tempPath); SetWritePermissions(tempPath, false); // Verify test setup Syscall.stat(tempPath, out var fileStat); NativeConvert.ToOctalPermissionString(fileStat.st_mode).Should().Be("0555"); Subject.SetPermissions(tempPath, "644"); Syscall.stat(tempPath, out fileStat); NativeConvert.ToOctalPermissionString(fileStat.st_mode).Should().Be("0755"); Subject.SetPermissions(tempPath, "0644"); Syscall.stat(tempPath, out fileStat); NativeConvert.ToOctalPermissionString(fileStat.st_mode).Should().Be("0755"); Subject.SetPermissions(tempPath, "1664"); Syscall.stat(tempPath, out fileStat); NativeConvert.ToOctalPermissionString(fileStat.st_mode).Should().Be("1775"); Subject.SetPermissions(tempPath, "775"); Syscall.stat(tempPath, out fileStat); NativeConvert.ToOctalPermissionString(fileStat.st_mode).Should().Be("0775"); Subject.SetPermissions(tempPath, "640"); Syscall.stat(tempPath, out fileStat); NativeConvert.ToOctalPermissionString(fileStat.st_mode).Should().Be("0750"); Subject.SetPermissions(tempPath, "0041"); Syscall.stat(tempPath, out fileStat); NativeConvert.ToOctalPermissionString(fileStat.st_mode).Should().Be("0051"); }
public override bool IsValidFolderPermissionMask(string mask) { try { var permissions = NativeConvert.FromOctalPermissionString(mask); if ((permissions & ~FilePermissions.ACCESSPERMS) != 0) { // Only allow access permissions return(false); } if ((permissions & FilePermissions.S_IRWXU) != FilePermissions.S_IRWXU) { // We expect at least full owner permissions (700) return(false); } return(true); } catch (FormatException) { return(false); } }
protected override Errno OnGetPathStatus(string path, out Stat stbuf) { Trace.WriteLine("(OnGetPathStatus {0})", path); stbuf = new Stat(); switch (path) { case "/": stbuf.st_mode = FilePermissions.S_IFDIR | NativeConvert.FromOctalPermissionString("0755"); stbuf.st_nlink = 2; return(0); case hello_path: case data_path: case data_im_path: stbuf.st_mode = FilePermissions.S_IFREG | NativeConvert.FromOctalPermissionString("0444"); stbuf.st_nlink = 1; int size = 0; switch (path) { case hello_path: size = hello_str.Length; break; case data_path: case data_im_path: size = data_size; break; } stbuf.st_size = size; return(0); default: return(Errno.ENOENT); } }
protected override Errno OnGetPathStatus(string path, out Stat stbuf) { var pathSegments = path.Split('/', StringSplitOptions.RemoveEmptyEntries).AsMemory(); var parentDir = pathSegments.Length < 2 ? Trie : Trie.TryFindDirectory(pathSegments.Slice(0, pathSegments.Length - 1)); var file = pathSegments.Length > 0 ? parentDir?.TryFindFile(pathSegments.Span[pathSegments.Length - 1]) : null; var dir = pathSegments.Length > 0 ? parentDir?.TryFindDirectory(pathSegments.Span[pathSegments.Length - 1]) : parentDir; if (dir != null) { stbuf = new Stat { st_mode = FilePermissions.S_IFDIR | NativeConvert.FromOctalPermissionString("0755"), st_nlink = 2 }; return(0); } if (file != null) { stbuf = new Stat { st_mode = FilePermissions.S_IFREG | NativeConvert.FromOctalPermissionString("0444"), st_nlink = 1, st_size = file.Length }; return(0); } stbuf = new Stat(); return(Errno.ENOENT); }
public void IPv6() { if (!Socket.OSSupportsIPv6) { Assert.Ignore("OS does not support IPv6."); } var address = new SockaddrIn6 { sin6_family = UnixAddressFamily.AF_INET6, sin6_port = Syscall.htons(0), sin6_addr = NativeConvert.ToIn6Addr(IPAddress.IPv6Loopback), }; WithSockets(UnixAddressFamily.AF_INET6, UnixSocketType.SOCK_STREAM, 0, (so1, so2) => { if (Syscall.bind(so1, address) < 0) { UnixMarshal.ThrowExceptionForLastError(); } var address1Stor = new SockaddrStorage(); if (Syscall.getsockname(so1, address1Stor) < 0) { UnixMarshal.ThrowExceptionForLastError(); } var address1 = new SockaddrIn6(); address1Stor.CopyTo(address1); // Check getsockname(socket, null) if (Syscall.getsockname(so1, null) < 0) { UnixMarshal.ThrowExceptionForLastError(); } var address2 = new SockaddrIn6(); if (Syscall.getsockname(so1, address2) < 0) { UnixMarshal.ThrowExceptionForLastError(); } Assert.AreEqual(address1, address2); Assert.IsTrue(Syscall.ntohs(address1.sin6_port) != 0); address1.sin6_port = 0; Assert.AreEqual(address, address1); var address3 = new Sockaddr(); if (Syscall.getsockname(so1, address3) < 0) { UnixMarshal.ThrowExceptionForLastError(); } Assert.AreEqual(address.sa_family, address3.sa_family); // Try to store a sockaddr_in6 into a Sockaddr. Should fail because sockaddr_in6 should be larger than sockaddr_in var address4 = new SockaddrIn(); if (Syscall.getsockname(so1, address4) == 0) { Assert.Fail("getsockname() should have failed"); } Assert.AreEqual(Errno.ENOBUFS, Stdlib.GetLastError()); }); }
public int _OnLockHandle(string file, IntPtr fi, int cmd, IntPtr lockp) { Errno errno; try { PathInfo info = new PathInfo(); PathInfo.CopyFromPtr(fi, info); FcntlCommand _cmd = NativeConvert.ToFcntlCommand(cmd); Flock @lock; Interop.CopyFlock(lockp, out @lock); errno = _filesystem.OnLockHandle(file, info, _cmd, ref @lock); if (errno == 0) { Interop.CopyFlock(ref @lock, lockp); PathInfo.CopyToPtr(info, fi); } } catch (Exception e) { Trace.WriteLine(e.ToString()); errno = Errno.EIO; } return(Interop.ConvertErrno(errno)); }
public UnixSocket(string path, uint?permissions) : this(CreateEndPoint(path)) { if (path == null) { throw new ArgumentNullException("path"); } this.path = path; try { if (path.StartsWith("\0")) { inode = null; } else { inode = new UnixFileInfo(path).Inode; if (permissions != null) { Syscall.chmod(path, NativeConvert.ToFilePermissions(permissions.Value)); } } } catch (InvalidOperationException) { Logger.Write(LogLevel.Error, "Path \"{0}\" doesn't exist?", path); throw; } }
protected override Errno OnGetPathStatus(string path, out Stat stat) { stat = new Stat(); if (path == "/") { DirectoryInfo di = new DirectoryInfo(Source); stat.st_mode = FilePermissions.S_IFDIR | NativeConvert.FromOctalPermissionString("0666"); stat.st_size = (4096 * (long)Math.Ceiling(walker.RootNode.Nodes.Count * 0.1)); stat.st_mtime = NativeConvert.FromDateTime(di.LastWriteTime); stat.st_nlink = 2 + (ulong)Helpers.GetEntriesCount(walker.RootNode, new EntryKind[] { EntryKind.Directory, EntryKind.ZipFile, EntryKind.ZipDirectoryEntry }); } else { try { Entry fsEntry = walker.SearchEntry(path.Substring(1)); if (fsEntry == null) { return(Errno.ENOENT); } Helpers.SetStatInfo(fsEntry, ref stat); } catch (DirectoryNotFoundException) { return(Errno.ENOTDIR); } catch (IOException) { return(Errno.EIO); } } return(0); }
private static string ToFopenMode(string file, FileMode mode) { string fopenMode = NativeConvert.ToFopenMode(mode); StdioFileStream.AssertFileMode(file, mode); return(fopenMode); }
public override bool IsValidFilePermissionMask(string mask) { try { var permissions = NativeConvert.FromOctalPermissionString(mask); if ((permissions & (FilePermissions.S_ISUID | FilePermissions.S_ISGID | FilePermissions.S_ISVTX)) != 0) { return(false); } if ((permissions & (FilePermissions.S_IXUSR | FilePermissions.S_IXGRP | FilePermissions.S_IXOTH)) != 0) { return(false); } if ((permissions & (FilePermissions.S_IRUSR | FilePermissions.S_IWUSR)) != (FilePermissions.S_IRUSR | FilePermissions.S_IWUSR)) { return(false); } return(true); } catch (FormatException) { return(false); } }
private static int EventRequestAddGroup(int subType, int sendTime, long fromGroup, long fromQQ, IntPtr msg, string responseFlag) { GroupAddRequestEventArgs args = new GroupAddRequestEventArgs(); args.SendTime = NativeConvert.FotmatUnixTime(sendTime.ToString()); args.FromGroup = fromGroup; args.FromQQ = fromQQ; args.AppendMsg = NativeConvert.ToPtrString(msg, Encoding.GetEncoding("GB18030")); args.Tag = responseFlag; args.Handled = false; if (subType == 1) // 申请加入群 { ReceiveGroupAddApply(null, args); } else if (subType == 2) // 机器人被邀请 { ReceiveGroupAddInvitee(null, args); } else { Common.CqApi.AddLoger(LogerLevel.Info, "Native提示", "EventRequestAddGroup 方法发现新的消息类型"); } return(0); }
private static int EventGroupMsg(int subType, int msgId, long fromGroup, long fromQQ, string fromAnonymous, IntPtr msg, int font) { GroupMessageEventArgs args = new GroupMessageEventArgs(); args.MsgId = msgId; args.FromGroup = fromGroup; args.FromQQ = fromQQ; args.Msg = NativeConvert.ToPtrString(msg, Encoding.GetEncoding("GB18030")); args.FromAnonymous = null; args.IsAnonymousMsg = false; args.Handled = false; if (fromQQ == 80000000 && !string.IsNullOrEmpty(fromAnonymous)) { args.FromAnonymous = Common.CqApi.GetAnonymous(fromAnonymous); //获取匿名成员信息 args.IsAnonymousMsg = true; } if (subType == 1) // 群消息 { ReceiveGroupMessage(null, args); } else // 其它类型 { Common.CqApi.AddLoger(LogerLevel.Info, "Native提示", "EventGroupMsg 方法发现新的消息类型"); } return((int)(args.Handled ? MessageHanding.Intercept : MessageHanding.Ignored)); //如果处理过就截断消息 }
private static int EventSystemGroupMemberIncrease(int subType, int sendTime, long fromGroup, long fromQQ, long beingOperateQQ) { GroupMemberAlterEventArgs args = new GroupMemberAlterEventArgs(); args.SendTime = NativeConvert.FotmatUnixTime(sendTime.ToString()); args.FromGroup = fromGroup; args.FromQQ = fromQQ; args.BeingOperateQQ = beingOperateQQ; args.Handled = false; if (subType == 1) // 管理员同意 { ReceiveMemberJoin(null, args); } else if (subType == 2) // 管理员邀请 { ReceiveMemberInvitee(null, args); } else { Common.CqApi.AddLoger(LogerLevel.Info, "Native提示", "EventSystemGroupMemberIncrease 方法发现新的消息类型"); } return((int)(args.Handled ? MessageHanding.Intercept : MessageHanding.Ignored)); //如果处理过就截断消息 }
public void should_clear_setgid_on_set_folder_permissions() { var tempPath = GetTempFilePath(); Directory.CreateDirectory(tempPath); SetWritePermissionsInternal(tempPath, false, true); _tempPath = tempPath; // Verify test setup Syscall.stat(tempPath, out var fileStat); NativeConvert.ToOctalPermissionString(fileStat.st_mode).Should().Be("2555"); Subject.SetPermissions(tempPath, "0755", null); Syscall.stat(tempPath, out fileStat); NativeConvert.ToOctalPermissionString(fileStat.st_mode).Should().Be("0755"); Subject.SetPermissions(tempPath, "0775", null); Syscall.stat(tempPath, out fileStat); NativeConvert.ToOctalPermissionString(fileStat.st_mode).Should().Be("0775"); Subject.SetPermissions(tempPath, "0750", null); Syscall.stat(tempPath, out fileStat); NativeConvert.ToOctalPermissionString(fileStat.st_mode).Should().Be("0750"); Subject.SetPermissions(tempPath, "0051", null); Syscall.stat(tempPath, out fileStat); NativeConvert.ToOctalPermissionString(fileStat.st_mode).Should().Be("0051"); }
private static int EventPrivateMsg(int subType, int msgId, long fromQQ, IntPtr msg, int font) { PrivateMessageEventArgs args = new PrivateMessageEventArgs(); args.MsgId = msgId; args.FromQQ = fromQQ; args.Msg = NativeConvert.ToPtrString(msg, Encoding.GetEncoding("GB18030")); args.Handled = false; if (subType == 11) // 来自好友 { ReceiveFriendMessage(null, args); } else if (subType == 1) // 来自在线状态 { ReceiveQnlineStatusMessage(null, args); } else if (subType == 2) // 来自群 { ReceiveGroupPrivateMessage(null, args); } else if (subType == 3) // 来自讨论组 { ReceiveDiscussPrivateMessage(null, args); } else { Common.CqApi.AddLoger(LogerLevel.Info, "Native提示", "EventPrivateMsg 方法发现新的消息类型"); } return((int)(args.Handled ? MessageHanding.Intercept : MessageHanding.Ignored)); //如果处理过就截断消息 }
public void Signal() { SignalTest st = new SignalTest(); // Insert handler SignalHandler oh = Stdlib.signal(Signum.SIGURG, new SignalHandler(st.Handler)); st.signalReceived = ~NativeConvert.FromSignum(Signum.SIGURG); // Send signal Stdlib.raise(Signum.SIGURG); Assert.IsTrue( NativeConvert.ToSignum(st.signalReceived) == Signum.SIGURG, "#IH: Signal handler not invoked for SIGURG"); // Reset old signal Stdlib.signal(Signum.SIGURG, oh); st.signalReceived = NativeConvert.FromSignum(Signum.SIGUSR1); Stdlib.raise(Signum.SIGURG); Assert.IsFalse(NativeConvert.ToSignum(st.signalReceived) == Signum.SIGURG, "#IH: Signal Handler invoked when it should have been removed!"); }
/// <summary> /// 获取群成员信息 /// </summary> /// <param name="groupId">目标群</param> /// <param name="qqId">目标QQ</param> /// <param name="member">如果成功, 返回群成员信息</param> /// <param name="notCache">默认为 "Flase", 通常忽略本参数, 仅在必要的是否使用</param> /// <returns>成功返回 0, 失败返回 负数</returns> public int GetMemberInfo(long groupId, long qqId, out GroupMember member, bool notCache = false) { string result = CQP.CQ_getGroupMemberInfoV2(_authCode, groupId, qqId, notCache); if (string.IsNullOrEmpty(result)) { member = null; return(-1000); } #region --其它_转换_文本到群成员信息-- member = new GroupMember(); UnPack unpack = new UnPack(Convert.FromBase64String(result)); member.GroupId = unpack.GetInt64(); member.QQId = unpack.GetInt64(); member.Nick = unpack.GetString(Encoding.GetEncoding("GB18030")); member.Card = unpack.GetString(Encoding.GetEncoding("GB18030")); member.Sex = (Sex)unpack.GetInt32(); member.Age = unpack.GetInt32(); member.Area = unpack.GetString(Encoding.GetEncoding("GB18030")); member.JoiningTime = NativeConvert.FotmatUnixTime(unpack.GetInt32().ToString()); member.LastDateTime = NativeConvert.FotmatUnixTime(unpack.GetInt32().ToString()); member.Level = unpack.GetString(Encoding.GetEncoding("GB18030")); member.PermitType = (PermitType)unpack.GetInt32(); member.BadRecord = unpack.GetInt32() == 1; member.SpecialTitle = unpack.GetString(Encoding.GetEncoding("GB18030")); member.SpecialTitleDurationTime = NativeConvert.FotmatUnixTime(unpack.GetInt32().ToString()); member.CanModifiedCard = unpack.GetInt32() == 1; #endregion return(0); }
public static SocketError?ErrorToSocketError(int errno) { var err = NativeConvert.ToErrno(errno); switch (err) { case Errno.EAFNOSUPPORT: return(SocketError.AddressFamilyNotSupported); case Errno.EMFILE: case Errno.ENFILE: return(SocketError.TooManyOpenSockets); case Errno.EPROTONOSUPPORT: return(SocketError.ProtocolNotSupported); case Errno.EPROTOTYPE: return(SocketError.ProtocolType); case Errno.EOPNOTSUPP: return(SocketError.OperationNotSupported); case Errno.ENOTCONN: return(SocketError.NotConnected); case Errno.EADDRINUSE: return(SocketError.AddressAlreadyInUse); case Errno.EADDRNOTAVAIL: return(SocketError.AddressNotAvailable); case Errno.EISCONN: return(SocketError.IsConnected); case Errno.ECONNRESET: return(SocketError.ConnectionReset); case Errno.ENETDOWN: return(SocketError.NetworkDown); case Errno.EHOSTUNREACH: return(SocketError.HostUnreachable); case Errno.ENETUNREACH: return(SocketError.NetworkUnreachable); case Errno.EALREADY: return(SocketError.AlreadyInProgress); case Errno.ECONNREFUSED: return(SocketError.ConnectionRefused); case Errno.ETIMEDOUT: return(SocketError.TimedOut); default: return(null); } }
/// <summary> /// 置群成员专属头衔 /// </summary> /// <param name="groupId">目标群</param> /// <param name="qqId">目标QQ</param> /// <param name="specialTitle">如果要删除,这里填空</param> /// <param name="time">专属头衔有效期,单位为秒。如果永久有效,time填写负数</param> /// <returns></returns> public int SetGroupSpecialTitle(long groupId, long qqId, string specialTitle, TimeSpan time) { if (time.Ticks < 0) { time = new TimeSpan(-10000000); //-1秒 } return(CQP.CQ_setGroupSpecialTitle(_authCode, groupId, qqId, NativeConvert.ToStringPtr(specialTitle, Encoding.GetEncoding("GB18030")), (long)time.TotalSeconds)); }
/// <summary> /// 置好友添加请求 /// </summary> /// <param name="tag">请求反馈标识</param> /// <param name="response">反馈类型</param> /// <param name="appendMsg">备注</param> /// <returns></returns> public int SetFriendAddRequest(string tag, ResponseType response, string appendMsg) { if (appendMsg == null) { appendMsg = string.Empty; } return(CQP.CQ_setFriendAddRequest(_authCode, tag, (int)response, NativeConvert.ToStringPtr(appendMsg, Encoding.GetEncoding("GB18030")))); }
public static void CopyFlock(ref Flock source, IntPtr dest) { if (!NativeConvert.TryCopy(ref source, dest)) { throw new ArgumentOutOfRangeException( "Unable to copy Mono.Unix.Native.Flock into `struct flock'."); } }
public static void CopyFlock(IntPtr source, out Flock dest) { if (!NativeConvert.TryCopy(source, out dest)) { throw new ArgumentOutOfRangeException( "Unable to copy `struct flock' into Mono.Unix.Native.Flock."); } }
public static void CopyStatvfs(ref Statvfs source, IntPtr dest) { if (!NativeConvert.TryCopy(ref source, dest)) { throw new ArgumentOutOfRangeException( "Unable to copy Mono.Unix.Native.Statvfs into `struct statvfs'."); } }
public static void CopyStatvfs(IntPtr source, out Statvfs dest) { if (!NativeConvert.TryCopy(source, out dest)) { throw new ArgumentOutOfRangeException( "Unable to copy `struct statvfs' into Mono.Unix.Native.Statvfs."); } }
public static void CopyUtimbuf(ref Utimbuf source, IntPtr dest) { if (!NativeConvert.TryCopy(ref source, dest)) { throw new ArgumentOutOfRangeException( "Unable to copy Mono.Unix.Native.Utimbuf into `struct utimbuf'."); } }