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:
parent
03f68a51af
commit
f191b84b50
7 changed files with 40 additions and 9 deletions
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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) \
|
||||||
|
|
|
@ -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 } };
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue