mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			libstdc++/71036 Handle EEXIST in filesystem::create_directory
Backport from mainline 2016-05-10 Jonathan Wakely <jwakely@redhat.com> PR libstdc++/71036 * src/filesystem/ops.cc (create_dir): Handle EEXIST from mkdir. * testsuite/experimental/filesystem/operations/create_directory.cc: New test. From-SVN: r236715
This commit is contained in:
		
							parent
							
								
									aecaeabf8d
								
							
						
					
					
						commit
						d67dba4a96
					
				|  | @ -1,3 +1,13 @@ | ||||||
|  | 2016-05-25  Jonathan Wakely  <jwakely@redhat.com> | ||||||
|  | 
 | ||||||
|  | 	Backport from mainline | ||||||
|  | 	2016-05-10  Jonathan Wakely  <jwakely@redhat.com> | ||||||
|  | 
 | ||||||
|  | 	PR libstdc++/71036 | ||||||
|  | 	* src/filesystem/ops.cc (create_dir): Handle EEXIST from mkdir. | ||||||
|  | 	* testsuite/experimental/filesystem/operations/create_directory.cc: | ||||||
|  | 	New test. | ||||||
|  | 
 | ||||||
| 2016-05-25  Jonathan Wakely  <jwakely@redhat.com> | 2016-05-25  Jonathan Wakely  <jwakely@redhat.com> | ||||||
| 
 | 
 | ||||||
| 	Backport from mainline | 	Backport from mainline | ||||||
|  |  | ||||||
|  | @ -660,22 +660,26 @@ namespace | ||||||
|   bool |   bool | ||||||
|   create_dir(const fs::path& p, fs::perms perm, std::error_code& ec) |   create_dir(const fs::path& p, fs::perms perm, std::error_code& ec) | ||||||
|   { |   { | ||||||
|  |     bool created = false; | ||||||
| #ifdef _GLIBCXX_HAVE_SYS_STAT_H | #ifdef _GLIBCXX_HAVE_SYS_STAT_H | ||||||
|     ::mode_t mode = static_cast<std::underlying_type_t<fs::perms>>(perm); |     ::mode_t mode = static_cast<std::underlying_type_t<fs::perms>>(perm); | ||||||
|     if (::mkdir(p.c_str(), mode)) |     if (::mkdir(p.c_str(), mode)) | ||||||
|       { |       { | ||||||
| 	ec.assign(errno, std::generic_category()); | 	const int err = errno; | ||||||
| 	return false; | 	if (err != EEXIST || !is_directory(p)) | ||||||
|  | 	  ec.assign(err, std::generic_category()); | ||||||
|  | 	else | ||||||
|  | 	  ec.clear(); | ||||||
|       } |       } | ||||||
|     else |     else | ||||||
|       { |       { | ||||||
| 	ec.clear(); | 	ec.clear(); | ||||||
| 	return true; | 	created = true; | ||||||
|       } |       } | ||||||
| #else | #else | ||||||
|     ec = std::make_error_code(std::errc::not_supported); |     ec = std::make_error_code(std::errc::not_supported); | ||||||
|     return false; |  | ||||||
| #endif | #endif | ||||||
|  |     return created; | ||||||
|   } |   } | ||||||
| } // namespace
 | } // namespace
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -0,0 +1,63 @@ | ||||||
|  | // Copyright (C) 2016 Free Software Foundation, Inc.
 | ||||||
|  | //
 | ||||||
|  | // This file is part of the GNU ISO C++ Library.  This library is free
 | ||||||
|  | // software; you can redistribute it and/or modify it under the
 | ||||||
|  | // terms of the GNU General Public License as published by the
 | ||||||
|  | // Free Software Foundation; either version 3, or (at your option)
 | ||||||
|  | // any later version.
 | ||||||
|  | 
 | ||||||
|  | // This library is distributed in the hope that it will be useful,
 | ||||||
|  | // but WITHOUT ANY WARRANTY; without even the implied warranty of
 | ||||||
|  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | ||||||
|  | // GNU General Public License for more details.
 | ||||||
|  | 
 | ||||||
|  | // You should have received a copy of the GNU General Public License along
 | ||||||
|  | // with this library; see the file COPYING3.  If not see
 | ||||||
|  | // <http://www.gnu.org/licenses/>.
 | ||||||
|  | 
 | ||||||
|  | // { dg-options "-std=gnu++11 -lstdc++fs" }
 | ||||||
|  | // { dg-require-filesystem-ts "" }
 | ||||||
|  | 
 | ||||||
|  | #include <experimental/filesystem> | ||||||
|  | #include <testsuite_hooks.h> | ||||||
|  | #include <testsuite_fs.h> | ||||||
|  | 
 | ||||||
|  | namespace fs = std::experimental::filesystem; | ||||||
|  | 
 | ||||||
|  | void | ||||||
|  | test01() | ||||||
|  | { | ||||||
|  |   bool test __attribute__((unused)) = false; | ||||||
|  |   std::error_code ec; | ||||||
|  | 
 | ||||||
|  |   // Test empty path.
 | ||||||
|  |   fs::path p; | ||||||
|  |   bool b = create_directory( p, ec ); | ||||||
|  |   VERIFY( ec ); | ||||||
|  |   VERIFY( !b ); | ||||||
|  | 
 | ||||||
|  |   // Test non-existent path
 | ||||||
|  |   p = __gnu_test::nonexistent_path(); | ||||||
|  |   VERIFY( !exists(p) ); | ||||||
|  | 
 | ||||||
|  |   b = create_directory(p, ec); // create the directory once
 | ||||||
|  |   VERIFY( !ec ); | ||||||
|  |   VERIFY( b ); | ||||||
|  |   VERIFY( exists(p) ); | ||||||
|  | 
 | ||||||
|  |   // Test existing path (libstdc++/71036).
 | ||||||
|  |   b = create_directory(p, ec); | ||||||
|  |   VERIFY( !ec ); | ||||||
|  |   VERIFY( !b ); | ||||||
|  |   b = create_directory(p); | ||||||
|  |   VERIFY( !ec ); | ||||||
|  |   VERIFY( !b ); | ||||||
|  | 
 | ||||||
|  |   remove_all(p, ec); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int | ||||||
|  | main() | ||||||
|  | { | ||||||
|  |   test01(); | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue
	
	 Jonathan Wakely
						Jonathan Wakely