nano-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] fix building for Windows


From: Mike Frysinger
Subject: [PATCH] fix building for Windows
Date: Sat, 26 Feb 2022 02:15:46 -0500

Fix building with x86_64-w64-mingw32 to cross-compile native Windows
programs.  Need to:
* add checks for missing functions
* don't use signals that are unavailable on the platform
* avoid useless non-Linux sys/ioctl.h include
* use putenv instead of setenv as the latter is unavailable
---
 configure.ac |  1 +
 src/files.c  | 24 ++++++++++++++++++++++--
 src/nano.c   | 12 +++++++++---
 src/text.c   |  6 ++++++
 4 files changed, 38 insertions(+), 5 deletions(-)

diff --git a/configure.ac b/configure.ac
index 6f25728865e4..ad87344d7bbc 100644
--- a/configure.ac
+++ b/configure.ac
@@ -353,6 +353,7 @@ dnl Checks for functions.
 if test "x$enable_utf8" != xno; then
        AC_CHECK_FUNCS(iswalpha iswalnum iswpunct mbstowcs wctomb)
 fi
+AC_CHECK_FUNCS_ONCE(chmod chown fchmod fchown flockfile fork fsync funlockfile 
geteuid pipe wait waitpid)
 
 dnl Checks for available flags.
 
diff --git a/src/files.c b/src/files.c
index 62cc8f211954..3d27b593a12e 100644
--- a/src/files.c
+++ b/src/files.c
@@ -33,6 +33,10 @@
 
 #define RW_FOR_ALL  (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH)
 
