@@ -780,7 +780,7 @@ int FdEntity::Open(headers_t* pmeta, ssize_t size, time_t time)
780780 // not using cache
781781
782782 // open temporary file
783- if (NULL == (pfile = tmpfile ()) || -1 ==(fd = fileno (pfile))){
783+ if (NULL == (pfile = FdManager::MakeTempFile ()) || -1 ==(fd = fileno (pfile))){
784784 S3FS_PRN_ERR (" failed to open tmp file. err(%d)" , errno);
785785 if (pfile){
786786 fclose (pfile);
@@ -1713,6 +1713,7 @@ pthread_mutex_t FdManager::fd_manager_lock;
17131713bool FdManager::is_lock_init (false );
17141714string FdManager::cache_dir (" " );
17151715size_t FdManager::free_disk_space = 0 ;
1716+ std::string FdManager::tmp_dir = " " ;
17161717
17171718// ------------------------------------------------
17181719// FdManager class methods
@@ -1859,6 +1860,28 @@ fsblkcnt_t FdManager::GetFreeDiskSpace(const char* path)
18591860 return (vfsbuf.f_bavail * vfsbuf.f_bsize );
18601861}
18611862
1863+ FILE* FdManager::MakeTempFile () {
1864+ if (tmp_dir.empty ()) {
1865+ return tmpfile ();
1866+ }
1867+ int fd;
1868+ char cfn[PATH_MAX];
1869+ std::string fn = tmp_dir + " /cosfstmp.XXXXXX" ;
1870+ strncpy (cfn, fn.c_str (), sizeof (cfn) - 1 );
1871+ cfn[sizeof (cfn) - 1 ] = ' \0 ' ;
1872+
1873+ fd = mkstemp (cfn);
1874+ if (-1 == fd) {
1875+ S3FS_PRN_ERR (" failed to create tmp file. errno(%d)" , errno);
1876+ return NULL ;
1877+ }
1878+ if (-1 == unlink (cfn)) {
1879+ S3FS_PRN_ERR (" failed to delete tmp file. errno(%d)" , errno);
1880+ return NULL ;
1881+ }
1882+ return fdopen (fd, " rb+" );
1883+ }
1884+
18621885bool FdManager::IsSafeDiskSpace (const char * path, size_t size)
18631886{
18641887 fsblkcnt_t fsize = FdManager::GetFreeDiskSpace (path);
@@ -2061,6 +2084,16 @@ bool FdManager::Close(FdEntity* ent)
20612084 return false ;
20622085}
20632086
2087+ bool FdManager::SetTmpDir (const char *dir)
2088+ {
2089+ if (!dir || ' \0 ' == dir[0 ]){
2090+ tmp_dir = " /tmp" ;
2091+ }else {
2092+ tmp_dir = dir;
2093+ }
2094+ return true ;
2095+ }
2096+
20642097bool FdManager::ChangeEntityToTempPath (FdEntity* ent, const char * path)
20652098{
20662099 AutoLock auto_lock (&FdManager::fd_manager_lock);
0 commit comments