@@ -932,9 +932,9 @@ class MCLinuxDesktop: public MCSystemInterface
932932
933933 MCshellcmd = strclone (" /bin/sh" );
934934#endif /* MCS_init_dsk_lnx */
935- IO_stdin = MCsystem -> OpenFd (0 , kMCSOpenFileModeRead );
936- IO_stdout = MCsystem -> OpenFd (1 , kMCSOpenFileModeWrite );
937- IO_stderr = MCsystem -> OpenFd (2 , kMCSOpenFileModeWrite );
935+ IO_stdin = MCsystem -> OpenFd (0 , kMCOpenFileModeRead );
936+ IO_stdout = MCsystem -> OpenFd (1 , kMCOpenFileModeWrite );
937+ IO_stderr = MCsystem -> OpenFd (2 , kMCOpenFileModeWrite );
938938
939939 // Internally, LiveCode assumes sorting orders etc are those of en_US.
940940 // Additionally, the "native" string encoding for Linux is ISO-8859-1
@@ -1583,7 +1583,7 @@ class MCLinuxDesktop: public MCSystemInterface
15831583
15841584 virtual IO_handle DeployOpen (MCStringRef p_path, intenum_t p_mode)
15851585 {
1586- if (p_mode != kMCSOpenFileModeCreate )
1586+ if (p_mode != kMCOpenFileModeCreate )
15871587 return OpenFile (p_path, p_mode, False);
15881588
15891589 FILE *fptr;
@@ -1654,7 +1654,7 @@ class MCLinuxDesktop: public MCSystemInterface
16541654 MCAutoStringRefAsSysString t_path_sys;
16551655 /* UNCHECKED */ t_path_sys.Lock (p_path);
16561656
1657- if (p_map && MCmmap && p_mode == kMCSOpenFileModeRead )
1657+ if (p_map && MCmmap && p_mode == kMCOpenFileModeRead )
16581658 {
16591659 int t_fd = open (*t_path_sys, O_RDONLY);
16601660 struct stat64 t_buf;
@@ -1677,20 +1677,34 @@ class MCLinuxDesktop: public MCSystemInterface
16771677 }
16781678 }
16791679
1680- const char *t_mode;
1681- if (p_mode == kMCSOpenFileModeRead )
1682- t_mode = IO_READ_MODE;
1683- else if (p_mode == kMCSOpenFileModeWrite )
1684- t_mode = IO_WRITE_MODE;
1685- else if (p_mode == kMCSOpenFileModeUpdate )
1686- t_mode = IO_UPDATE_MODE;
1687- else if (p_mode == kMCSOpenFileModeAppend )
1688- t_mode = IO_APPEND_MODE;
1680+ FILE *t_fptr;
1681+ // [[ Bug 12192 ]] We want to create an executable file on Linux
1682+ // when calling OpenFile from MCS_save(binary|text)file
1683+ if (p_mode == kMCOpenFileModeExecutableWrite )
1684+ {
1685+ int t_fd = open (*t_path_sys, O_CREAT | O_TRUNC | O_WRONLY, 0777 );
1686+ if (t_fd != -1 )
1687+ t_fptr = fdopen (t_fd, " w" );
1688+ else
1689+ t_fptr = NULL ;
1690+ }
1691+ else
1692+ {
1693+ const char *t_mode;
1694+ if (p_mode == kMCOpenFileModeRead )
1695+ t_mode = IO_READ_MODE;
1696+ else if (p_mode == kMCOpenFileModeWrite )
1697+ t_mode = IO_WRITE_MODE;
1698+ else if (p_mode == kMCOpenFileModeUpdate )
1699+ t_mode = IO_UPDATE_MODE;
1700+ else if (p_mode == kMCOpenFileModeAppend )
1701+ t_mode = IO_APPEND_MODE;
16891702
1690- FILE * t_fptr = fopen (*t_path_sys, t_mode);
1703+ t_fptr = fopen (*t_path_sys, t_mode);
16911704
1692- if (t_fptr == NULL && p_mode != kMCSOpenFileModeRead )
1693- t_fptr = fopen (*t_path_sys, IO_CREATE_MODE);
1705+ if (t_fptr == NULL && p_mode != kMCOpenFileModeRead )
1706+ t_fptr = fopen (*t_path_sys, IO_CREATE_MODE);
1707+ }
16941708
16951709 if (t_fptr != NULL )
16961710 {
@@ -1707,16 +1721,16 @@ class MCLinuxDesktop: public MCSystemInterface
17071721
17081722 switch (p_mode)
17091723 {
1710- case kMCSOpenFileModeRead :
1724+ case kMCOpenFileModeRead :
17111725 t_fptr = fdopen (p_fd, IO_READ_MODE);
17121726 break ;
1713- case kMCSOpenFileModeWrite :
1727+ case kMCOpenFileModeWrite :
17141728 t_fptr = fdopen (p_fd, IO_WRITE_MODE);
17151729 break ;
1716- case kMCSOpenFileModeUpdate :
1730+ case kMCOpenFileModeUpdate :
17171731 t_fptr = fdopen (p_fd, IO_UPDATE_MODE);
17181732 break ;
1719- case kMCSOpenFileModeAppend :
1733+ case kMCOpenFileModeAppend :
17201734 t_fptr = fdopen (p_fd, IO_APPEND_MODE);
17211735 break ;
17221736 }
@@ -1735,16 +1749,16 @@ class MCLinuxDesktop: public MCSystemInterface
17351749 MCAutoStringRefAsSysString t_path_sys;
17361750 /* UNCHECKED */ t_path_sys.Lock (p_path);
17371751
1738- if (p_mode == kMCSOpenFileModeRead )
1752+ if (p_mode == kMCOpenFileModeRead )
17391753 t_fptr = fopen (*t_path_sys, IO_READ_MODE);
1740- else if (p_mode == kMCSOpenFileModeWrite )
1754+ else if (p_mode == kMCOpenFileModeWrite )
17411755 t_fptr = fopen (*t_path_sys, IO_WRITE_MODE);
1742- else if (p_mode == kMCSOpenFileModeUpdate )
1756+ else if (p_mode == kMCOpenFileModeUpdate )
17431757 t_fptr = fopen (*t_path_sys, IO_UPDATE_MODE);
1744- else if (p_mode == kMCSOpenFileModeAppend )
1758+ else if (p_mode == kMCOpenFileModeAppend )
17451759 t_fptr = fopen (*t_path_sys, IO_APPEND_MODE);
17461760
1747- if (t_fptr == NULL && p_mode != kMCSOpenFileModeRead )
1761+ if (t_fptr == NULL && p_mode != kMCOpenFileModeRead )
17481762 t_fptr = fopen (*t_path_sys, IO_CREATE_MODE);
17491763
17501764 configureSerialPort ((short )fileno (t_fptr));
@@ -2853,12 +2867,12 @@ class MCLinuxDesktop: public MCSystemInterface
28532867 {
28542868 close (toparent[1 ]);
28552869 MCS_lnx_nodelay (toparent[0 ]);
2856- MCprocesses[index].ihandle = OpenFd (toparent[0 ], kMCSOpenFileModeRead );
2870+ MCprocesses[index].ihandle = OpenFd (toparent[0 ], kMCOpenFileModeRead );
28572871 }
28582872 if (writing)
28592873 {
28602874 close (tochild[0 ]);
2861- MCprocesses[index].ohandle = OpenFd (tochild[1 ], kMCSOpenFileModeWrite );
2875+ MCprocesses[index].ohandle = OpenFd (tochild[1 ], kMCOpenFileModeWrite );
28622876 }
28632877 }
28642878 }
@@ -2873,13 +2887,13 @@ class MCLinuxDesktop: public MCSystemInterface
28732887 if (reading)
28742888 {
28752889 MCS_lnx_nodelay (t_input_fd);
2876- MCprocesses[index] . ihandle = OpenFd (t_input_fd, kMCSOpenFileModeRead );
2890+ MCprocesses[index] . ihandle = OpenFd (t_input_fd, kMCOpenFileModeRead );
28772891 }
28782892 else
28792893 close (t_input_fd);
28802894
28812895 if (writing)
2882- MCprocesses[index] . ohandle = OpenFd (t_output_fd, kMCSOpenFileModeWrite );
2896+ MCprocesses[index] . ohandle = OpenFd (t_output_fd, kMCOpenFileModeWrite );
28832897 else
28842898 close (t_output_fd);
28852899
0 commit comments