
1: /* Get a host configuration item kept as the whole contents of a file. 2: Copyright (C) 1996,97,99,2000,2001 Free Software Foundation, Inc. 3: This file is part of the GNU C Library. 4: 5: The GNU C Library is free software; you can redistribute it and/or 6: modify it under the terms of the GNU Lesser General Public 7: License as published by the Free Software Foundation; either 8: version 2.1 of the License, or (at your option) any later version. 9: 10: The GNU C Library is distributed in the hope that it will be useful, 11: but WITHOUT ANY WARRANTY; without even the implied warranty of 12: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13: Lesser General Public License for more details. 14: 15: You should have received a copy of the GNU Lesser General Public 16: License along with the GNU C Library; if not, write to the Free 17: Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 18: 02111-1307 USA. */ 19: 20: #include <fcntl.h> 21: #include <hurd.h> 22: #include <hurd/lookup.h> 23: #include "hurdhost.h" 24: #include <string.h> 25: 26: ssize_t 27: _hurd_get_host_config (const char *item, char *buf, size_t buflen) 28: { 29: error_t err; 30: char *data; 31: mach_msg_type_number_t nread, more; 32: file_t config; 33: 34: err = __hurd_file_name_lookup (&_hurd_ports_use, &__getdport, 0, 35: item, O_RDONLY, 0, &config); 36: switch (err) 37: { 38: case 0: /* Success; read file contents below. */ 39: break; 40: 41: case ENOENT: /* ? Others? All errors? */ 42: /* The file does not exist, so no value has been set. Rather than 43: causing gethostname et al to fail with ENOENT, give an empty value 44: as other systems do before sethostname has been called. */ 45: if (buflen != 0) 46: *buf = '\0'; 47: return 0; 48: 49: default: 50: return __hurd_fail (err); 51: } 52: 53: data = buf; 54: err = __io_read (config, &data, &nread, -1, buflen); 55: if (! err) 56: /* Check if there is more in the file we didn't read. */ 57: err = __io_readable (config, &more); 58: __mach_port_deallocate (__mach_task_self (), config); 59: if (err) 60: return __hurd_fail (err); 61: if (data != buf) 62: { 63: memcpy (buf, data, nread); 64: __vm_deallocate (__mach_task_self (), (vm_address_t) data, nread); 65: } 66: 67: /* If the file is empty, give an empty value. */ 68: if (nread == 0) 69: { 70: if (buflen != 0) 71: *buf = '\0'; 72: return 0; 73: } 74: 75: /* Remove newlines in case someone wrote the file by hand. */ 76: while (nread > 0 && buf[nread - 1] == '\n') 77: buf[--nread] = '\0'; 78: 79: /* Null-terminate the result if there is enough space. */ 80: if (nread < buflen) 81: buf[nread] = '\0'; 82: else 83: if (buf[nread - 1] != '\0') 84: more = 1; 85: 86: if (more) 87: /* If we didn't read the whole file, tell the caller to use a bigger 88: buffer next time. */ 89: return __hurd_fail (ENAMETOOLONG); 90: 91: return nread; 92: }