2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 * @file unix_socket.cpp
18 * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com)
20 * @brief This file is the implementation file of unix socket
23 #include <dpl/socket/unix_socket.h>
24 #include <dpl/log/log.h>
25 #include <dpl/exception.h>
27 #include <sys/socket.h>
40 UnixSocket::UnixSocket()
44 int UnixSocket::AllocSpecificDescriptor() const
46 LogPedantic("Creating UNIX socket...");
48 // Create new descriptor
49 int newSocket = socket(AF_UNIX, SOCK_STREAM, 0);
52 Throw(Exception::CreateFailed);
54 LogPedantic("UNIX socket created");
56 // Return new descriptor
60 std::pair<sockaddr *, socklen_t> UnixSocket::TranslateAddressGenericToSpecific(const Address &address) const
62 // Allocate new socket address structure
63 sockaddr_un *sockAddress = static_cast<sockaddr_un *>(malloc(sizeof(sockaddr_un)));
64 if (!sockAddress) throw std::bad_alloc();
66 memset(sockAddress, 0, sizeof(sockaddr_un));
68 // Copy address properties
69 sockAddress->sun_family = AF_UNIX;
70 strncpy(sockAddress->sun_path, address.GetAddress().c_str(), sizeof(sockAddress->sun_path) - 1);
71 sockAddress->sun_path[sizeof(sockAddress->sun_path) - 1] = '\0'; // Prevent buffer overflows
73 // Set proper address length
74 socklen_t sockAddressLength = SUN_LEN(sockAddress);
76 // Return new translated address
77 return std::make_pair(reinterpret_cast<sockaddr *>(sockAddress), sockAddressLength);
80 Address UnixSocket::TranslateAddressSpecificToGeneric(sockaddr *address, socklen_t) const
82 // FIXME: Constrain check ?
83 sockaddr_un *unixAddress = reinterpret_cast<sockaddr_un *>(address);
84 return Address(unixAddress->sun_path);
87 socklen_t UnixSocket::GetSpecificAddressSize() const
89 return static_cast<socklen_t>(sizeof(sockaddr_un));
92 UnixSocket *UnixSocket::AllocAcceptedSpecificSocket() const
94 return new UnixSocket();
97 void UnixSocket::Bind(const Address &address)
99 // Always remove socket file if any
100 unlink(address.GetAddress().c_str());
102 // Call base implementation
103 GenericSocket<UnixSocket>::Bind(address);
105 // Always set proper permissions to the socket file
106 if(chmod(address.GetAddress().c_str(), 0777)<0){
107 LogError("Error setting permissions to the socket file. Errno " << strerror(errno));