コード例 #1
0
        private static void authenticate(SocketOperations socketOperations)
        {
            var authExternal = "\0AUTH EXTERNAL ";

            var stringUid = $"{socketOperations.Uid}";
            var uidBytes  = Encoding.ASCII.GetBytes(stringUid);

            foreach (var b in uidBytes)
            {
                authExternal += $"{b:X}";
            }
            socketOperations.WriteLine(authExternal);

            var line = socketOperations.ReadLine();

            if (!line.StartsWith("OK "))
            {
                throw new InvalidOperationException("Authentication failed: " + line);
            }

            socketOperations.WriteLine("NEGOTIATE_UNIX_FD");

            line = socketOperations.ReadLine();
            if (line != "AGREE_UNIX_FD")
            {
                throw new InvalidOperationException("Missing support for unix file descriptors");
            }

            socketOperations.WriteLine("BEGIN");
        }
コード例 #2
0
        private Connection(SocketOperations socketOperations)
        {
            this.socketOperations = socketOperations;

            semaphoreSend      = new SemaphoreSlim(1);
            receiveCts         = new CancellationTokenSource();
            orgFreedesktopDbus = new OrgFreedesktopDbus(this);

            receiveTask = Task.Factory.StartNew(
                receive,
                receiveCts.Token,
                TaskCreationOptions.LongRunning,
                TaskScheduler.Default
                );
        }
コード例 #3
0
        public async static Task <Connection> CreateAsync(
            DbusConnectionOptions options,
            CancellationToken cancellationToken = default
            )
        {
            if (options.Address == null)
            {
                throw new ArgumentException("No dbus address specified", nameof(options));
            }
            var sockaddr         = createSockaddr(options.Address);
            var socketOperations = new SocketOperations(sockaddr);

            await Task.Run(() => authenticate(socketOperations), cancellationToken).ConfigureAwait(false);

            var result = new Connection(socketOperations);
            await result.orgFreedesktopDbus.HelloAsync(cancellationToken).ConfigureAwait(false);

            return(result);
        }
コード例 #4
0
ファイル: UnixFdStream.cs プロジェクト: xyz8808/DbusCore
 public UnixFdStream(SafeHandle safeHandle, SocketOperations socketOperations)
 {
     this.safeHandle       = safeHandle;
     this.socketOperations = socketOperations;
     socketOperations.SetNonblocking(safeHandle);
 }
コード例 #5
0
        public MessageHeader(
            SocketOperations socketOperations,
            Decoder header,
            ReadOnlySpan <byte> controlBytes,
            bool isMonoRuntime
            )
        {
            this.socketOperations = socketOperations;
            BodySignature         = "";
            while (!header.IsFinished)
            {
                var typeCode = (DbusHeaderType)header.GetByte();
                header.GetSignature(); // variant signature
                switch (typeCode)
                {
                case DbusHeaderType.Path:
                    Path = header.GetObjectPath();
                    break;

                case DbusHeaderType.InterfaceName:
                    InterfaceName = header.GetString();
                    break;

                case DbusHeaderType.Member:
                    Member = header.GetString();
                    break;

                case DbusHeaderType.ErrorName:
                    ErrorName = header.GetString();
                    break;

                case DbusHeaderType.ReplySerial:
                    ReplySerial = header.GetUInt32();
                    break;

                case DbusHeaderType.Destination:
                    Destination = header.GetString();
                    break;

                case DbusHeaderType.Sender:
                    Sender = header.GetString();
                    break;

                case DbusHeaderType.Signature:
                    BodySignature = header.GetSignature();
                    break;

                case DbusHeaderType.UnixFds:
                    var numberOfFds = header.GetUInt32();

                    var cmsgHeaderBytes = controlBytes.Slice(0, sizeofCmsghdr);
                    var cmsgHeader      = MemoryMarshal.Cast <byte, cmsghdr>(cmsgHeaderBytes);

                    var fileDescriptorsBytes = controlBytes.Slice(
                        sizeofCmsghdr,
                        (int)cmsgHeader[0].len - sizeofCmsghdr
                        );
                    var fileDescriptors = MemoryMarshal.Cast <byte, int>(fileDescriptorsBytes);
                    System.Diagnostics.Debug.Assert(numberOfFds == fileDescriptors.Length);

                    UnixFds = new SafeHandle[numberOfFds];
                    for (var i = 0; i < numberOfFds; ++i)
                    {
                        if (isMonoRuntime)
                        {
                            UnixFds[i] = new ReceivedFileDescriptorSafeHandle(fileDescriptors[i]);
                        }
                        else
                        {
                            UnixFds[i] = new SafeFileHandle(new IntPtr(fileDescriptors[i]), true);
                        }
                    }
                    break;
                }
                header.AdvanceToCompoundValue();
            }
        }