1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
#include "HTUtils.h"
#include "tcp.h"
#include "HTParse.h"
#include "HTAlert.h"
#include "LYCurses.h"
#include "LYSignal.h"
#include "LYUtils.h"
#include "LYClean.h"
#include "LYGlobalDefs.h"
#include "LYEdit.h"
#include "LYStrings.h"
#include "LYSystem.h"
#ifdef VMS
#include <unixio.h>
#include "HTVMSUtils.h"
#endif /* VMS */
#include "LYLeaks.h"
#define FREE(x) if (x) {free(x); x = NULL;}
/*
* in edit mode invoke either emacs, vi, pico, jove, jed or the default
* editor to display and edit the current file
* emacs, vi, pico, jove and jed will open the file to the same line that
* the screen cursor is on when editing is invoked
* returns FALSE if file uneditable
*/
PUBLIC int edit_current_file ARGS3(char *,newfile, int,cur, int,lineno)
{
char command[512];
char *filename = NULL;
char *colon, *number_sign;
FILE *fp;
/*
* If its a remote file then we can't edit it.
*/
if(!LYisLocalFile(newfile)) {
_statusline(CANNOT_EDIT_REMOTE_FILES);
sleep(MessageSecs);
return FALSE;
}
number_sign = strchr(newfile,'#');
if(number_sign)
*number_sign = '\0';
/*
* On Unix, first try to open it as a completely referenced file,
* then via the path alone.
*
* On VMS, only try the path.
*/
#ifndef VMS
colon = strchr(newfile,':');
StrAllocCopy(filename, colon+1);
HTUnEscape(filename);
if((fp = fopen(filename,"r")) == NULL) {
FREE(filename);
#endif /* !VMS */
filename = HTParse(newfile,"",PARSE_PATH+PARSE_PUNCTUATION);
HTUnEscape(filename);
#ifdef VMS
if ((fp = fopen(HTVMS_name("",filename),"r")) == NULL) {
#else
if ((fp = fopen(filename,"r")) == NULL) {
#endif /* VMS */
HTAlert(COULD_NOT_ACCESS_FILE);
FREE(filename);
goto failure;
}
#ifndef VMS
}
#endif /* !VMS */
fclose(fp);
#if defined(VMS) || defined(CANT_EDIT_UNWRITABLE_FILES)
/*
* Don't allow editing if user lacks append access.
*/
#ifdef VMS
if ((fp = fopen(HTVMS_name("",filename),"a")) == NULL) {
#else
if ((fp = fopen(filename,"a")) == NULL) {
#endif /* VMS */
_statusline(NOAUTH_TO_EDIT_FILE);
sleep(MessageSecs);
goto failure;
}
fclose(fp);
#endif /* VMS || CANT_EDIT_UNWRITABLE_FILES */
#ifdef VMS
sprintf(command,"%s %s",editor, HTVMS_name("",filename));
#else
if (strstr(editor,"emacs") || strstr(editor,"vi") ||
strstr(editor, "pico") || strstr(editor,"jove") ||
strstr(editor, "jed"))
sprintf(command,"%s +%d \"%s\"",editor, lineno+links[cur].ly,
filename);
else
sprintf(command,"%s \"%s\"",editor, filename);
#endif /* VMS */
if (TRACE) {
fprintf(stderr, "LYEdit: %s\n",command);
sleep(MessageSecs);
}
FREE(filename);
stop_curses();
system(command);
start_curses();
if(number_sign)
*number_sign = '#';
return TRUE;
failure:
if(number_sign)
*number_sign = '#';
return FALSE;
}
|