}
addr_.sun_family = AF_UNIX;
- snprintf(addr_.sun_path, sizeof(addr_.sun_path), "%s", path_.c_str());
+ // abstract namespace socket address should start with null character.
+ addr_.sun_path[0] = '\0';
+ snprintf(addr_.sun_path + 1, sizeof(addr_.sun_path) - 1, "%s", path_.c_str());
SetOption();
GetFdInfo();
return 0;
return -1;
}
- int ret =
- connect(fd_, reinterpret_cast<struct sockaddr*>(&addr_), sizeof(addr_));
+ // +1 for '\0' prefix (abstract namespace socket)
+ size_t len = offsetof(struct sockaddr_un, sun_path) + GetPath().length() + 1;
+ int ret = connect(fd_, reinterpret_cast<struct sockaddr*>(&addr_), len);
if (fcntl(fd_, F_SETFL, flags) != 0) {
LOG(ERROR) << "Failed to set flags: " << flags << " on fd: " << fd_
<< ", errno: " << errno;
ServerSocket::ServerSocket(std::string path) : AbstractSocket(std::move(path)) {
int n = sd_listen_fds(0);
+ char buf[108];
+ // prefix '\0' should be added to make it abstract namespace socket.
+ buf[0] = '\0';
+ snprintf(buf + 1, sizeof(buf) - 1, "%s", path_.c_str());
for (int i = SD_LISTEN_FDS_START; i < SD_LISTEN_FDS_START + n; ++i) {
- if (sd_is_socket_unix(i, SOCK_STREAM, 1, path_.c_str(), 0) > 0) {
+ if (sd_is_socket_unix(i, SOCK_STREAM, 1, buf, path_.size() + 1) > 0) {
fd_ = i;
break;
}
}
if (fd_ == -1) {
+ LOG(WARNING) << "Failed to find socket from systemd.";
if (Create() < 0) {
LOG(ERROR) << "Fail to create server socket. errno: " << errno;
return;
}
addr_.sun_family = AF_UNIX;
- snprintf(addr_.sun_path, sizeof(addr_.sun_path), "%s", path_.c_str());
+ addr_.sun_path[0] = '\0';
+ snprintf(addr_.sun_path + 1, sizeof(addr_.sun_path) - 1, "%s", path_.c_str());
if (access(path_.c_str(), F_OK) == 0) {
LOG(WARNING) << "socket is already in use : " << path_;
unlink(path_.c_str());
}
int ServerSocket::Bind() {
- return bind(fd_, reinterpret_cast<struct sockaddr*>(&addr_), sizeof(addr_));
+ size_t len = offsetof(struct sockaddr_un, sun_path) + path_.length() + 1;
+ return bind(fd_, reinterpret_cast<struct sockaddr*>(&addr_), len);
}
int ServerSocket::Listen() { return listen(fd_, 128); }