2 * This file is part of the GROMACS molecular simulation package.
4 * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
5 * Copyright (c) 2001-2004, The GROMACS development team,
6 * check out http://www.gromacs.org for more information.
7 * Copyright (c) 2012, by the GROMACS development team, led by
8 * David van der Spoel, Berk Hess, Erik Lindahl, and including many
9 * others, as listed in the AUTHORS file in the top-level source
10 * directory and at http://www.gromacs.org.
12 * GROMACS is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU Lesser General Public License
14 * as published by the Free Software Foundation; either version 2.1
15 * of the License, or (at your option) any later version.
17 * GROMACS is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 * Lesser General Public License for more details.
22 * You should have received a copy of the GNU Lesser General Public
23 * License along with GROMACS; if not, see
24 * http://www.gnu.org/licenses, or write to the Free Software Foundation,
25 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
27 * If you want to redistribute modifications to GROMACS, please
28 * consider that scientific software is very special. Version
29 * control is crucial - bugs must be traceable. We will be happy to
30 * consider code for inclusion in the official distribution, but
31 * derived work must not be called official GROMACS. Details are found
32 * in the README & COPYING files - if they are missing, get the
33 * official version at http://www.gromacs.org.
35 * To help us fund GROMACS development, we humbly ask that you cite
36 * the research papers on the package. Check out http://www.gromacs.org.
41 #include "gmx_header_config.h"
46 #include <sys/types.h>
56 #ifdef GMX_NATIVE_WINDOWS
65 #include "gmx_fatal.h"
71 #include "thread_mpi.h"
74 /* Windows file stuff, only necessary for visual studio */
79 /* we keep a linked list of all files opened through pipes (i.e.
80 compressed or .gzipped files. This way we can distinguish between them
81 without having to change the semantics of reading from/writing to files)
83 typedef struct t_pstack {
85 struct t_pstack *prev;
88 static t_pstack *pstack=NULL;
89 static gmx_bool bUnbuffered=FALSE;
92 /* this linked list is an intrinsically globally shared object, so we have
93 to protect it with mutexes */
94 static tMPI_Thread_mutex_t pstack_mutex=TMPI_THREAD_MUTEX_INITIALIZER;
102 void push_ps(FILE *fp)
106 #ifdef GMX_THREAD_MPI
107 tMPI_Thread_mutex_lock(&pstack_mutex);
114 #ifdef GMX_THREAD_MPI
115 tMPI_Thread_mutex_unlock(&pstack_mutex);
120 /* don't use pipes!*/
121 #define popen fah_fopen
122 #define pclose fah_fclose
132 static FILE *popen(const char *nm,const char *mode)
134 gmx_impl("Sorry no pipes...");
139 static int pclose(FILE *fp)
141 gmx_impl("Sorry no pipes...");
148 int ffclose(FILE *fp)
155 #ifdef GMX_THREAD_MPI
156 tMPI_Thread_mutex_lock(&pstack_mutex);
164 else if (ps->fp == fp) {
171 while ((ps->prev != NULL) && (ps->prev->fp != fp))
173 if ((ps->prev != NULL) && ps->prev->fp == fp) {
174 if (ps->prev->fp != NULL)
175 ret = pclose(ps->prev->fp);
177 ps->prev=ps->prev->prev;
185 #ifdef GMX_THREAD_MPI
186 tMPI_Thread_mutex_unlock(&pstack_mutex);
197 void frewind(FILE *fp)
200 #ifdef GMX_THREAD_MPI
201 tMPI_Thread_mutex_lock(&pstack_mutex);
207 fprintf(stderr,"Cannot rewind compressed file!\n");
208 #ifdef GMX_THREAD_MPI
209 tMPI_Thread_mutex_unlock(&pstack_mutex);
216 #ifdef GMX_THREAD_MPI
217 tMPI_Thread_mutex_unlock(&pstack_mutex);
221 int gmx_fseek(FILE *stream, gmx_off_t offset, int whence)
224 return fseeko(stream, offset, whence);
226 #ifdef HAVE__FSEEKI64
227 return _fseeki64(stream, offset, whence);
229 return fseek(stream, offset, whence);
234 gmx_off_t gmx_ftell(FILE *stream)
237 return ftello(stream);
239 #ifdef HAVE__FSEEKI64
240 return _ftelli64(stream);
242 return ftell(stream);
248 gmx_bool is_pipe(FILE *fp)
251 #ifdef GMX_THREAD_MPI
252 tMPI_Thread_mutex_lock(&pstack_mutex);
258 #ifdef GMX_THREAD_MPI
259 tMPI_Thread_mutex_unlock(&pstack_mutex);
265 #ifdef GMX_THREAD_MPI
266 tMPI_Thread_mutex_unlock(&pstack_mutex);
272 static FILE *uncompress(const char *fn,const char *mode)
277 sprintf(buf,"uncompress -c < %s",fn);
278 fprintf(stderr,"Going to execute '%s'\n",buf);
279 if ((fp=popen(buf,mode)) == NULL)
286 static FILE *gunzip(const char *fn,const char *mode)
291 sprintf(buf,"gunzip -c < %s",fn);
292 fprintf(stderr,"Going to execute '%s'\n",buf);
293 if ((fp=popen(buf,mode)) == NULL)
300 gmx_bool gmx_fexist(const char *fname)
306 test=fopen(fname,"r");
308 /*Windows doesn't allow fopen of directory - so we need to check this seperately */
309 #ifdef GMX_NATIVE_WINDOWS
310 DWORD attr = GetFileAttributes(fname);
311 return (attr != INVALID_FILE_ATTRIBUTES) && (attr & FILE_ATTRIBUTE_DIRECTORY);
321 static gmx_bool gmx_is_file(const char *fname)
327 test=fopen(fname,"r");
335 /*Windows doesn't allow fopen of directory - so we don't need to check this seperately */
336 #if (!((defined WIN32 || defined _WIN32 || defined WIN64 || defined _WIN64) && !defined __CYGWIN__ && !defined __CYGWIN32__))
340 status = stat (fname, &st_buf);
341 if (status != 0 || !S_ISREG(st_buf.st_mode))
352 gmx_bool gmx_fexist_master(const char *fname, t_commrec *cr)
358 bExist = gmx_fexist(fname);
362 gmx_bcast(sizeof(bExist),&bExist,cr);
367 gmx_bool gmx_eof(FILE *fp)
375 if ((beof=fread(data,1,1,fp))==1)
376 gmx_fseek(fp,-1,SEEK_CUR);
381 static char *backup_fn(const char *file,int count_max)
383 /* Use a reasonably low value for countmax; we might
384 * generate 4-5 files in each round, and we dont
385 * want to hit directory limits of 1024 or 2048 files.
394 count_max = COUNTMAX;
397 smalloc(buf, GMX_PATH_MAX);
399 for(i=strlen(file)-1; ((i > 0) && (file[i] != DIR_SEPARATOR)); i--)
401 /* Must check whether i > 0, i.e. whether there is a directory
402 * in the file name. In that case we overwrite the / sign with
403 * a '\0' to end the directory string .
406 directory = gmx_strdup(file);
408 fn = gmx_strdup(file+i+1);
411 directory = gmx_strdup(".");
412 fn = gmx_strdup(file);
415 sprintf(buf,"%s/#%s.%d#",directory,fn,count);
417 } while ((count <= count_max) && gmx_fexist(buf));
419 /* Arbitrarily bail out */
420 if (count > count_max)
421 gmx_fatal(FARGS,"Won't make more than %d backups of %s for you.\n"
422 "The env.var. GMX_MAXBACKUP controls this maximum, -1 disables backups.",
431 gmx_bool make_backup(const char * name)
438 return FALSE; /* skip making backups */
441 if (gmx_fexist(name))
443 env = getenv("GMX_MAXBACKUP");
447 sscanf(env,"%d",&count_max);
450 /* Do not make backups and possibly overwrite old files */
456 /* Use the default maximum */
459 backup = backup_fn(name,count_max);
460 if(rename(name, backup) == 0) {
461 fprintf(stderr, "\nBack Off! I just backed up %s to %s\n",
464 fprintf(stderr, "Sorry couldn't backup %s to %s\n", name, backup);
473 FILE *ffopen(const char *file,const char *mode)
476 return fopen(file,mode);
479 char buf[256],*bf,*bufsize=0,*ptr;
493 bRead= (mode[0]=='r'&&mode[1]!='+');
495 if (!bRead || gmx_fexist(buf)) {
496 if ((ff=fopen(buf,mode))==NULL)
499 /* Check whether we should be using buffering (default) or not
502 if (bUnbuffered || ((bufsize=getenv("LOG_BUFS")) != NULL)) {
503 /* Check whether to use completely unbuffered */
507 bs=strtol(bufsize, NULL, 10);
512 if (setvbuf(ff,ptr,_IOFBF,bs) != 0)
513 gmx_file("Buffering File");
519 sprintf(buf,"%s.Z",file);
520 if (gmx_fexist(buf)) {
521 ff=uncompress(buf,mode);
524 sprintf(buf,"%s.gz",file);
525 if (gmx_fexist(buf)) {
536 /* Our own implementation of dirent-like functionality to scan directories. */
541 #elif (defined GMX_NATIVE_WINDOWS)
542 intptr_t windows_handle;
543 struct _finddata_t finddata;
552 gmx_directory_open(gmx_directory_t *p_gmxdir,const char *dirname)
554 struct gmx_directory * gmxdir;
562 if( (gmxdir->dirent_handle = opendir(dirname)) != NULL)
572 #elif (defined GMX_NATIVE_WINDOWS)
574 if(dirname!=NULL && strlen(dirname)>0)
580 len = strlen(dirname);
583 strncpy(tmpname,dirname,len+1);
585 /* Remove possible trailing directory separator */
586 if(tmpname[len]=='/' || tmpname[len]=='\\')
592 strcat(tmpname,"/*");
595 if( (gmxdir->windows_handle=_findfirst(tmpname,&gmxdir->finddata))>0L)
619 "Source compiled without POSIX dirent or windows support - cannot scan directories.\n"
620 "In the very unlikely event this is not a compile-time mistake you could consider\n"
621 "implementing support for your platform in futil.c, but contact the developers\n"
622 "to make sure it's really necessary!\n");
630 gmx_directory_nextfile(gmx_directory_t gmxdir,char *name,int maxlength_name)
636 struct dirent * direntp_large;
640 if(gmxdir!=NULL && gmxdir->dirent_handle!=NULL)
642 /* On some platforms no space is present for d_name in dirent.
643 * Since d_name is guaranteed to be the last entry, allocating
644 * extra space for dirent will allow more size for d_name.
645 * GMX_MAX_PATH should always be >= the max possible d_name.
647 smalloc(direntp_large, sizeof(*direntp_large) + GMX_PATH_MAX);
648 rc = readdir_r(gmxdir->dirent_handle,direntp_large,&p);
652 strncpy(name,direntp_large->d_name,maxlength_name);
659 sfree(direntp_large);
667 #elif (defined GMX_NATIVE_WINDOWS)
671 if(gmxdir->windows_handle<=0)
677 else if(gmxdir->first==1)
679 strncpy(name,gmxdir->finddata.name,maxlength_name);
685 if(_findnext(gmxdir->windows_handle,&gmxdir->finddata)==0)
687 strncpy(name,gmxdir->finddata.name,maxlength_name);
700 "Source compiled without POSIX dirent or windows support - cannot scan directories.\n");
708 gmx_directory_close(gmx_directory_t gmxdir)
712 rc = (gmxdir != NULL) ? closedir(gmxdir->dirent_handle) : EINVAL;
713 #elif (defined GMX_NATIVE_WINDOWS)
714 rc = (gmxdir != NULL) ? _findclose(gmxdir->windows_handle) : EINVAL;
717 "Source compiled without POSIX dirent or windows support - cannot scan directories.\n");
728 gmx_bool search_subdirs(const char *parent, char *libdir)
733 /* Search a few common subdirectory names for the gromacs library dir */
734 sprintf(libdir,"%s%cshare%ctop%cgurgle.dat",parent,
735 DIR_SEPARATOR,DIR_SEPARATOR,DIR_SEPARATOR);
736 found=gmx_fexist(libdir);
738 sprintf(libdir,"%s%cshare%cgromacs%ctop%cgurgle.dat",parent,
739 DIR_SEPARATOR,DIR_SEPARATOR,
740 DIR_SEPARATOR,DIR_SEPARATOR);
741 found=gmx_fexist(libdir);
744 sprintf(libdir,"%s%cshare%cgromacs-%s%ctop%cgurgle.dat",parent,
745 DIR_SEPARATOR,DIR_SEPARATOR,VERSION,
746 DIR_SEPARATOR,DIR_SEPARATOR);
747 found=gmx_fexist(libdir);
750 sprintf(libdir,"%s%cshare%cgromacs%cgromacs-%s%ctop%cgurgle.dat",parent,
751 DIR_SEPARATOR,DIR_SEPARATOR,DIR_SEPARATOR,
752 VERSION,DIR_SEPARATOR,DIR_SEPARATOR);
753 found=gmx_fexist(libdir);
756 /* Remove the gurgle.dat part from libdir if we found something */
758 ptr=strrchr(libdir,DIR_SEPARATOR); /* slash or backslash always present, no check necessary */
765 /* Check if the program name begins with "/" on unix/cygwin, or
766 * with "\" or "X:\" on windows. If not, the program name
767 * is relative to the current directory.
769 static gmx_bool filename_is_absolute(char *name)
771 #ifdef GMX_NATIVE_WINDOWS
772 return ((name[0] == DIR_SEPARATOR) || ((strlen(name)>3) && strncmp(name+1,":\\",2)) == 0);
774 return (name[0] == DIR_SEPARATOR);
778 gmx_bool get_libdir(char *libdir)
780 #define GMX_BINNAME_MAX 512
781 char bin_name[GMX_BINNAME_MAX];
782 char buf[GMX_BINNAME_MAX];
783 char full_path[GMX_PATH_MAX+GMX_BINNAME_MAX];
784 char system_path[GMX_PATH_MAX];
785 char *dir,*ptr,*s,*pdum;
786 gmx_bool found=FALSE;
789 if (Program() != NULL)
792 /* First - detect binary name */
793 if (strlen(Program()) >= GMX_BINNAME_MAX)
795 gmx_fatal(FARGS,"The name of the binary is longer than the allowed buffer size (%d):\n'%s'",GMX_BINNAME_MAX,Program());
797 strncpy(bin_name,Program(),GMX_BINNAME_MAX-1);
799 /* On windows & cygwin we need to add the .exe extension
800 * too, or we wont be able to detect that the file exists
802 #if (defined GMX_NATIVE_WINDOWS || defined GMX_CYGWIN)
803 if(strlen(bin_name)<3 || gmx_strncasecmp(bin_name+strlen(bin_name)-4,".exe",4))
804 strcat(bin_name,".exe");
807 /* Only do the smart search part if we got a real name */
808 if (NULL!=bin_name && strncmp(bin_name,"GROMACS",GMX_BINNAME_MAX)) {
810 if (!strchr(bin_name,DIR_SEPARATOR)) {
811 /* No slash or backslash in name means it must be in the path - search it! */
812 /* Add the local dir since it is not in the path on windows */
813 #ifdef GMX_NATIVE_WINDOWS
814 pdum=_getcwd(system_path,sizeof(system_path)-1);
816 pdum=getcwd(system_path,sizeof(system_path)-1);
818 sprintf(full_path,"%s%c%s",system_path,DIR_SEPARATOR,bin_name);
819 found = gmx_is_file(full_path);
820 if (!found && (s=getenv("PATH")) != NULL)
824 dupped=gmx_strdup(s);
826 while(!found && (dir=gmx_strsep(&s, PATH_SEPARATOR)) != NULL)
828 sprintf(full_path,"%s%c%s",dir,DIR_SEPARATOR,bin_name);
829 found = gmx_is_file(full_path);
837 } else if (!filename_is_absolute(bin_name)) {
838 /* name contains directory separators, but
839 * it does not start at the root, i.e.
840 * name is relative to the current dir
842 #ifdef GMX_NATIVE_WINDOWS
843 pdum=_getcwd(buf,sizeof(buf)-1);
845 pdum=getcwd(buf,sizeof(buf)-1);
847 sprintf(full_path,"%s%c%s",buf,DIR_SEPARATOR,bin_name);
849 strncpy(full_path,bin_name,GMX_PATH_MAX);
852 /* Now we should have a full path and name in full_path,
853 * but on unix it might be a link, or a link to a link to a link..
855 #ifndef GMX_NATIVE_WINDOWS
856 while( (i=readlink(full_path,buf,sizeof(buf)-1)) > 0 ) {
858 /* If it doesn't start with "/" it is relative */
859 if (buf[0]!=DIR_SEPARATOR) {
860 strncpy(strrchr(full_path,DIR_SEPARATOR)+1,buf,GMX_PATH_MAX);
862 strncpy(full_path,buf,GMX_PATH_MAX);
866 /* Remove the executable name - it always contains at least one slash */
867 *(strrchr(full_path,DIR_SEPARATOR)+1)='\0';
868 /* Now we have the full path to the gromacs executable.
869 * Use it to find the library dir.
872 while(!found && ( (ptr=strrchr(full_path,DIR_SEPARATOR)) != NULL ) ) {
874 found=search_subdirs(full_path,libdir);
878 /* End of smart searching. If we didn't find it in our parent tree,
879 * or if the program name wasn't set, at least try some standard
880 * locations before giving up, in case we are running from e.g.
881 * a users home directory. This only works on unix or cygwin...
883 #ifndef GMX_NATIVE_WINDOWS
885 found=search_subdirs("/usr/local",libdir);
887 found=search_subdirs("/usr",libdir);
889 found=search_subdirs("/opt",libdir);
895 char *low_gmxlibfn(const char *file, gmx_bool bAddCWD, gmx_bool bFatal)
900 char libpath[GMX_PATH_MAX];
901 gmx_bool env_is_set=FALSE;
902 char *s,tmppath[GMX_PATH_MAX];
904 /* GMXLIB can be a path now */
905 lib=getenv("GMXLIB");
909 strncpy(libpath,lib,GMX_PATH_MAX);
911 else if (!get_libdir(libpath))
913 strncpy(libpath,GMXLIBDIR,GMX_PATH_MAX);
917 if (bAddCWD && gmx_fexist(file))
919 ret = gmx_strdup(file);
923 strncpy(tmppath,libpath,GMX_PATH_MAX);
925 while(ret == NULL && (dir=gmx_strsep(&s, PATH_SEPARATOR)) != NULL )
927 sprintf(buf,"%s%c%s",dir,DIR_SEPARATOR,file);
930 ret = gmx_strdup(buf);
933 if (ret == NULL && bFatal)
938 "Library file %s not found %sin your GMXLIB path.",
939 file, bAddCWD ? "in current dir nor " : "");
944 "Library file %s not found %sin default directories.\n"
945 "(You can set the directories to search with the GMXLIB path variable)",
946 file, bAddCWD ? "in current dir nor " : "");
958 FILE *low_libopen(const char *file,gmx_bool bFatal)
963 fn=low_gmxlibfn(file,TRUE,bFatal);
969 fprintf(debug,"Opening library file %s\n",fn);
977 char *gmxlibfn(const char *file)
979 return low_gmxlibfn(file,TRUE,TRUE);
982 FILE *libopen(const char *file)
984 return low_libopen(file,TRUE);
987 void gmx_tmpnam(char *buf)
991 if ((len = strlen(buf)) < 7)
992 gmx_fatal(FARGS,"Buf passed to gmx_tmpnam must be at least 7 bytes long");
993 for(i=len-6; (i<len); i++) {
996 /* mktemp is dangerous and we should use mkstemp instead, but
997 * since windows doesnt support it we have to separate the cases.
998 * 20090307: mktemp deprecated, use iso c++ _mktemp instead.
1000 #ifdef GMX_NATIVE_WINDOWS
1007 gmx_fatal(FARGS,"Invalid template %s for mkstemp",buf);
1010 gmx_fatal(FARGS,"mkstemp created existing file",buf);
1013 gmx_fatal(FARGS,"Permission denied for opening %s",buf);
1020 /* name in Buf should now be OK */
1023 int gmx_truncatefile(char *path, gmx_off_t length)
1026 /* Microsoft visual studio does not have "truncate" */
1028 LARGE_INTEGER win_length;
1030 win_length.QuadPart = length;
1032 fh = CreateFile(path,GENERIC_READ | GENERIC_WRITE,0,NULL,
1033 OPEN_EXISTING,0,NULL);
1034 SetFilePointerEx(fh,win_length,NULL,FILE_BEGIN);
1040 return truncate(path,length);
1045 int gmx_file_rename(const char *oldname, const char *newname)
1047 #ifndef GMX_NATIVE_WINDOWS
1048 /* under unix, rename() is atomic (at least, it should be). */
1049 return rename(oldname, newname);
1051 if (MoveFileEx(oldname, newname,
1052 MOVEFILE_REPLACE_EXISTING|MOVEFILE_WRITE_THROUGH))
1059 int gmx_file_copy(const char *oldname, const char *newname, gmx_bool copy_if_empty)
1061 /* the full copy buffer size: */
1062 #define FILECOPY_BUFSIZE (1<<16)
1067 snew(buf, FILECOPY_BUFSIZE);
1069 in=fopen(oldname, "rb");
1073 /* If we don't copy when empty, we postpone opening the file
1074 until we're actually ready to write. */
1077 out=fopen(newname, "wb");
1086 nread=fread(buf, sizeof(char), FILECOPY_BUFSIZE, in);
1092 /* so this is where we open when copy_if_empty is false:
1093 here we know we read something. */
1094 out=fopen(newname, "wb");
1098 ret=fwrite(buf, sizeof(char), nread, out);
1118 #undef FILECOPY_BUFSIZE
1122 int gmx_fsync(FILE *fp)
1127 /* the fahcore defines its own os-independent fsync */
1129 #else /* GMX_FAHCORE */
1133 /* get the file number */
1134 #if defined(HAVE_FILENO)
1136 #elif defined(HAVE__FILENO)
1140 /* do the actual fsync */
1143 #if (defined(HAVE_FSYNC))
1145 #elif (defined(HAVE__COMMIT))
1150 #endif /* GMX_FAHCORE */
1152 /* We check for these error codes this way because POSIX requires them
1153 to be defined, and using anything other than macros is unlikely: */
1155 /* we don't want to report an error just because fsync() caught a signal.
1156 For our purposes, we can just ignore this. */
1157 if (rc && errno==EINTR)
1161 /* we don't want to report an error just because we tried to fsync()
1162 stdout, a socket or a pipe. */
1163 if (rc && errno==EINVAL)