xref: /haiku/src/system/libroot/posix/unistd/hostname.cpp (revision 5ac9b506412b11afb993bb52d161efe7666958a5)
1 /*
2  * Copyright 2002-2014, Axel Dörfler, axeld@pinc-software.de.
3  * Distributed under the terms of the MIT License.
4  */
5 
6 
7 #include <errno.h>
8 #include <fcntl.h>
9 #include <string.h>
10 #include <unistd.h>
11 
12 #include <FindDirectory.h>
13 #include <StorageDefs.h>
14 
15 #include <errno_private.h>
16 #include <find_directory_private.h>
17 
18 
19 static status_t
20 get_path(char *path, bool create)
21 {
22 	status_t status = __find_directory(B_SYSTEM_SETTINGS_DIRECTORY, -1, create,
23 		path, B_PATH_NAME_LENGTH);
24 	if (status != B_OK)
25 		return status;
26 
27 	strlcat(path, "/network", B_PATH_NAME_LENGTH);
28 	if (create)
29 		mkdir(path, 0755);
30 	strlcat(path, "/hostname", B_PATH_NAME_LENGTH);
31 	return B_OK;
32 }
33 
34 
35 extern "C" int
36 sethostname(const char *hostName, size_t nameSize)
37 {
38 	char path[B_PATH_NAME_LENGTH];
39 	if (get_path(path, false) != B_OK) {
40 		__set_errno(B_ERROR);
41 		return -1;
42 	}
43 
44 	int file = open(path, O_WRONLY | O_CREAT, 0644);
45 	if (file < 0)
46 		return -1;
47 
48 	nameSize = min_c(nameSize, MAXHOSTNAMELEN);
49 	ftruncate(file, nameSize + 1);
50 
51 	if (write(file, hostName, nameSize) != (ssize_t)nameSize
52 		|| write(file, "\n", 1) != 1) {
53 		close(file);
54 		return -1;
55 	}
56 
57 	close(file);
58 	return 0;
59 }
60 
61 
62 extern "C" int
63 gethostname(char *hostName, size_t nameSize)
64 {
65 	// look up hostname from network settings hostname file
66 
67 	char path[B_PATH_NAME_LENGTH];
68 	if (get_path(path, false) != B_OK) {
69 		__set_errno(B_ERROR);
70 		return -1;
71 	}
72 
73 	int file = open(path, O_RDONLY);
74 	if (file < 0)
75 		return -1;
76 
77 	nameSize = min_c(nameSize, MAXHOSTNAMELEN);
78 
79 	int length = read(file, hostName, nameSize - 1);
80 	close(file);
81 
82 	if (length < 0)
83 		return -1;
84 
85 	hostName[length] = '\0';
86 
87 	char *end = strpbrk(hostName, "\r\n\t");
88 	if (end != NULL)
89 		end[0] = '\0';
90 
91 	return 0;
92 }
93 
94