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
22 #include <dpl/socket/unix_socket.h>
23 #include <dpl/log/log.h>
24 #include <dpl/exception.h>
26 #include <sys/socket.h>
38 UnixSocket::UnixSocket()
42 int UnixSocket::AllocSpecificDescriptor() const
44 LogPedantic("Creating UNIX socket...");
46 // Create new descriptor
47 int newSocket = socket(AF_UNIX, SOCK_STREAM, 0);
50 Throw(Exception::CreateFailed);
52 LogPedantic("UNIX socket created");
54 // Return new descriptor
58 std::pair<sockaddr *, socklen_t> UnixSocket::TranslateAddressGenericToSpecific(const Address &address) const
60 // Allocate new socket address structure
61 sockaddr_un *sockAddress = static_cast<sockaddr_un *>(malloc(sizeof(sockaddr_un)));
62 if (!sockAddress) throw std::bad_alloc();
64 memset(sockAddress, 0, sizeof(sockaddr_un));
66 // Copy address properties
67 sockAddress->sun_family = AF_UNIX;
68 strncpy(sockAddress->sun_path, address.GetAddress().c_str(), sizeof(sockAddress->sun_path) - 1);
69 sockAddress->sun_path[sizeof(sockAddress->sun_path) - 1] = '\0'; // Prevent buffer overflows
71 // Set proper address length
72 socklen_t sockAddressLength = SUN_LEN(sockAddress);
74 // Return new translated address
75 return std::make_pair(reinterpret_cast<sockaddr *>(sockAddress), sockAddressLength);
78 Address UnixSocket::TranslateAddressSpecificToGeneric(sockaddr *address, socklen_t) const
80 // FIXME: Constrain check ?
81 sockaddr_un *unixAddress = reinterpret_cast<sockaddr_un *>(address);
82 return Address(unixAddress->sun_path);
85 socklen_t UnixSocket::GetSpecificAddressSize() const
87 return static_cast<socklen_t>(sizeof(sockaddr_un));
90 UnixSocket *UnixSocket::AllocAcceptedSpecificSocket() const
92 return new UnixSocket();
95 void UnixSocket::Bind(const Address &address)
97 // Always remove socket file if any
98 unlink(address.GetAddress().c_str());
100 // Call base implementation
101 GenericSocket<UnixSocket>::Bind(address);
103 // Always set proper permissions to the socket file
104 chmod(address.GetAddress().c_str(), 0777);