/* * open a file in an arbitrary directory * * NB: if the passed pathname is relative (which it usually is), * it will be interpreted relative to the process' working directory * (which should always be $PGDATA when this code is running). */ File PathNameOpenFile(FileName fileName, int fileFlags, int fileMode) { char *fnamecopy; File file; Vfd *vfdP; DO_DB(elog(LOG, "PathNameOpenFile: %s %x %o", fileName, fileFlags, fileMode)); /* * We need a malloc'd copy of the file name; fail cleanly if no room. */ fnamecopy = strdup(fileName); if (fnamecopy == NULL) ereport(ERROR, (errcode(ERRCODE_OUT_OF_MEMORY), errmsg("out of memory"))); file = AllocateVfd(); vfdP = &VfdCache[file]; while (nfile + numAllocatedDescs >= max_safe_fds) { if (!ReleaseLruFile()) break; } vfdP->fd = BasicOpenFile(fileName, fileFlags, fileMode); if (vfdP->fd < 0) { FreeVfd(file); free(fnamecopy); return -1; } ++nfile; DO_DB(elog(LOG, "PathNameOpenFile: success %d", vfdP->fd)); Insert(file); vfdP->fileName = fnamecopy; /* Saved flags are adjusted to be OK for re-opening file */ vfdP->fileFlags = fileFlags & ~(O_CREAT | O_TRUNC | O_EXCL); vfdP->fileMode = fileMode; vfdP->seekPos = 0; vfdP->fdstate = 0x0; vfdP->resowner = NULL; return file; }
/* VARARGS2 */ static File fileNameOpenFile(FileName fileName, int fileFlags, int fileMode) { static int osRanOut = 0; File file; Vfd *vfdP; int tmpfd; DO_DB(printf("DEBUG: FileNameOpenFile: %s %x %o\n", fileName, fileFlags, fileMode)); file = AllocateVfd(); vfdP = &VfdCache[file]; if (nfile >= MAXFILES || (FreeFd == 0 && osRanOut)) { AssertLruRoom(); } tryAgain: tmpfd = open(Nulldev, O_CREAT|O_RDWR, 0666); if (tmpfd < 0) { DO_DB(printf("DB: not enough descs, retry, er= %d\n", errno)); errno = 0; FreeFd = 0; osRanOut = 1; AssertLruRoom(); goto tryAgain; } else { close(tmpfd); } #ifdef WIN32 fileFlags |= _O_BINARY; #endif /* WIN32 */ vfdP->fd = open(fileName,fileFlags,fileMode); vfdP->fdstate = 0x0; if (vfdP->fd < 0) { FreeVfd(file); return -1; } ++nfile; DO_DB(printf("DB: FNOF success %d\n", vfdP->fd)); (void)LruInsert(file); if (fileName==NULL) { elog(WARN, "fileNameOpenFile: NULL fname"); } vfdP->fileName = malloc(strlen(fileName)+1); strcpy(vfdP->fileName,fileName); vfdP->fileFlags = fileFlags & ~(O_TRUNC|O_EXCL); vfdP->fileMode = fileMode; vfdP->seekPos = 0; return file; }