diff options
Diffstat (limited to 'mysys/my_open.c')
-rw-r--r-- | mysys/my_open.c | 84 |
1 files changed, 46 insertions, 38 deletions
diff --git a/mysys/my_open.c b/mysys/my_open.c index a8dbe86989b..1bca4d9cccd 100644 --- a/mysys/my_open.c +++ b/mysys/my_open.c @@ -47,7 +47,44 @@ File my_open(const char *FileName, int Flags, myf MyFlags) #else fd = open((my_string) FileName, Flags); #endif + DBUG_RETURN(my_register_filename(fd, FileName, FILE_BY_OPEN, + EE_FILENOTFOUND, MyFlags)); +} /* my_open */ + + + /* Close a file */ + +int my_close(File fd, myf MyFlags) +{ + int err; + DBUG_ENTER("my_close"); + DBUG_PRINT("my",("fd: %d MyFlags: %d",fd, MyFlags)); + + pthread_mutex_lock(&THR_LOCK_open); + if ((err = close(fd))) + { + DBUG_PRINT("error",("Got error %d on close",err)); + my_errno=errno; + if (MyFlags & (MY_FAE | MY_WME)) + my_error(EE_BADCLOSE, MYF(ME_BELL+ME_WAITTANG),my_filename(fd),errno); + } + if ((uint) fd < MY_NFILE && my_file_info[fd].type != UNOPEN) + { + my_free(my_file_info[fd].name, MYF(0)); +#if defined(THREAD) && !defined(HAVE_PREAD) + pthread_mutex_destroy(&my_file_info[fd].mutex); +#endif + my_file_info[fd].type = UNOPEN; + my_file_opened--; + } + pthread_mutex_unlock(&THR_LOCK_open); + DBUG_RETURN(err); +} /* my_close */ + +File my_register_filename(File fd, const char *FileName, enum file_type + type_of_file, uint error_message_number, myf MyFlags) +{ if ((int) fd >= 0) { if ((int) fd >= MY_NFILE) @@ -58,62 +95,33 @@ File my_open(const char *FileName, int Flags, myf MyFlags) if (MyFlags & (MY_FFNF | MY_FAE | MY_WME)) my_error(EE_OUT_OF_FILERESOURCES, MYF(ME_BELL+ME_WAITTANG), FileName, my_errno); - DBUG_RETURN(-1); + return(-1); #else thread_safe_increment(my_file_opened,&THR_LOCK_open); #endif - DBUG_RETURN(fd); /* safeguard */ + return(fd); /* safeguard */ } pthread_mutex_lock(&THR_LOCK_open); if ((my_file_info[fd].name = (char*) my_strdup(FileName,MyFlags))) { my_file_opened++; - my_file_info[fd].type = FILE_BY_OPEN; + my_file_info[fd].type = type_of_file; #if defined(THREAD) && !defined(HAVE_PREAD) pthread_mutex_init(&my_file_info[fd].mutex,NULL); #endif pthread_mutex_unlock(&THR_LOCK_open); DBUG_PRINT("exit",("fd: %d",fd)); - DBUG_RETURN(fd); + return(fd); } pthread_mutex_unlock(&THR_LOCK_open); - (void) my_close(fd,MyFlags); + (void) my_close(fd, MyFlags); my_errno=ENOMEM; } else my_errno=errno; DBUG_PRINT("error",("Got error %d on open",my_errno)); if (MyFlags & (MY_FFNF | MY_FAE | MY_WME)) - my_error(EE_FILENOTFOUND, MYF(ME_BELL+ME_WAITTANG), FileName,my_errno); - DBUG_RETURN(fd); -} /* my_open */ - - - /* Close a file */ - -int my_close(File fd, myf MyFlags) -{ - int err; - DBUG_ENTER("my_close"); - DBUG_PRINT("my",("fd: %d MyFlags: %d",fd, MyFlags)); - - pthread_mutex_lock(&THR_LOCK_open); - if ((err = close(fd))) - { - DBUG_PRINT("error",("Got error %d on close",err)); - my_errno=errno; - if (MyFlags & (MY_FAE | MY_WME)) - my_error(EE_BADCLOSE, MYF(ME_BELL+ME_WAITTANG),my_filename(fd),errno); - } - if ((uint) fd < MY_NFILE && my_file_info[fd].type != UNOPEN) - { - my_free(my_file_info[fd].name, MYF(0)); -#if defined(THREAD) && !defined(HAVE_PREAD) - pthread_mutex_destroy(&my_file_info[fd].mutex); -#endif - my_file_info[fd].type = UNOPEN; - my_file_opened--; - } - pthread_mutex_unlock(&THR_LOCK_open); - DBUG_RETURN(err); -} /* my_close */ + my_error(error_message_number, MYF(ME_BELL+ME_WAITTANG), + FileName, my_errno); + return(fd); +} |