+#ifndef HAVE_FSYNC
+# define fsync(...) 0
+#endif
+
 /* Add an item to the circular list of openfile structs. */
 void make_new_buffer(void)
 {
@@ -143,7 +147,7 @@ const char *locking_suffix = ".swp";
  * existing version of that file.  Return TRUE on success; FALSE otherwise. */
 bool write_lockfile(const char *lockfilename, const char *filename, bool 
modified)
 {
-#ifdef HAVE_PWD_H
+#if defined(HAVE_PWD_H) && defined(HAVE_GETEUID)
        pid_t mypid = getpid();
        uid_t myuid = geteuid();
        struct passwd *mypwuid = getpwuid(myuid);
@@ -411,7 +415,7 @@ bool open_buffer(const char *filename, bool new_one)
                        free(realname);
                        return FALSE;
                }
-#else
+#elif defined(HAVE_GETEUID)
                if (new_one && !(fileinfo.st_mode & (S_IWUSR|S_IWGRP|S_IWOTH)) 
&&
                                                geteuid() == ROOT_UID)
                        statusline(ALERT, _("%s is meant to be read-only"), 
realname);
@@ -677,7 +681,11 @@ void read_file(FILE *f, int fd, const char *filename, bool 
undoable)
 
        /* Lock the file before starting to read it, to avoid the overhead
         * of locking it for each single byte that we read from it. */
+#ifdef HAVE_FLOCKFILE
        flockfile(f);
+#else
+# define getc_unlocked getc
+#endif
 
        control_C_was_pressed = FALSE;
 
@@ -742,7 +750,9 @@ void read_file(FILE *f, int fd, const char *filename, bool 
undoable)
        errornumber = errno;
 
        /* We are done with the file, unlock it. */
+#ifdef HAVE_FUNLOCKFILE
        funlockfile(f);
+#endif
 
 #ifndef NANO_TINY
        block_sigwinch(FALSE);
@@ -950,7 +960,9 @@ static pid_t pid_of_command = -1;
 /* Send an unconditional kill signal to the running external command. */
 void cancel_the_command(int signal)
 {
+#ifdef SIGKILL
        kill(pid_of_command, SIGKILL);
+#endif
 }
 
 /* Send the text that starts at the given line to file descriptor fd. */
@@ -973,6 +985,7 @@ void send_data(const linestruct *line, int fd)
 /* Execute the given command in a shell.  Return TRUE on success. */
 bool execute_command(const char *command)
 {
+#if defined(HAVE_FORK) && defined(HAVE_PIPE) && defined(HAVE_WAIT)
        int from_fd[2], to_fd[2];
                /* The pipes through which text will be written and read. */
        struct sigaction oldaction, newaction = {{0}};
@@ -1106,6 +1119,9 @@ bool execute_command(const char *command)
        terminal_init();
 
        return TRUE;
+#else
+       return FALSE;
+#endif
 }
 #endif /* NANO_TINY */
 
@@ -1655,19 +1671,23 @@ bool make_backup_of(char *realname)
 
        /* Try to change owner and group to those of the original file;
         * ignore permission errors, as a normal user cannot change the owner. 
*/
+#ifdef HAVE_FCHOWN
        if (fchown(descriptor, openfile->statinfo->st_uid,
                                                        
openfile->statinfo->st_gid) < 0 && errno != EPERM) {
                fclose(backup_file);
                goto problem;
        }
+#endif
 
        /* Set the backup's permissions to those of the original file.
         * It is not a security issue if this fails, as we have created
         * the file with just read and write permission for the owner. */
+#ifdef HAVE_FCHMOD
        if (fchmod(descriptor, openfile->statinfo->st_mode) < 0 && errno != 
EPERM) {
                fclose(backup_file);
                goto problem;
        }
+#endif
 
        original = fopen(realname, "rb");
 
diff --git a/src/nano.c b/src/nano.c
index 04ecdbbf3492..d551c9e2a1ed 100644
--- a/src/nano.c
+++ b/src/nano.c
@@ -26,7 +26,7 @@
 #include <errno.h>
 #include <fcntl.h>
 #include <getopt.h>
-#if defined(__linux__) || !defined(NANO_TINY)
+#if defined(__linux__)
 #include <sys/ioctl.h>
 #endif
 #ifdef ENABLE_UTF8
@@ -339,7 +339,7 @@ void emergency_save(const char *filename)
                fprintf(stderr, _("\nToo many .save files\n"));
        else if (write_file(targetname, NULL, SPECIAL, OVERWRITE, NONOTES)) {
                fprintf(stderr, _("\nBuffer written to %s\n"), targetname);
-#ifndef NANO_TINY
+#if !defined(NANO_TINY) && defined(HAVE_CHMOD) && defined(HAVE_CHOWN)
                /* Try to chmod/chown the saved file to the values of the 
original file,
                 * but ignore any failure as we are in a hurry to get out. */
                if (openfile->statinfo) {
@@ -896,7 +896,9 @@ void signal_init(void)
 #ifndef NANO_TINY
        /* Trap SIGWINCH because we want to handle window resizes. */
        deed.sa_handler = handle_sigwinch;
+#ifdef SIGWINCH
        sigaction(SIGWINCH, &deed, NULL);
+#endif
 
 #ifdef SIGTSTP
        /* Prevent the suspend handler from getting interrupted. */
@@ -1001,7 +1003,9 @@ void block_sigwinch(bool blockit)
        sigset_t winch;
 
        sigemptyset(&winch);
+#ifdef SIGWINCH
        sigaddset(&winch, SIGWINCH);
+#endif
        sigprocmask(blockit ? SIG_BLOCK : SIG_UNBLOCK, &winch, NULL);
 
 #ifndef NANO_TINY
@@ -1787,9 +1791,11 @@ int main(int argc, char **argv)
        tcgetattr(STDIN_FILENO, &original_state);
 
        /* Get the state of standard input and ensure it uses blocking mode. */
+#if defined(F_GETFL) && defined(F_SETFL)
        stdin_flags = fcntl(STDIN_FILENO, F_GETFL, 0);
        if (stdin_flags != -1)
                fcntl(STDIN_FILENO, F_SETFL, stdin_flags & ~O_NONBLOCK);
+#endif
 
 #ifdef ENABLE_UTF8
        /* If setting the locale is successful and it uses UTF-8, we will
@@ -2072,7 +2078,7 @@ int main(int argc, char **argv)
 
        /* Curses needs TERM; if it is unset, try falling back to a VT220. */
        if (getenv("TERM") == NULL)
-               setenv("TERM", "vt220", 0);
+               putenv("TERM=vt220");
 
        /* Enter into curses mode.  Abort if this fails. */
        if (initscr() == NULL)
diff --git a/src/text.c b/src/text.c
index 0db4be1bfdd4..d8f51fb1b79a 100644
--- a/src/text.c
+++ b/src/text.c
@@ -2061,6 +2061,7 @@ bool replace_buffer(const char *filename, undo_type 
action, const char *operatio
 /* Execute the given program, with the given temp file as last argument. */
 void treat(char *tempfile_name, char *theprogram, bool spelling)
 {
+#if defined(HAVE_FORK) && defined(HAVE_WAIT)
        ssize_t was_lineno = openfile->current->lineno;
        size_t was_pww = openfile->placewewant;
        size_t was_x = openfile->current_x;
@@ -2183,6 +2184,7 @@ void treat(char *tempfile_name, char *theprogram, bool 
spelling)
                statusline(REMARK, _("Finished checking spelling"));
        else
                statusline(REMARK, _("Buffer has been processed"));
+#endif
 }
 #endif /* ENABLE_SPELLER || ENABLE_COLOR */
 
@@ -2295,6 +2297,7 @@ bool fix_spello(const char *word)
  * correction. */
 void do_int_speller(const char *tempfile_name)
 {
+#if defined(HAVE_FORK) && defined(HAVE_WAITPID)
        char *misspellings, *pointer, *oneword;
        long pipesize;
        size_t buffersize, bytesread, totalread;
@@ -2468,6 +2471,7 @@ void do_int_speller(const char *tempfile_name)
                statusline(ALERT, _("Error invoking \"spell\""));
        else
                statusline(REMARK, _("Finished checking spelling"));
+#endif
 }
 
 /* Spell check the current file.  If an alternate spell checker is
@@ -2533,6 +2537,7 @@ void do_spell(void)
 /* Run a linting program on the current buffer. */
 void do_linter(void)
 {
+#if defined(HAVE_FORK) && defined(HAVE_WAITPID)
        char *lintings, *pointer, *onelint;
        long pipesize;
        size_t buffersize, bytesread, totalread;
@@ -2872,6 +2877,7 @@ void do_linter(void)
        lastmessage = VACUUM;
        currmenu = MMOST;
        titlebar(NULL);
+#endif
 }
 
 /* Run a manipulation program on the contents of the buffer. */
-- 
2.34.1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]