1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 00:48:11 +00:00

Kernel: Added the ability to set the hostname via new syscall

Userland/hostname: Now takes parameter to set the hostname
LibC/unistd: Added sethostname function
This commit is contained in:
Luke Payne 2020-04-26 15:59:47 +10:00 committed by Andreas Kling
parent 03f68a51af
commit f191b84b50
7 changed files with 40 additions and 9 deletions

View file

@ -712,6 +712,18 @@ int Process::sys$gethostname(char* buffer, ssize_t size)
return 0; return 0;
} }
int Process::sys$sethostname(const char* hostname, ssize_t length)
{
REQUIRE_PROMISE(stdio);
if (length < 0)
return -EINVAL;
LOCKER(*s_hostname_lock, Lock::Mode::Shared);
if (length > 64)
return -ENAMETOOLONG;
*s_hostname = validate_and_copy_string_from_user(hostname, length);
return 0;
}
pid_t Process::sys$fork(RegisterState& regs) pid_t Process::sys$fork(RegisterState& regs)
{ {
REQUIRE_PROMISE(proc); REQUIRE_PROMISE(proc);

View file

@ -223,6 +223,7 @@ public:
int sys$clock_settime(clockid_t, timespec*); int sys$clock_settime(clockid_t, timespec*);
int sys$clock_nanosleep(const Syscall::SC_clock_nanosleep_params*); int sys$clock_nanosleep(const Syscall::SC_clock_nanosleep_params*);
int sys$gethostname(char*, ssize_t); int sys$gethostname(char*, ssize_t);
int sys$sethostname(const char*, ssize_t);
int sys$uname(utsname*); int sys$uname(utsname*);
int sys$readlink(const Syscall::SC_readlink_params*); int sys$readlink(const Syscall::SC_readlink_params*);
int sys$ttyname_r(int fd, char*, ssize_t); int sys$ttyname_r(int fd, char*, ssize_t);

View file

@ -63,6 +63,7 @@ namespace Kernel {
__ENUMERATE_SYSCALL(getcwd) \ __ENUMERATE_SYSCALL(getcwd) \
__ENUMERATE_SYSCALL(gettimeofday) \ __ENUMERATE_SYSCALL(gettimeofday) \
__ENUMERATE_SYSCALL(gethostname) \ __ENUMERATE_SYSCALL(gethostname) \
__ENUMERATE_SYSCALL(sethostname) \
__ENUMERATE_SYSCALL(chdir) \ __ENUMERATE_SYSCALL(chdir) \
__ENUMERATE_SYSCALL(uname) \ __ENUMERATE_SYSCALL(uname) \
__ENUMERATE_SYSCALL(set_mmap_name) \ __ENUMERATE_SYSCALL(set_mmap_name) \

View file

@ -352,6 +352,12 @@ int gethostname(char* buffer, size_t size)
__RETURN_WITH_ERRNO(rc, rc, -1); __RETURN_WITH_ERRNO(rc, rc, -1);
} }
int sethostname(const char* hostname, ssize_t size)
{
int rc = syscall(SC_sethostname, hostname, size);
__RETURN_WITH_ERRNO(rc, rc, -1);
}
ssize_t readlink(const char* path, char* buffer, size_t size) ssize_t readlink(const char* path, char* buffer, size_t size)
{ {
Syscall::SC_readlink_params params { { path, strlen(path) }, { buffer, size } }; Syscall::SC_readlink_params params { { path, strlen(path) }, { buffer, size } };

View file

@ -104,6 +104,7 @@ int stat(const char* path, struct stat* statbuf);
int sleep(unsigned seconds); int sleep(unsigned seconds);
int usleep(useconds_t); int usleep(useconds_t);
int gethostname(char*, size_t); int gethostname(char*, size_t);
int sethostname(const char*, ssize_t);
ssize_t readlink(const char* path, char* buffer, size_t); ssize_t readlink(const char* path, char* buffer, size_t);
char* ttyname(int fd); char* ttyname(int fd);
int ttyname_r(int fd, char* buffer, size_t); int ttyname_r(int fd, char* buffer, size_t);

View file

@ -36,7 +36,7 @@ struct GlobalState {
String username; String username;
String home; String home;
char ttyname[32]; char ttyname[32];
char hostname[32]; char hostname[64];
uid_t uid; uid_t uid;
struct termios termios; struct termios termios;
struct termios default_termios; struct termios default_termios;

View file

@ -36,14 +36,24 @@ int main(int argc, char** argv)
return 1; return 1;
} }
(void)argc; if (argc == 1) {
(void)argv; char buffer[HOST_NAME_MAX];
char buffer[HOST_NAME_MAX]; int rc = gethostname(buffer, sizeof(buffer));
int rc = gethostname(buffer, sizeof(buffer)); if (rc < 0) {
if (rc < 0) { printf("gethostname() error: %s\n", strerror(errno));
printf("gethostname() error: %s\n", strerror(errno)); return 1;
return 1; }
printf("%s\n", buffer);
} }
printf("%s\n", buffer); else if (argc == 2) {
if (strlen(argv[1]) >= HOST_NAME_MAX) {
printf("hostname must be less than %i characters\n", HOST_NAME_MAX);
return 1;
}
else {
sethostname(argv[1], strlen(argv[1]));
}
}
return 0; return 0;
} }