computerの日記

Cisco,SHELL,Qt,C++,Linux,ネットワーク,Windows Scriptなどの発言です

Linux で、HOSTNAME は何 byte まで設定できるか

Linux のHOSTNAMEが、何 byte まで設定できるか試してみました。

結論は、64 byte でした。

以下のコードを動かして確かめました。

なにかあればお知らせください。

/*
Name of the program: test-hostname
Objective: check hostname length on linux box
Author: Shintaro Fujiwara
(borrowed code snippet from https://arstechnica.com/civis/viewtopic.php?t=222715)

copyright Shintaro Fujiwara

Please check
man 2 gethostbyname
hint: According to below, maximum hostname is 64 bytes.
/usr/include/bits/local_lim.h
HOST_NAME_MAX

Compile: gcc -o test-hostname <file>

This program will not break anything, but execute on safe environment with your own responsibility.
This program goes with "NO WARRANTY".

You should be root to execute this program.
# ./test-hostname

---- Enjoy! ----
*/

#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

/*current hostname buffer*/
char oldname[65];
/*testhostname buffer*/
char testname[256];
/*hostname 64 bytes long*/
char name_64[256] = "123456789.123456789.123456789.aaaaaaaaa.aaaaaaaaa.aaaaaaaaa.aaaa";
/*hostname 65 bytes long*/
char name_65[256] = "aaaaaaaaa.aaaaaaaaa.aaaaaaaaa.aaaaaaaaa.aaaaaaaaa.aaaaaaaaa.aaaaa";

int main() {
   // save current hostname
   puts("## hostname length test program##");
   puts("## Save current hostname");
   if(!gethostname(oldname, 65))
     printf(" Saving your current hostname (%s)...\n",oldname);

  // setting hostname 64 bytes long
   puts("## Let's set host name - 64 bytes length");
   if(!sethostname(name_64, strlen(name_64)))
     printf(" Success! Set your hostname to (%s)\n", name_64);
   else
     printf(" Oops! Failed to set your name to (%s)\n", name_64);

  // setting hostname 65 bytes long
   puts("## Let's set host name - 65 bytes length");
   if(!sethostname(name_65, strlen(name_65)))
     printf(" Success! Set your hostname to (%s)\n", name_65);
   else
     printf(" Oops! Failed to set your name to (%s)\n", name_65);

     puts("## Let's set host name 0 byte to 70 bytes length");
     int cnt = 0;
    while (1){
     if(!sethostname(testname, cnt))
       printf("%d bytes works\n",cnt);
     else
     printf("%d bytes does not work\n",cnt);
     cnt++;
     if (cnt > 70)
     break;
}

// restore current hostname
puts("## Restore hostname");
if(!sethostname(oldname, strlen(oldname)))
   printf(" Success! Restored your hostname to (%s)\n", oldname);
else
   puts(" Oops! Failed to restore hostname;)");

// finish the test
puts("This will end the test.");

return 0;
}