
1: /* Change a port cell to a directory by looking up a name. 2: Copyright (C) 1999,2001,02 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 <errno.h> 21: #include <unistd.h> 22: #include <hurd.h> 23: #include <hurd/port.h> 24: #include <hurd/fd.h> 25: #include <fcntl.h> 26: #include <string.h> 27: 28: int 29: _hurd_change_directory_port_from_name (struct hurd_port *portcell, 30: const char *name) 31: { 32: size_t len; 33: const char *lookup; 34: file_t dir; 35: 36: /* Append trailing "/." to directory name to force ENOTDIR if it's not a 37: directory and EACCES if we don't have search permission. */ 38: len = strlen (name); 39: if (len >= 2 && name[len - 2] == '/' && name[len - 1] == '.') 40: lookup = name; 41: else 42: { 43: char *n = alloca (len + 3); 44: memcpy (n, name, len); 45: n[len] = '/'; 46: n[len + 1] = '.'; 47: n[len + 2] = '\0'; 48: lookup = n; 49: } 50: 51: dir = __file_name_lookup (lookup, 0, 0); 52: if (dir == MACH_PORT_NULL) 53: return -1; 54: 55: _hurd_port_set (portcell, dir); 56: return 0; 57: }