1 /*
2 * Copyright (c) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "LocalSocket.h"
17
18 #include <sys/ioctl.h>
19 #include <sys/socket.h>
20 #include <sys/types.h>
21 #include <sys/un.h>
22
23 #include "PreviewerEngineLog.h"
24
LocalSocket()25 LocalSocket::LocalSocket() : socketHandle(-1) {}
26
~LocalSocket()27 LocalSocket::~LocalSocket()
28 {
29 DisconnectFromServer();
30 }
31
ConnectToServer(std::string name,OpenMode openMode,TransMode transMode)32 bool LocalSocket::ConnectToServer(std::string name, OpenMode openMode, TransMode transMode)
33 {
34 (void)openMode;
35 (void)transMode;
36 struct sockaddr_un un;
37 un.sun_family = AF_UNIX;
38 std::size_t length = name.copy(un.sun_path, name.size());
39 un.sun_path[length] = '\0';
40 socketHandle = socket(AF_UNIX, SOCK_STREAM, 0);
41 if (socketHandle < 0) {
42 ELOG("Request socket failed");
43 return false;
44 }
45 struct sockaddr* sockun = reinterpret_cast<struct sockaddr*>(&un);
46 if (connect(socketHandle, sockun, sizeof(un)) < 0) {
47 ELOG("connect socket failed");
48 return false;
49 }
50
51 return true;
52 }
53
GetTracePipeName(std::string baseName) const54 std::string LocalSocket::GetTracePipeName(std::string baseName) const
55 {
56 return std::string("/tmp/") + baseName;
57 }
58
GetCommandPipeName(std::string baseName) const59 std::string LocalSocket::GetCommandPipeName(std::string baseName) const
60 {
61 return std::string("/tmp/") + baseName + "_commandPipe";
62 }
63
GetImagePipeName(std::string baseName) const64 std::string LocalSocket::GetImagePipeName(std::string baseName) const
65 {
66 return std::string("/tmp/") + baseName + "_imagePipe";
67 }
68
DisconnectFromServer()69 void LocalSocket::DisconnectFromServer()
70 {
71 shutdown(socketHandle, SHUT_RDWR);
72 }
73
ReadData(char * data,size_t length) const74 int64_t LocalSocket::ReadData(char* data, size_t length) const
75 {
76 if (length > UINT32_MAX) {
77 ELOG("LocalSocket::ReadData length must < %d", UINT32_MAX);
78 return -1;
79 }
80
81 int32_t bytes_read;
82 ioctl(socketHandle, FIONREAD, &bytes_read);
83
84 if (bytes_read <= 0) {
85 return 0;
86 }
87
88 int32_t readSize = recv(socketHandle, data, length, 0);
89 if (readSize == 0) {
90 ELOG("LocalSocket::ReadData Server is shut down");
91 }
92
93 if (readSize < 0) {
94 ELOG("LocalSocket::ReadData ReadFile failed");
95 }
96
97 return readSize;
98 }
99
WriteData(const void * data,size_t length) const100 size_t LocalSocket::WriteData(const void* data, size_t length) const
101 {
102 if (length > UINT32_MAX) {
103 ELOG("LocalSocket::WriteData length must < %d", UINT32_MAX);
104 return 0;
105 }
106 std::string str((const char*)data);
107 ssize_t writeSize = send(socketHandle, str.c_str(), length, 0);
108 if (writeSize == 0) {
109 ELOG("LocalSocket::WriteData Server is shut down");
110 }
111
112 if (writeSize < 0) {
113 ELOG("LocalSocket::WriteData ReadFile failed");
114 }
115
116 return writeSize;
117 }
118
operator >>(std::string & data) const119 const LocalSocket& LocalSocket::operator>>(std::string& data) const
120 {
121 char c = '\255';
122 while (c != '\0' && ReadData(&c, 1) > 0) {
123 data.push_back(c);
124 }
125 return *this;
126 }
127
operator <<(const std::string data) const128 const LocalSocket& LocalSocket::operator<<(const std::string data) const
129 {
130 WriteData(data.c_str(), data.length() + 1);
131 return *this;
132 }