diff options
author | Stefan Hoffmann <stefan991@gmail.com> | 2014-04-26 18:23:49 +0200 |
---|---|---|
committer | Stefan Hoffmann <stefan991@gmail.com> | 2014-05-09 15:49:33 +0200 |
commit | 902ad8d94d9a1eafde858793587037e620c6ee6f (patch) | |
tree | e2dd0405439b1e2a703a3949729d12215dc7e032 | |
parent | a080819c3ef93c41a0bbd14b3c5f76d26bb9d404 (diff) | |
download | rneovim-902ad8d94d9a1eafde858793587037e620c6ee6f.tar.gz rneovim-902ad8d94d9a1eafde858793587037e620c6ee6f.tar.bz2 rneovim-902ad8d94d9a1eafde858793587037e620c6ee6f.zip |
replaced some mch_stat() with os_get_file_info()
-rw-r--r-- | src/eval.c | 13 | ||||
-rw-r--r-- | src/ex_cmds.c | 27 | ||||
-rw-r--r-- | src/ex_cmds2.c | 45 | ||||
-rw-r--r-- | src/file_search.c | 47 | ||||
-rw-r--r-- | src/fileio.c | 32 | ||||
-rw-r--r-- | src/if_cscope.c | 91 | ||||
-rw-r--r-- | src/if_cscope_defs.h | 5 | ||||
-rw-r--r-- | src/main.c | 13 | ||||
-rw-r--r-- | src/undo.c | 31 |
9 files changed, 103 insertions, 201 deletions
diff --git a/src/eval.c b/src/eval.c index b508d4257f..80135305c6 100644 --- a/src/eval.c +++ b/src/eval.c @@ -9713,15 +9713,14 @@ static void f_getfsize(typval_T *argvars, typval_T *rettv) */ static void f_getftime(typval_T *argvars, typval_T *rettv) { - char_u *fname; - struct stat st; - - fname = get_tv_string(&argvars[0]); + char *fname = (char *)get_tv_string(&argvars[0]); - if (mch_stat((char *)fname, &st) >= 0) - rettv->vval.v_number = (varnumber_T)st.st_mtime; - else + FileInfo file_info; + if (os_get_file_info(fname, &file_info)) { + rettv->vval.v_number = (varnumber_T)file_info.stat.st_mtim.tv_sec; + } else { rettv->vval.v_number = -1; + } } /* diff --git a/src/ex_cmds.c b/src/ex_cmds.c index c2c3b6631d..3613a02cb3 100644 --- a/src/ex_cmds.c +++ b/src/ex_cmds.c @@ -1496,9 +1496,6 @@ void write_viminfo(char_u *file, int forceit) #if defined(UNIX) mode_t umask_save; #endif -#ifdef UNIX - struct stat st_old; /* mch_stat() of existing viminfo file */ -#endif if (no_viminfo()) return; @@ -1535,16 +1532,15 @@ void write_viminfo(char_u *file, int forceit) * overwrite a user's viminfo file after a "su root", with a * viminfo file that the user can't read. */ - st_old.st_dev = (dev_t)0; - st_old.st_ino = 0; - st_old.st_mode = 0600; - if (mch_stat((char *)fname, &st_old) == 0 + + FileInfo old_info; // FileInfo of existing viminfo file + if (os_get_file_info((char *)fname, &old_info) && getuid() != ROOT_UID - && !(st_old.st_uid == getuid() - ? (st_old.st_mode & 0200) - : (st_old.st_gid == getgid() - ? (st_old.st_mode & 0020) - : (st_old.st_mode & 0002)))) { + && !(old_info.stat.st_uid == getuid() + ? (old_info.stat.st_mode & 0200) + : (old_info.stat.st_gid == getgid() + ? (old_info.stat.st_mode & 0020) + : (old_info.stat.st_mode & 0002)))) { int tt = msg_didany; /* avoid a wait_return for this message, it's annoying */ @@ -1596,7 +1592,7 @@ void write_viminfo(char_u *file, int forceit) umask_save = umask(0); fd = mch_open((char *)tempname, O_CREAT|O_EXCL|O_WRONLY|O_NOFOLLOW, - (int)((st_old.st_mode & 0777) | 0600)); + (int)((old_info.stat.st_mode & 0777) | 0600)); (void)umask(umask_save); # else fd = mch_open((char *)tempname, @@ -1622,8 +1618,9 @@ void write_viminfo(char_u *file, int forceit) * Make sure the owner can read/write it. This only works for * root. */ - if (fp_out != NULL) - ignored = fchown(fileno(fp_out), st_old.st_uid, st_old.st_gid); + if (fp_out != NULL) { + fchown(fileno(fp_out), old_info.stat.st_uid, old_info.stat.st_gid); + } #endif } } diff --git a/src/ex_cmds2.c b/src/ex_cmds2.c index aecd9995ba..0837e5386e 100644 --- a/src/ex_cmds2.c +++ b/src/ex_cmds2.c @@ -48,15 +48,13 @@ static void cmd_source(char_u *fname, exarg_T *eap); /* Growarray to store info about already sourced scripts. - * For Unix also store the dev/ino, so that we don't have to stat() each + * Also store the dev/ino, so that we don't have to stat() each * script when going through the list. */ typedef struct scriptitem_S { char_u *sn_name; -# ifdef UNIX int sn_dev_valid; - dev_t sn_dev; - ino_t sn_ino; -# endif + uint64_t sn_dev; + uint64_t sn_ino; int sn_prof_on; /* TRUE when script is/was profiled */ int sn_pr_force; /* forceit: profile functions in this script */ proftime_T sn_pr_child; /* time set when going into first child */ @@ -2458,10 +2456,6 @@ do_source ( void *save_funccalp; int save_debug_break_level = debug_break_level; scriptitem_T *si = NULL; -# ifdef UNIX - struct stat st; - int stat_ok; -# endif #ifdef STARTUPTIME struct timeval tv_rel; struct timeval tv_start; @@ -2622,23 +2616,19 @@ do_source ( * If it's new, generate a new SID. */ save_current_SID = current_SID; -# ifdef UNIX - stat_ok = (mch_stat((char *)fname_exp, &st) >= 0); -# endif + FileInfo file_info; + bool file_info_ok = os_get_file_info((char *)fname_exp, &file_info); for (current_SID = script_items.ga_len; current_SID > 0; --current_SID) { si = &SCRIPT_ITEM(current_SID); + // Compare dev/ino when possible, it catches symbolic links. + // Also compare file names, the inode may change when the file was edited. + bool file_id_equal = file_info_ok && si->sn_dev_valid + && si->sn_dev == file_info.stat.st_dev + && si->sn_ino == file_info.stat.st_ino; if (si->sn_name != NULL - && ( -# ifdef UNIX - /* Compare dev/ino when possible, it catches symbolic - * links. Also compare file names, the inode may change - * when the file was edited. */ - ((stat_ok && si->sn_dev_valid) - && (si->sn_dev == st.st_dev - && si->sn_ino == st.st_ino)) || -# endif - fnamecmp(si->sn_name, fname_exp) == 0)) + && (file_id_equal || fnamecmp(si->sn_name, fname_exp) == 0)) { break; + } } if (current_SID == 0) { current_SID = ++last_current_SID; @@ -2651,14 +2641,13 @@ do_source ( si = &SCRIPT_ITEM(current_SID); si->sn_name = fname_exp; fname_exp = NULL; -# ifdef UNIX - if (stat_ok) { + if (file_info_ok) { si->sn_dev_valid = TRUE; - si->sn_dev = st.st_dev; - si->sn_ino = st.st_ino; - } else + si->sn_dev = file_info.stat.st_dev; + si->sn_ino = file_info.stat.st_ino; + } else { si->sn_dev_valid = FALSE; -# endif + } /* Allocate the local script variables to use for this script. */ new_script_vars(current_SID); diff --git a/src/file_search.c b/src/file_search.c index 82b9689e09..96f0b71b73 100644 --- a/src/file_search.c +++ b/src/file_search.c @@ -110,11 +110,9 @@ typedef struct ff_visited { /* for unix use inode etc for comparison (needed because of links), else * use filename. */ -#ifdef UNIX int ffv_dev_valid; /* ffv_dev and ffv_ino were set */ - dev_t ffv_dev; /* device number */ - ino_t ffv_ino; /* inode number */ -#endif + uint64_t ffv_dev; /* device number */ + uint64_t ffv_ino; /* inode number */ /* The memory for this struct is allocated according to the length of * ffv_fname. */ @@ -1126,38 +1124,27 @@ static int ff_wc_equal(char_u *s1, char_u *s2) static int ff_check_visited(ff_visited_T **visited_list, char_u *fname, char_u *wc_path) { ff_visited_T *vp; -#ifdef UNIX - struct stat st; - int url = FALSE; -#endif + bool url = false; - /* For an URL we only compare the name, otherwise we compare the - * device/inode (unix) or the full path name (not Unix). */ + FileInfo file_info; + // For an URL we only compare the name, otherwise we compare the + // device/inode. if (path_with_url(fname)) { vim_strncpy(ff_expand_buffer, fname, MAXPATHL - 1); -#ifdef UNIX - url = TRUE; -#endif + url = true; } else { ff_expand_buffer[0] = NUL; -#ifdef UNIX - if (mch_stat((char *)fname, &st) < 0) -#else - if (vim_FullName(fname, ff_expand_buffer, MAXPATHL, TRUE) == FAIL) -#endif + if (!os_get_file_info((char *)fname, &file_info)) { return FAIL; + } } /* check against list of already visited files */ for (vp = *visited_list; vp != NULL; vp = vp->ffv_next) { - if ( -#ifdef UNIX - !url ? (vp->ffv_dev_valid && vp->ffv_dev == st.st_dev - && vp->ffv_ino == st.st_ino) - : -#endif - fnamecmp(vp->ffv_fname, ff_expand_buffer) == 0 - ) { + if ((url && fnamecmp(vp->ffv_fname, ff_expand_buffer) == 0) + || (!url && vp->ffv_dev_valid + && vp->ffv_dev == file_info.stat.st_dev + && vp->ffv_ino == file_info.stat.st_ino)) { /* are the wildcard parts equal */ if (ff_wc_equal(vp->ffv_wc_path, wc_path) == TRUE) /* already visited */ @@ -1171,19 +1158,15 @@ static int ff_check_visited(ff_visited_T **visited_list, char_u *fname, char_u * vp = (ff_visited_T *)alloc((unsigned)(sizeof(ff_visited_T) + STRLEN(ff_expand_buffer))); -#ifdef UNIX if (!url) { vp->ffv_dev_valid = TRUE; - vp->ffv_ino = st.st_ino; - vp->ffv_dev = st.st_dev; + vp->ffv_ino = file_info.stat.st_ino; + vp->ffv_dev = file_info.stat.st_dev; vp->ffv_fname[0] = NUL; } else { vp->ffv_dev_valid = FALSE; STRCPY(vp->ffv_fname, ff_expand_buffer); } -#else - STRCPY(vp->ffv_fname, ff_expand_buffer); -#endif if (wc_path != NULL) vp->ffv_wc_path = vim_strsave(wc_path); diff --git a/src/fileio.c b/src/fileio.c index d7ee26297c..b692f38c3d 100644 --- a/src/fileio.c +++ b/src/fileio.c @@ -4813,12 +4813,11 @@ int vim_rename(char_u *from, char_u *to) int n; char *errmsg = NULL; char *buffer; - struct stat st; long perm; #ifdef HAVE_ACL vim_acl_T acl; /* ACL from original file */ #endif - int use_tmp_file = FALSE; + bool use_tmp_file = false; /* * When the names are identical, there is nothing to do. When they refer @@ -4827,30 +4826,25 @@ int vim_rename(char_u *from, char_u *to) */ if (fnamecmp(from, to) == 0) { if (p_fic && STRCMP(path_tail(from), path_tail(to)) != 0) - use_tmp_file = TRUE; + use_tmp_file = true; else return 0; } - /* - * Fail if the "from" file doesn't exist. Avoids that "to" is deleted. - */ - if (mch_stat((char *)from, &st) < 0) + // Fail if the "from" file doesn't exist. Avoids that "to" is deleted. + FileInfo from_info; + if (!os_get_file_info((char *)from, &from_info)) { return -1; + } -#ifdef UNIX - { - struct stat st_to; - - /* It's possible for the source and destination to be the same file. - * This happens when "from" and "to" differ in case and are on a FAT32 - * filesystem. In that case go through a temp file name. */ - if (mch_stat((char *)to, &st_to) >= 0 - && st.st_dev == st_to.st_dev - && st.st_ino == st_to.st_ino) - use_tmp_file = TRUE; + // It's possible for the source and destination to be the same file. + // This happens when "from" and "to" differ in case and are on a FAT32 + // filesystem. In that case go through a temp file name. + FileInfo to_info; + if (os_get_file_info((char *)to, &to_info) + && os_file_info_id_equal(&from_info, &to_info)) { + use_tmp_file = true; } -#endif if (use_tmp_file) { char_u tempname[MAXPATHL + 1]; diff --git a/src/if_cscope.c b/src/if_cscope.c index eadd1e5b1a..b000b03444 100644 --- a/src/if_cscope.c +++ b/src/if_cscope.c @@ -52,8 +52,7 @@ static int cs_find_common(char *opt, char *pat, int, int, int, char_u *cmdline); static int cs_help(exarg_T *eap); static void clear_csinfo(int i); -static int cs_insert_filelist(char *, char *, char *, - struct stat *); +static int cs_insert_filelist(char *, char *, char *, FileInfo *file_info); static int cs_kill(exarg_T *eap); static void cs_kill_execute(int, char *); static cscmd_T * cs_lookup_cmd(exarg_T *eap); @@ -481,8 +480,6 @@ cs_add_common ( char *flags ) { - struct stat statbuf; - int ret; char *fname = NULL; char *fname2 = NULL; char *ppath = NULL; @@ -503,28 +500,25 @@ cs_add_common ( goto add_err; fname = (char *)vim_strnsave((char_u *)fname, len); free(fbuf); - ret = stat(fname, &statbuf); - if (ret < 0) { + FileInfo file_info; + bool file_info_ok = os_get_file_info(fname, &file_info); + if (!file_info_ok) { staterr: if (p_csverbose) cs_stat_emsg(fname); goto add_err; } - /* get the prepend path (arg2), expand it, and try to stat it */ + // get the prepend path (arg2), expand it, and see if it exists if (arg2 != NULL) { - struct stat statbuf2; - ppath = (char *)alloc(MAXPATHL + 1); - expand_env((char_u *)arg2, (char_u *)ppath, MAXPATHL); - ret = stat(ppath, &statbuf2); - if (ret < 0) + if (!os_file_exists((char_u *)ppath)) goto staterr; } /* if filename is a directory, append the cscope database name to it */ - if ((statbuf.st_mode & S_IFMT) == S_IFDIR) { + if ((file_info.stat.st_mode & S_IFMT) == S_IFDIR) { fname2 = (char *)alloc((unsigned)(strlen(CSCOPE_DBFILE) + strlen(fname) + 2)); while (fname[strlen(fname)-1] == '/' @@ -538,23 +532,18 @@ staterr: else (void)sprintf(fname2, "%s/%s", fname, CSCOPE_DBFILE); - ret = stat(fname2, &statbuf); - if (ret < 0) { + file_info_ok = os_get_file_info(fname2, &file_info); + if (!file_info_ok) { if (p_csverbose) cs_stat_emsg(fname2); goto add_err; } - i = cs_insert_filelist(fname2, ppath, flags, &statbuf); + i = cs_insert_filelist(fname2, ppath, flags, &file_info); } -#if defined(UNIX) - else if (S_ISREG(statbuf.st_mode) || S_ISLNK(statbuf.st_mode)) -#else - /* WIN32 - substitute define S_ISREG from os_unix_defs.h */ - else if (((statbuf.st_mode) & S_IFMT) == S_IFREG) -#endif + else if (S_ISREG(file_info.stat.st_mode) || S_ISLNK(file_info.stat.st_mode)) { - i = cs_insert_filelist(fname, ppath, flags, &statbuf); + i = cs_insert_filelist(fname, ppath, flags, &file_info); } else { if (p_csverbose) (void)EMSG2( @@ -1223,53 +1212,16 @@ static char *GetWin32Error(void) * * insert a new cscope database filename into the filelist */ -static int cs_insert_filelist(char *fname, char *ppath, char *flags, struct stat *sb) +static int cs_insert_filelist(char *fname, char *ppath, char *flags, + FileInfo *file_info) { short i, j; -#ifndef UNIX - BY_HANDLE_FILE_INFORMATION bhfi; - - /* On windows 9x GetFileInformationByHandle doesn't work, so skip it */ - if (!mch_windows95()) { - switch (win32_fileinfo(fname, &bhfi)) { - case FILEINFO_ENC_FAIL: /* enc_to_utf16() failed */ - case FILEINFO_READ_FAIL: /* CreateFile() failed */ - if (p_csverbose) { - char *cant_msg = _("E625: cannot open cscope database: %s"); - char *winmsg = GetWin32Error(); - - if (winmsg != NULL) { - (void)EMSG2(cant_msg, winmsg); - LocalFree(winmsg); - } else - /* subst filename if can't get error text */ - (void)EMSG2(cant_msg, fname); - } - return -1; - - case FILEINFO_INFO_FAIL: /* GetFileInformationByHandle() failed */ - if (p_csverbose) - (void)EMSG(_("E626: cannot get cscope database information")); - return -1; - } - } -#endif i = -1; /* can be set to the index of an empty item in csinfo */ for (j = 0; j < csinfo_size; j++) { if (csinfo[j].fname != NULL -#if defined(UNIX) - && csinfo[j].st_dev == sb->st_dev && csinfo[j].st_ino == sb->st_ino -#else - /* compare pathnames first */ - && ((path_full_compare(csinfo[j].fname, fname, FALSE) & kEqualFiles) - /* if not Windows 9x, test index file attributes too */ - || (!mch_windows95() - && csinfo[j].nVolume == bhfi.dwVolumeSerialNumber - && csinfo[j].nIndexHigh == bhfi.nFileIndexHigh - && csinfo[j].nIndexLow == bhfi.nFileIndexLow)) -#endif - ) { + && csinfo[j].st_dev == file_info->stat.st_dev + && csinfo[j].st_ino == file_info->stat.st_ino) { if (p_csverbose) (void)EMSG(_("E568: duplicate cscope database not added")); return -1; @@ -1312,15 +1264,8 @@ static int cs_insert_filelist(char *fname, char *ppath, char *flags, struct stat } else csinfo[i].flags = NULL; -#if defined(UNIX) - csinfo[i].st_dev = sb->st_dev; - csinfo[i].st_ino = sb->st_ino; - -#else - csinfo[i].nVolume = bhfi.dwVolumeSerialNumber; - csinfo[i].nIndexLow = bhfi.nFileIndexLow; - csinfo[i].nIndexHigh = bhfi.nFileIndexHigh; -#endif + csinfo[i].st_dev = file_info->stat.st_dev; + csinfo[i].st_ino = file_info->stat.st_ino; return i; } /* cs_insert_filelist */ diff --git a/src/if_cscope_defs.h b/src/if_cscope_defs.h index 7a60da20dd..3c64067795 100644 --- a/src/if_cscope_defs.h +++ b/src/if_cscope_defs.h @@ -51,10 +51,9 @@ typedef struct csi { char * flags; /* additional cscope flags/options (e.g, -p2) */ #if defined(UNIX) pid_t pid; /* PID of the connected cscope process. */ - dev_t st_dev; /* ID of dev containing cscope db */ - ino_t st_ino; /* inode number of cscope db */ -#else #endif + uint64_t st_dev; /* ID of dev containing cscope db */ + uint64_t st_ino; /* inode number of cscope db */ FILE * fr_fp; /* from cscope: FILE. */ FILE * to_fp; /* to cscope: FILE. */ diff --git a/src/main.c b/src/main.c index 9fd97b23a5..828a6d5200 100644 --- a/src/main.c +++ b/src/main.c @@ -2130,14 +2130,13 @@ process_env ( */ static int file_owned(char *fname) { - struct stat s; uid_t uid = getuid(); - - return !(mch_stat(fname, &s) != 0 || s.st_uid != uid -# ifdef HAVE_LSTAT - || mch_lstat(fname, &s) != 0 || s.st_uid != uid -# endif - ); + FileInfo file_info; + bool file_owned = os_get_file_info(fname, &file_info) + && file_info.stat.st_uid == uid; + bool link_owned = os_get_file_info_link(fname, &file_info) + && file_info.stat.st_uid == uid; + return file_owned && link_owned; } #endif diff --git a/src/undo.c b/src/undo.c index b93a3e6e32..47ce8ee8da 100644 --- a/src/undo.c +++ b/src/undo.c @@ -1106,10 +1106,6 @@ void u_write_undo(char_u *name, int forceit, buf_T *buf, char_u *hash) FILE *fp = NULL; int perm; int write_ok = FALSE; -#ifdef UNIX - struct stat st_old; - struct stat st_new; -#endif int do_crypt = FALSE; if (name == NULL) { @@ -1215,14 +1211,17 @@ void u_write_undo(char_u *name, int forceit, buf_T *buf, char_u *hash) * this fails, set the protection bits for the group same as the * protection bits for others. */ - if (mch_stat((char *)buf->b_ffname, &st_old) >= 0 - && mch_stat((char *)file_name, &st_new) >= 0 - && st_new.st_gid != st_old.st_gid + FileInfo file_info_old; + FileInfo file_info_new; + if (os_get_file_info((char *)buf->b_ffname, &file_info_old) + && os_get_file_info((char *)file_name, &file_info_new) + && file_info_old.stat.st_gid != file_info_new.stat.st_gid # ifdef HAVE_FCHOWN /* sequent-ptx lacks fchown() */ - && fchown(fd, (uid_t)-1, st_old.st_gid) != 0 + && fchown(fd, (uid_t)-1, file_info_old.stat.st_gid) != 0 # endif - ) + ) { os_setperm(file_name, (perm & 0707) | ((perm & 07) << 3)); + } # ifdef HAVE_SELINUX if (buf->b_ffname != NULL) mch_copy_sec(buf->b_ffname, file_name); @@ -1343,10 +1342,6 @@ void u_read_undo(char_u *name, char_u *hash, char_u *orig_name) #ifdef U_DEBUG int *uhp_table_used; #endif -#ifdef UNIX - struct stat st_orig; - struct stat st_undo; -#endif int do_decrypt = FALSE; if (name == NULL) { @@ -1357,10 +1352,12 @@ void u_read_undo(char_u *name, char_u *hash, char_u *orig_name) #ifdef UNIX /* For safety we only read an undo file if the owner is equal to the * owner of the text file or equal to the current user. */ - if (mch_stat((char *)orig_name, &st_orig) >= 0 - && mch_stat((char *)file_name, &st_undo) >= 0 - && st_orig.st_uid != st_undo.st_uid - && st_undo.st_uid != getuid()) { + FileInfo file_info_orig; + FileInfo file_info_undo; + if (os_get_file_info((char *)orig_name, &file_info_orig) + && os_get_file_info((char *)file_name, &file_info_undo) + && file_info_orig.stat.st_uid != file_info_undo.stat.st_uid + && file_info_undo.stat.st_uid != getuid()) { if (p_verbose > 0) { verbose_enter(); smsg((char_u *)_("Not reading undo file, owner differs: %s"), |