mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
os_unix: Port mch_FullName and mch_isFullName to libuv.
Basically just delete conditional use of fchdir, since the other called mch_* functions are already ported to libuv.
This commit is contained in:
parent
60280ffa10
commit
8437a4c972
@ -12,6 +12,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "vim.h"
|
#include "vim.h"
|
||||||
|
#include "os/os.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Variables shared between getcmdline(), redrawcmdline() and others.
|
* Variables shared between getcmdline(), redrawcmdline() and others.
|
||||||
|
@ -43,6 +43,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "vim.h"
|
#include "vim.h"
|
||||||
|
#include "os/os.h"
|
||||||
|
|
||||||
#ifndef UNIX /* it's in os_unix.h for Unix */
|
#ifndef UNIX /* it's in os_unix.h for Unix */
|
||||||
# include <time.h>
|
# include <time.h>
|
||||||
|
88
src/os/fs.c
88
src/os/fs.c
@ -37,3 +37,91 @@ int mch_dirname(char_u *buf, int len)
|
|||||||
}
|
}
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Get absolute file name into "buf[len]".
|
||||||
|
*
|
||||||
|
* return FAIL for failure, OK for success
|
||||||
|
*/
|
||||||
|
int mch_FullName(
|
||||||
|
char_u *fname,
|
||||||
|
char_u *buf,
|
||||||
|
int len,
|
||||||
|
int force /* also expand when already absolute path */
|
||||||
|
)
|
||||||
|
{
|
||||||
|
int l;
|
||||||
|
char_u olddir[MAXPATHL];
|
||||||
|
char_u *p;
|
||||||
|
int retval = OK;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* expand it if forced or not an absolute path */
|
||||||
|
if (force || !mch_isFullName(fname)) {
|
||||||
|
/*
|
||||||
|
* If the file name has a path, change to that directory for a moment,
|
||||||
|
* and then do the getwd() (and get back to where we were).
|
||||||
|
* This will get the correct path name with "../" things.
|
||||||
|
*/
|
||||||
|
if ((p = vim_strrchr(fname, '/')) != NULL) {
|
||||||
|
|
||||||
|
/* Only change directory when we are sure we can return to where
|
||||||
|
* we are now. After doing "su" chdir(".") might not work. */
|
||||||
|
if ((mch_dirname(olddir, MAXPATHL) == FAIL
|
||||||
|
|| mch_chdir((char *)olddir) != 0)) {
|
||||||
|
p = NULL; /* can't get current dir: don't chdir */
|
||||||
|
retval = FAIL;
|
||||||
|
} else {
|
||||||
|
/* The directory is copied into buf[], to be able to remove
|
||||||
|
* the file name without changing it (could be a string in
|
||||||
|
* read-only memory) */
|
||||||
|
if (p - fname >= len)
|
||||||
|
retval = FAIL;
|
||||||
|
else {
|
||||||
|
vim_strncpy(buf, fname, p - fname);
|
||||||
|
if (mch_chdir((char *)buf))
|
||||||
|
retval = FAIL;
|
||||||
|
else
|
||||||
|
fname = p + 1;
|
||||||
|
*buf = NUL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (mch_dirname(buf, len) == FAIL) {
|
||||||
|
retval = FAIL;
|
||||||
|
*buf = NUL;
|
||||||
|
}
|
||||||
|
if (p != NULL) {
|
||||||
|
l = mch_chdir((char *)olddir);
|
||||||
|
if (l != 0)
|
||||||
|
EMSG(_(e_prev_dir));
|
||||||
|
}
|
||||||
|
|
||||||
|
l = STRLEN(buf);
|
||||||
|
if (l >= len - 1)
|
||||||
|
retval = FAIL; /* no space for trailing "/" */
|
||||||
|
else if (l > 0 && buf[l - 1] != '/' && *fname != NUL
|
||||||
|
&& STRCMP(fname, ".") != 0)
|
||||||
|
STRCAT(buf, "/");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Catch file names which are too long. */
|
||||||
|
if (retval == FAIL || (int)(STRLEN(buf) + STRLEN(fname)) >= len)
|
||||||
|
return FAIL;
|
||||||
|
|
||||||
|
/* Do not append ".", "/dir/." is equal to "/dir". */
|
||||||
|
if (STRCMP(fname, ".") != 0)
|
||||||
|
STRCAT(buf, fname);
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return TRUE if "fname" does not depend on the current directory.
|
||||||
|
*/
|
||||||
|
int mch_isFullName(char_u *fname)
|
||||||
|
{
|
||||||
|
return *fname == '/' || *fname == '~';
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -6,5 +6,7 @@
|
|||||||
long_u mch_total_mem(int special);
|
long_u mch_total_mem(int special);
|
||||||
int mch_chdir(char *path);
|
int mch_chdir(char *path);
|
||||||
int mch_dirname(char_u *buf, int len);
|
int mch_dirname(char_u *buf, int len);
|
||||||
|
int mch_FullName (char_u *fname, char_u *buf, int len, int force);
|
||||||
|
int mch_isFullName (char_u *fname);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
121
src/os_unix.c
121
src/os_unix.c
@ -1244,127 +1244,6 @@ static char * strerror(int err)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
|
||||||
* Get absolute file name into "buf[len]".
|
|
||||||
*
|
|
||||||
* return FAIL for failure, OK for success
|
|
||||||
*/
|
|
||||||
int mch_FullName(
|
|
||||||
char_u *fname,
|
|
||||||
char_u *buf,
|
|
||||||
int len,
|
|
||||||
int force /* also expand when already absolute path */
|
|
||||||
)
|
|
||||||
{
|
|
||||||
int l;
|
|
||||||
#ifdef HAVE_FCHDIR
|
|
||||||
int fd = -1;
|
|
||||||
static int dont_fchdir = FALSE; /* TRUE when fchdir() doesn't work */
|
|
||||||
#endif
|
|
||||||
char_u olddir[MAXPATHL];
|
|
||||||
char_u *p;
|
|
||||||
int retval = OK;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* expand it if forced or not an absolute path */
|
|
||||||
if (force || !mch_isFullName(fname)) {
|
|
||||||
/*
|
|
||||||
* If the file name has a path, change to that directory for a moment,
|
|
||||||
* and then do the getwd() (and get back to where we were).
|
|
||||||
* This will get the correct path name with "../" things.
|
|
||||||
*/
|
|
||||||
if ((p = vim_strrchr(fname, '/')) != NULL) {
|
|
||||||
#ifdef HAVE_FCHDIR
|
|
||||||
/*
|
|
||||||
* Use fchdir() if possible, it's said to be faster and more
|
|
||||||
* reliable. But on SunOS 4 it might not work. Check this by
|
|
||||||
* doing a fchdir() right now.
|
|
||||||
*/
|
|
||||||
if (!dont_fchdir) {
|
|
||||||
fd = open(".", O_RDONLY | O_EXTRA, 0);
|
|
||||||
if (fd >= 0 && fchdir(fd) < 0) {
|
|
||||||
close(fd);
|
|
||||||
fd = -1;
|
|
||||||
dont_fchdir = TRUE; /* don't try again */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Only change directory when we are sure we can return to where
|
|
||||||
* we are now. After doing "su" chdir(".") might not work. */
|
|
||||||
if (
|
|
||||||
#ifdef HAVE_FCHDIR
|
|
||||||
fd < 0 &&
|
|
||||||
#endif
|
|
||||||
(mch_dirname(olddir, MAXPATHL) == FAIL
|
|
||||||
|| mch_chdir((char *)olddir) != 0)) {
|
|
||||||
p = NULL; /* can't get current dir: don't chdir */
|
|
||||||
retval = FAIL;
|
|
||||||
} else {
|
|
||||||
/* The directory is copied into buf[], to be able to remove
|
|
||||||
* the file name without changing it (could be a string in
|
|
||||||
* read-only memory) */
|
|
||||||
if (p - fname >= len)
|
|
||||||
retval = FAIL;
|
|
||||||
else {
|
|
||||||
vim_strncpy(buf, fname, p - fname);
|
|
||||||
if (mch_chdir((char *)buf))
|
|
||||||
retval = FAIL;
|
|
||||||
else
|
|
||||||
fname = p + 1;
|
|
||||||
*buf = NUL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (mch_dirname(buf, len) == FAIL) {
|
|
||||||
retval = FAIL;
|
|
||||||
*buf = NUL;
|
|
||||||
}
|
|
||||||
if (p != NULL) {
|
|
||||||
#ifdef HAVE_FCHDIR
|
|
||||||
if (fd >= 0) {
|
|
||||||
if (p_verbose >= 5) {
|
|
||||||
verbose_enter();
|
|
||||||
MSG("fchdir() to previous dir");
|
|
||||||
verbose_leave();
|
|
||||||
}
|
|
||||||
l = fchdir(fd);
|
|
||||||
close(fd);
|
|
||||||
} else
|
|
||||||
#endif
|
|
||||||
l = mch_chdir((char *)olddir);
|
|
||||||
if (l != 0)
|
|
||||||
EMSG(_(e_prev_dir));
|
|
||||||
}
|
|
||||||
|
|
||||||
l = STRLEN(buf);
|
|
||||||
if (l >= len - 1)
|
|
||||||
retval = FAIL; /* no space for trailing "/" */
|
|
||||||
else if (l > 0 && buf[l - 1] != '/' && *fname != NUL
|
|
||||||
&& STRCMP(fname, ".") != 0)
|
|
||||||
STRCAT(buf, "/");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Catch file names which are too long. */
|
|
||||||
if (retval == FAIL || (int)(STRLEN(buf) + STRLEN(fname)) >= len)
|
|
||||||
return FAIL;
|
|
||||||
|
|
||||||
/* Do not append ".", "/dir/." is equal to "/dir". */
|
|
||||||
if (STRCMP(fname, ".") != 0)
|
|
||||||
STRCAT(buf, fname);
|
|
||||||
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Return TRUE if "fname" does not depend on the current directory.
|
|
||||||
*/
|
|
||||||
int mch_isFullName(char_u *fname)
|
|
||||||
{
|
|
||||||
return *fname == '/' || *fname == '~';
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(USE_FNAME_CASE) || defined(PROTO)
|
#if defined(USE_FNAME_CASE) || defined(PROTO)
|
||||||
/*
|
/*
|
||||||
* Set the case of the file name, if it already exists. This will cause the
|
* Set the case of the file name, if it already exists. This will cause the
|
||||||
|
@ -28,8 +28,6 @@ int mch_get_uname __ARGS((uid_t uid, char_u *s, int len));
|
|||||||
void mch_get_host_name __ARGS((char_u *s, int len));
|
void mch_get_host_name __ARGS((char_u *s, int len));
|
||||||
long mch_get_pid __ARGS((void));
|
long mch_get_pid __ARGS((void));
|
||||||
void slash_adjust __ARGS((char_u *p));
|
void slash_adjust __ARGS((char_u *p));
|
||||||
int mch_FullName __ARGS((char_u *fname, char_u *buf, int len, int force));
|
|
||||||
int mch_isFullName __ARGS((char_u *fname));
|
|
||||||
void fname_case __ARGS((char_u *name, int len));
|
void fname_case __ARGS((char_u *name, int len));
|
||||||
long mch_getperm __ARGS((char_u *name));
|
long mch_getperm __ARGS((char_u *name));
|
||||||
int mch_setperm __ARGS((char_u *name, long perm));
|
int mch_setperm __ARGS((char_u *name, long perm));
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "vim.h"
|
#include "vim.h"
|
||||||
|
#include "os/os.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Structure that stores information about a highlight group.
|
* Structure that stores information about a highlight group.
|
||||||
|
Loading…
Reference in New Issue
Block a user