--- a/src/netxx/serverbase.cxx +++ b/src/netxx/serverbase.cxx @@ -89,6 +89,20 @@ sockets_size_ = addr.size(); sockets_ = new Socket[sockets_size_]; + std::string cwd; +# if !defined(PATH_MAX) && defined(__GLIBC__) + char *buffer = ::get_current_dir_name(); + if (buffer) { + cwd = buffer; + free(buffer); + } +# else + char buffer[PATH_MAX]; + if (getcwd(buffer, sizeof(buffer))) { + cwd = buffer; + } +# endif + /* * now that we have an array of sockets we need to walk through each one * and set it up. We will use a temporay socket and make it call @@ -167,10 +181,8 @@ if (saun->sun_path[0] == '/') { files_.push_back(saun->sun_path); } else { - char buffer[MAXPATHLEN]; - - if (getcwd(buffer, sizeof(buffer))) { - std::string fullpath = buffer; fullpath += '/'; fullpath += saun->sun_path; + if (!cwd.empty()) { + std::string fullpath = cwd; fullpath += '/'; fullpath += saun->sun_path; files_.push_back(fullpath); } else { files_.push_back(saun->sun_path); --- a/src/unix/fs.cc +++ b/src/unix/fs.cc @@ -41,14 +41,28 @@ string get_current_working_dir() { - char buffer[4096]; - if (!getcwd(buffer, 4096)) +#if !defined(PATH_MAX) && defined(__GLIBC__) + std::string cwd; + char *buffer = ::get_current_dir_name(); + if (!buffer) + { + const int err = errno; + E(false, origin::system, + F("cannot get working directory: %s") % os_strerror(err)); + } + cwd = buffer; + free(buffer); + return cwd; +#else + char buffer[PATH_MAX + 1]; + if (!getcwd(buffer, sizeof(buffer) - 1)) { const int err = errno; E(false, origin::system, F("cannot get working directory: %s") % os_strerror(err)); } return string(buffer); +#endif } void