int main(int argc, char **argv) { char *base = NULL; size_t baselen = 0; char *dir = NULL; size_t dirlen = 0; TEST_SPLITPATH("helloworld"); TEST_SPLITPATH("/a/b/c/d.2/"); TEST_SPLITPATH("/"); TEST_SPLITPATH("/a/v/c///"); puts(my_realpath("/home/joj/fub/ws12")); puts(my_realpath("/home/joj/mail/sym13")); return 0; }
static char *my_cd_back(char *path, char **env) { char *tmp; char *home; char *pwd; char *oldpwd; tmp = NULL; oldpwd = my_getenv(env, "OLDPWD"); if (my_strcmp(path, "-") == 0) { tmp = my_strdup(oldpwd); my_putpath(env, my_realpath(tmp), 1); } else if (my_strcmp(path, "--") == 0) { pwd = my_getenv(env, "PWD"); home = my_getenv(env, "HOME"); if (my_strncmp(pwd, home, my_strlen(home)) == 0) tmp = my_strdup(home); else tmp = my_strdup("/"); } return (tmp); }
MI_INFO *mi_open(const char *name, int mode, uint open_flags) { int lock_error,kfile,open_mode,save_errno,have_rtree=0, realpath_err; uint i,j,len,errpos,head_length,base_pos,offset,info_length,keys, key_parts,unique_key_parts,fulltext_keys,uniques; uint internal_table= open_flags & HA_OPEN_INTERNAL_TABLE; char name_buff[FN_REFLEN], org_name[FN_REFLEN], index_name[FN_REFLEN], data_name[FN_REFLEN]; uchar *disk_cache, *disk_pos, *end_pos; MI_INFO info, *m_info, *old_info= NULL; MYISAM_SHARE share_buff,*share; ulong rec_per_key_part[HA_MAX_POSSIBLE_KEY*MI_MAX_KEY_SEG]; my_off_t key_root[HA_MAX_POSSIBLE_KEY],key_del[MI_MAX_KEY_BLOCK_SIZE]; ulonglong max_key_file_length, max_data_file_length; DBUG_ENTER("mi_open"); m_info= NULL; kfile= -1; lock_error=1; errpos=0; head_length=sizeof(share_buff.state.header); memset(&info, 0, sizeof(info)); realpath_err= my_realpath(name_buff, fn_format(org_name,name,"",MI_NAME_IEXT,4),MYF(0)); if (my_is_symlink(org_name) && (realpath_err || (*myisam_test_invalid_symlink)(name_buff))) { my_errno= HA_WRONG_CREATE_OPTION; DBUG_RETURN (NULL); } if (!internal_table) { mysql_mutex_lock(&THR_LOCK_myisam); old_info= test_if_reopen(name_buff); } if (!old_info) { share= &share_buff; memset(&share_buff, 0, sizeof(share_buff)); share_buff.state.rec_per_key_part=rec_per_key_part; share_buff.state.key_root=key_root; share_buff.state.key_del=key_del; share_buff.key_cache= multi_key_cache_search((uchar*) name_buff, strlen(name_buff)); DBUG_EXECUTE_IF("myisam_pretend_crashed_table_on_open", if (strstr(name, "/t1")) { my_errno= HA_ERR_CRASHED; goto err; });
void call_realpath(char *name){ unsigned int uid = 10; unsigned int gid = 100; char path[MAXPATHLEN + 1]; /* for my-realpath() later - cky */ printf("Before my-realpath(): uid = %d, gid = %d\n", uid, gid); if (((my_realpath(name, path, chroot_path)) != NULL)) { printf("Resolved path = %s\n", path); } printf("After my-realpath(): uid = %d, gid = %d\n", uid, gid); }
MI_INFO *mi_open(const char *name, int mode, uint open_flags) { int lock_error,kfile,open_mode,save_errno,have_rtree=0, realpath_err; uint i,j,len,errpos,head_length,base_pos,offset,info_length,keys, key_parts,unique_key_parts,base_key_parts,fulltext_keys,uniques; char name_buff[FN_REFLEN], org_name[FN_REFLEN], index_name[FN_REFLEN], data_name[FN_REFLEN]; uchar *UNINIT_VAR(disk_cache), *disk_pos, *end_pos; MI_INFO info,*UNINIT_VAR(m_info),*old_info; MYISAM_SHARE share_buff,*share; ulong *rec_per_key_part= 0; my_off_t *key_root, *key_del; ulonglong max_key_file_length, max_data_file_length; DBUG_ENTER("mi_open"); kfile= -1; lock_error=1; errpos=0; head_length=sizeof(share_buff.state.header); bzero((uchar*) &info,sizeof(info)); realpath_err= my_realpath(name_buff, fn_format(org_name,name,"",MI_NAME_IEXT,4),MYF(0)); if (my_is_symlink(org_name) && (realpath_err || (*myisam_test_invalid_symlink)(name_buff))) { my_errno= HA_WRONG_CREATE_OPTION; DBUG_RETURN (NULL); } mysql_mutex_lock(&THR_LOCK_myisam); if (!(old_info=test_if_reopen(name_buff))) { share= &share_buff; bzero((uchar*) &share_buff,sizeof(share_buff)); share_buff.key_cache= multi_key_cache_search((uchar*) name_buff, strlen(name_buff), dflt_key_cache); DBUG_EXECUTE_IF("myisam_pretend_crashed_table_on_open", if (strstr(name, "crashed")) { my_errno= HA_ERR_CRASHED; goto err; });
static char *my_cd_realpath(char *path, char **env) { char *tmp; tmp = NULL; if (my_strcmp(path, "-") == 0 || my_strcmp(path, "--") == 0) tmp = my_cd_back(path, env); else if (my_strcmp(path, "~") == 0) tmp = my_strdup(my_getenv(env, "HOME")); else if (my_strichr(path, '~') == 0 && my_strichr(path, '/') == 1) tmp = my_strjoin(my_getenv(env, "HOME"), my_strchr(path, '/')); else if (my_strichr(path, '/') == 0) tmp = my_strdup(path); else { tmp = my_strjoin(my_getenv(env, "PWD"), "/"); tmp = my_strfjoin(tmp, my_strdup(path)); } if (tmp != NULL) tmp = my_realpath(tmp); return (tmp); }
char * fn_format(char * to, const char *name, const char *dir, const char *extension, uint flag) { char dev[FN_REFLEN], buff[FN_REFLEN], *pos, *startpos; const char *ext; reg1 size_t length; size_t dev_length; my_bool not_used; DBUG_ENTER("fn_format"); DBUG_ASSERT(name != NULL); DBUG_ASSERT(extension != NULL); DBUG_PRINT("enter",("name: %s dir: %s extension: %s flag: %d", name,dir,extension,flag)); /* Copy and skip directory */ name+=(length=dirname_part(dev, (startpos=(char *) name), &dev_length)); if (length == 0 || (flag & MY_REPLACE_DIR)) { DBUG_ASSERT(dir != NULL); /* Use given directory */ convert_dirname(dev,dir,NullS); /* Fix to this OS */ } else if ((flag & MY_RELATIVE_PATH) && !test_if_hard_path(dev)) { DBUG_ASSERT(dir != NULL); /* Put 'dir' before the given path */ strmake(buff,dev,sizeof(buff)-1); pos=convert_dirname(dev,dir,NullS); strmake(pos,buff,sizeof(buff)-1- (int) (pos-dev)); } if (flag & MY_PACK_FILENAME) pack_dirname(dev,dev); /* Put in ./.. and ~/.. */ if (flag & MY_UNPACK_FILENAME) (void) unpack_dirname(dev, dev, ¬_used); /* Replace ~/.. with dir */ if (!(flag & MY_APPEND_EXT) && (pos= (char*) strchr(name,FN_EXTCHAR)) != NullS) { if ((flag & MY_REPLACE_EXT) == 0) /* If we should keep old ext */ { length=strlength(name); /* Use old extension */ ext = ""; } else { length= (size_t) (pos-(char*) name); /* Change extension */ ext= extension; } } else { length=strlength(name); /* No ext, use the now one */ ext=extension; } if (strlen(dev)+length+strlen(ext) >= FN_REFLEN || length >= FN_LEN ) { /* To long path, return original or NULL */ size_t tmp_length; if (flag & MY_SAFE_PATH) DBUG_RETURN(NullS); tmp_length= strlength(startpos); DBUG_PRINT("error",("dev: '%s' ext: '%s' length: %u",dev,ext, (uint) length)); (void) strmake(to, startpos, MY_MIN(tmp_length, FN_REFLEN-1)); } else { if (to == startpos) { bmove(buff,(uchar*) name,length); /* Save name for last copy */ name=buff; } pos=strmake(strmov(to,dev),name,length); (void) strmov(pos,ext); /* Don't convert extension */ } /* If MY_RETURN_REAL_PATH and MY_RESOLVE_SYMLINK is given, only do realpath if the file is a symbolic link */ if (flag & MY_RETURN_REAL_PATH) (void) my_realpath(to, to, MYF(flag & MY_RESOLVE_SYMLINKS ? MY_RESOLVE_LINK: 0)); else if (flag & MY_RESOLVE_SYMLINKS) { strmov(buff,to); (void) my_readlink(to, buff, MYF(0)); } DBUG_RETURN(to); } /* fn_format */
File my_create_with_symlink(const char *linkname, const char *filename, int createflags, int access_flags, myf MyFlags) { File file; int tmp_errno; /* Test if we should create a link */ int create_link; char abs_linkname[FN_REFLEN]; DBUG_ENTER("my_create_with_symlink"); DBUG_PRINT("enter", ("linkname: %s filename: %s", linkname ? linkname : "(null)", filename ? filename : "(null)")); if (my_disable_symlinks) { DBUG_PRINT("info", ("Symlinks disabled")); /* Create only the file, not the link and file */ create_link= 0; if (linkname) filename= linkname; } else { if (linkname) my_realpath(abs_linkname, linkname, MYF(0)); create_link= (linkname && strcmp(abs_linkname,filename)); } if (!(MyFlags & MY_DELETE_OLD)) { if (!access(filename,F_OK)) { my_errno= errno= EEXIST; my_error(EE_CANTCREATEFILE, MYF(0), filename, EEXIST); DBUG_RETURN(-1); } if (create_link && !access(linkname,F_OK)) { my_errno= errno= EEXIST; my_error(EE_CANTCREATEFILE, MYF(0), linkname, EEXIST); DBUG_RETURN(-1); } } if ((file=my_create(filename, createflags, access_flags, MyFlags)) >= 0) { if (create_link) { /* Delete old link/file */ if (MyFlags & MY_DELETE_OLD) my_delete(linkname, MYF(0)); /* Create link */ if (my_symlink(filename, linkname, MyFlags)) { /* Fail, remove everything we have done */ tmp_errno=my_errno; my_close(file,MYF(0)); my_delete(filename, MYF(0)); file= -1; my_errno=tmp_errno; } } } DBUG_RETURN(file); }
int init_relay_log_info(Relay_log_info* rli, const char* info_fname) { char fname[FN_REFLEN+128]; int info_fd; const char* msg = 0; int error = 0; DBUG_ENTER("init_relay_log_info"); DBUG_ASSERT(!rli->no_storage); // Don't init if there is no storage if (rli->inited) // Set if this function called DBUG_RETURN(0); fn_format(fname, info_fname, mysql_data_home, "", 4+32); pthread_mutex_lock(&rli->data_lock); info_fd = rli->info_fd; rli->cur_log_fd = -1; rli->slave_skip_counter=0; rli->abort_pos_wait=0; rli->log_space_limit= relay_log_space_limit; rli->log_space_total= 0; rli->tables_to_lock= 0; rli->tables_to_lock_count= 0; char pattern[FN_REFLEN]; (void) my_realpath(pattern, slave_load_tmpdir, 0); if (fn_format(pattern, PREFIX_SQL_LOAD, pattern, "", MY_SAFE_PATH | MY_RETURN_REAL_PATH) == NullS) { pthread_mutex_unlock(&rli->data_lock); sql_print_error("Unable to use slave's temporary directory %s", slave_load_tmpdir); DBUG_RETURN(1); } unpack_filename(rli->slave_patternload_file, pattern); rli->slave_patternload_file_size= strlen(rli->slave_patternload_file); /* The relay log will now be opened, as a SEQ_READ_APPEND IO_CACHE. Note that the I/O thread flushes it to disk after writing every event, in flush_master_info(mi, 1, ?). */ /* For the maximum log size, we choose max_relay_log_size if it is non-zero, max_binlog_size otherwise. If later the user does SET GLOBAL on one of these variables, fix_max_binlog_size and fix_max_relay_log_size will reconsider the choice (for example if the user changes max_relay_log_size to zero, we have to switch to using max_binlog_size for the relay log) and update rli->relay_log.max_size (and mysql_bin_log.max_size). */ { /* Reports an error and returns, if the --relay-log's path is a directory.*/ if (opt_relay_logname && opt_relay_logname[strlen(opt_relay_logname) - 1] == FN_LIBCHAR) { pthread_mutex_unlock(&rli->data_lock); sql_print_error("Path '%s' is a directory name, please specify \ a file name for --relay-log option", opt_relay_logname); DBUG_RETURN(1); } /* Reports an error and returns, if the --relay-log-index's path is a directory.*/ if (opt_relaylog_index_name && opt_relaylog_index_name[strlen(opt_relaylog_index_name) - 1] == FN_LIBCHAR) { pthread_mutex_unlock(&rli->data_lock); sql_print_error("Path '%s' is a directory name, please specify \ a file name for --relay-log-index option", opt_relaylog_index_name); DBUG_RETURN(1); }