* Implemented gethostname() and sethostname().
* uname() now calls gethostname() instead of using a hard-coded value. * This fixes bug #1250. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22492 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
173d0b2fc7
commit
6030b585aa
@ -1,15 +1,17 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2004, Jérôme Duval jerome.duval@free.fr. All rights reserved.
|
* Copyright 2004-2007, Jérôme Duval jerome.duval@free.fr. All rights reserved.
|
||||||
* Distributed under the terms of the MIT License.
|
* Distributed under the terms of the MIT License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include <OS.h>
|
|
||||||
|
|
||||||
#include <sys/utsname.h>
|
#include <sys/utsname.h>
|
||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include <OS.h>
|
||||||
|
|
||||||
|
|
||||||
// Haiku SVN revision. Will be set when copying libroot.so to the image.
|
// Haiku SVN revision. Will be set when copying libroot.so to the image.
|
||||||
@ -61,8 +63,8 @@ uname(struct utsname *info)
|
|||||||
}
|
}
|
||||||
strlcpy(info->machine, platform, sizeof(info->machine));
|
strlcpy(info->machine, platform, sizeof(info->machine));
|
||||||
|
|
||||||
// TODO fill nodename field when we have hostname info
|
if (gethostname(info->nodename, sizeof(info->nodename)) != 0)
|
||||||
strlcpy(info->nodename, "unknown", sizeof(info->nodename));
|
strlcpy(info->nodename, "unknown", sizeof(info->nodename));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -14,7 +14,7 @@ MergeObject posix_unistd.o :
|
|||||||
_exit.c
|
_exit.c
|
||||||
fcntl.c
|
fcntl.c
|
||||||
fork.c
|
fork.c
|
||||||
hostname.c
|
hostname.cpp
|
||||||
ioctl.c
|
ioctl.c
|
||||||
link.c
|
link.c
|
||||||
lseek.c
|
lseek.c
|
||||||
|
@ -1,26 +0,0 @@
|
|||||||
/*
|
|
||||||
** Copyright 2002, Axel Dörfler, axeld@pinc-software.de. All rights reserved.
|
|
||||||
** Distributed under the terms of the OpenBeOS License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <syscalls.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <errno.h>
|
|
||||||
|
|
||||||
|
|
||||||
int
|
|
||||||
sethostname(const char *hostName, size_t nameSize)
|
|
||||||
{
|
|
||||||
return EPERM;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int
|
|
||||||
gethostname(char *hostName, size_t nameSize)
|
|
||||||
{
|
|
||||||
strlcpy(hostName, "beast", nameSize);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
89
src/system/libroot/posix/unistd/hostname.cpp
Normal file
89
src/system/libroot/posix/unistd/hostname.cpp
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2002-2007, Axel Dörfler, axeld@pinc-software.de. All rights reserved.
|
||||||
|
* Distributed under the terms of the MIT License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include <FindDirectory.h>
|
||||||
|
#include <StorageDefs.h>
|
||||||
|
|
||||||
|
|
||||||
|
static status_t
|
||||||
|
get_path(char *path, bool create)
|
||||||
|
{
|
||||||
|
status_t status = find_directory(B_COMMON_SETTINGS_DIRECTORY, -1, create,
|
||||||
|
path, B_PATH_NAME_LENGTH);
|
||||||
|
if (status != B_OK)
|
||||||
|
return status;
|
||||||
|
|
||||||
|
strlcat(path, "/network", B_PATH_NAME_LENGTH);
|
||||||
|
if (create)
|
||||||
|
mkdir(path, 0755);
|
||||||
|
strlcat(path, "/hostname", B_PATH_NAME_LENGTH);
|
||||||
|
return B_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
extern "C" int
|
||||||
|
sethostname(const char *hostName, size_t nameSize)
|
||||||
|
{
|
||||||
|
char path[B_PATH_NAME_LENGTH];
|
||||||
|
if (get_path(path, false) != B_OK) {
|
||||||
|
errno = B_ERROR;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int file = open(path, O_WRONLY | O_CREAT, 0644);
|
||||||
|
if (file < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
nameSize = min_c(nameSize, MAXHOSTNAMELEN);
|
||||||
|
|
||||||
|
if (write(file, hostName, nameSize) != (ssize_t)nameSize
|
||||||
|
|| write(file, "\n", 1) != 1) {
|
||||||
|
close(file);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
close(file);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
extern "C" int
|
||||||
|
gethostname(char *hostName, size_t nameSize)
|
||||||
|
{
|
||||||
|
// look up hostname from network settings hostname file
|
||||||
|
|
||||||
|
char path[B_PATH_NAME_LENGTH];
|
||||||
|
if (get_path(path, false) != B_OK) {
|
||||||
|
errno = B_ERROR;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int file = open(path, O_RDONLY);
|
||||||
|
if (file < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
nameSize = min_c(nameSize, MAXHOSTNAMELEN);
|
||||||
|
|
||||||
|
int length = read(file, hostName, nameSize - 1);
|
||||||
|
close(file);
|
||||||
|
|
||||||
|
if (length < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
hostName[length] = '\0';
|
||||||
|
|
||||||
|
char *end = strpbrk(hostName, "\r\n\t");
|
||||||
|
if (end != NULL)
|
||||||
|
end[0] = '\0';
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user