summaryrefslogtreecommitdiff
path: root/fileio.c
diff options
context:
space:
mode:
Diffstat (limited to 'fileio.c')
-rw-r--r--fileio.c176
1 files changed, 125 insertions, 51 deletions
diff --git a/fileio.c b/fileio.c
index 665b4b6..193e3ff 100644
--- a/fileio.c
+++ b/fileio.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 1993
+/* Copyright (c) 1993-2002
* Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
* Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
* Copyright (c) 1987 Oliver Laumann
@@ -39,6 +39,7 @@ RCS_ID("$Id: fileio.c,v 1.10 1994/05/31 12:32:01 mlschroe Exp $ FAU")
extern struct display *display, *displays;
extern struct win *fore;
+extern struct layer *flayer;
extern int real_uid, eff_uid;
extern int real_gid, eff_gid;
extern char *extra_incap, *extra_outcap;
@@ -54,8 +55,8 @@ static char *CatExtra __P((char *, char *));
static char *findrcfile __P((char *));
-static FILE *fp = NULL;
-char *rc_name;
+char *rc_name = "";
+int rc_recursion = 0;
static char *
CatExtra(str1, str2)
@@ -94,32 +95,36 @@ static char *
findrcfile(rcfile)
char *rcfile;
{
- static char buf[256];
- char *rc, *p;
+ char buf[256];
+ char *p;
if (rcfile)
{
- rc = SaveStr(rcfile);
+ char *rcend = rindex(rc_name, '/');
+ if (*rcfile != '/' && rcend && (rcend - rc_name) + strlen(rcfile) + 2 < sizeof(buf))
+ {
+ strncpy(buf, rc_name, rcend - rc_name + 1);
+ strcpy(buf + (rcend - rc_name) + 1, rcfile);
+ if (access(buf, R_OK) == 0)
+ return SaveStr(buf);
+ }
debug1("findrcfile: you specified '%s'\n", rcfile);
+ return SaveStr(rcfile);
+ }
+ debug("findrcfile: you specified nothing...\n");
+ if ((p = getenv("SCREENRC")) != NULL && *p != '\0')
+ {
+ debug1(" $SCREENRC has: '%s'\n", p);
+ return SaveStr(p);
}
else
{
- debug("findrcfile: you specified nothing...\n");
- if ((p = getenv("SCREENRC")) != NULL && *p != '\0')
- {
- debug1(" $SCREENRC has: '%s'\n", p);
- rc = SaveStr(p);
- }
- else
- {
- debug(" ...nothing in $SCREENRC, defaulting $HOME/.screenrc\n");
- if (strlen(home) > sizeof(buf) - 12)
- Panic(0, "Rc: home too large");
- sprintf(buf, "%s/.screenrc", home);
- rc = SaveStr(buf);
- }
+ debug(" ...nothing in $SCREENRC, defaulting $HOME/.screenrc\n");
+ if (strlen(home) > sizeof(buf) - 12)
+ Panic(0, "Rc: home too large");
+ sprintf(buf, "%s/.screenrc", home);
+ return SaveStr(buf);
}
- return rc;
}
/*
@@ -135,6 +140,8 @@ char *rcfilename;
register char *p, *cp;
char buf[2048];
char *args[MAXARGS];
+ FILE *fp;
+ char *oldrc_name = rc_name;
/* always fix termcap/info capabilities */
extra_incap = CatExtra("TF", extra_incap);
@@ -147,7 +154,7 @@ char *rcfilename;
if ((fp = secfopen(rc_name, "r")) == NULL)
{
- if (RcFileName && strcmp(RcFileName, rc_name) == 0)
+ if (!rc_recursion && RcFileName && !strcmp(RcFileName, rc_name))
{
/*
* User explicitly gave us that name,
@@ -160,7 +167,7 @@ char *rcfilename;
}
debug1("StartRc: '%s' no good. ignored\n", rc_name);
Free(rc_name);
- rc_name = "";
+ rc_name = oldrc_name;
return;
}
while (fgets(buf, sizeof buf, fp) != NULL)
@@ -195,7 +202,7 @@ char *rcfilename;
Msg(0, "%s: sleep: one numeric argument expected.", rc_name);
continue;
}
- DisplaySleep(atoi(args[1]));
+ DisplaySleep(atoi(args[1]), 1);
}
#ifdef TERMINFO
else if (!strcmp(args[0], "termcapinfo") || !strcmp(args[0], "terminfo"))
@@ -229,10 +236,19 @@ char *rcfilename;
if (argc == 4)
extra_outcap = CatExtra(args[3], extra_outcap);
}
+ else if (!strcmp(args[0], "source"))
+ {
+ if (rc_recursion <= 10)
+ {
+ rc_recursion++;
+ StartRc(args[1]);
+ rc_recursion--;
+ }
+ }
}
fclose(fp);
Free(rc_name);
- rc_name = "";
+ rc_name = oldrc_name;
}
void
@@ -240,12 +256,16 @@ FinishRc(rcfilename)
char *rcfilename;
{
char buf[2048];
+ FILE *fp;
+ char *oldrc_name = rc_name;
rc_name = findrcfile(rcfilename);
if ((fp = secfopen(rc_name, "r")) == NULL)
{
- if (RcFileName && strcmp(RcFileName, rc_name) == 0)
+ if (rc_recursion)
+ Msg(errno, "%s: source %s", oldrc_name, rc_name);
+ else if (RcFileName && !strcmp(RcFileName, rc_name))
{
/*
* User explicitly gave us that name,
@@ -258,7 +278,7 @@ char *rcfilename;
}
debug1("FinishRc: '%s' no good. ignored\n", rc_name);
Free(rc_name);
- rc_name = "";
+ rc_name = oldrc_name;
return;
}
@@ -267,9 +287,24 @@ char *rcfilename;
RcLine(buf);
(void) fclose(fp);
Free(rc_name);
- rc_name = "";
+ rc_name = oldrc_name;
+}
+
+void
+do_source(rcfilename)
+char *rcfilename;
+{
+ if (rc_recursion > 10)
+ {
+ Msg(0, "%s: source: recursion limit reached", rc_name);
+ return;
+ }
+ rc_recursion++;
+ FinishRc(rcfilename);
+ rc_recursion--;
}
+
/*
* Running a Command Line in the environment determined by the display.
* The fore window is taken from the display as well as the user.
@@ -281,12 +316,17 @@ char *ubuf;
{
char *args[MAXARGS], *buf;
#ifdef MULTIUSER
- extern struct user *EffectiveAclUser; /* acl.c */
- extern struct user *users; /* acl.c */
+ extern struct acluser *EffectiveAclUser; /* acl.c */
+ extern struct acluser *users; /* acl.c */
#endif
if (display)
- fore = D_fore;
+ {
+ fore = D_fore;
+ flayer = D_forecv->c_layer;
+ }
+ else
+ flayer = fore ? fore->w_savelayer : 0;
buf = expand_vars(ubuf, display);
if (Parse(buf, args) <= 0)
return;
@@ -309,7 +349,9 @@ char *ubuf;
* needs display for copybuffer access and termcap dumping
*/
void
-WriteFile(dump)
+WriteFile(user, fn, dump)
+struct acluser *user;
+char *fn;
int dump;
{
/* dump==0: create .termcap,
@@ -317,11 +359,12 @@ int dump;
* #ifdef COPY_PASTE
* dump==2: BUFFERFILE
* #endif COPY_PASTE
+ * dump==1: scrollback,
*/
register int i, j, k;
register char *p;
register FILE *f;
- char fn[1024];
+ char fnbuf[1024];
char *mode = "w";
#ifdef COPY_PASTE
int public = 0;
@@ -339,24 +382,39 @@ int dump;
switch (dump)
{
case DUMP_TERMCAP:
- i = SockName - SockPath;
- if (i > sizeof(fn) - 9)
- i = 0;
- strncpy(fn, SockPath, i);
- strcpy(fn + i, ".termcap");
+ if (fn == 0)
+ {
+ i = SockName - SockPath;
+ if (i > sizeof(fnbuf) - 9)
+ i = 0;
+ strncpy(fnbuf, SockPath, i);
+ strcpy(fnbuf + i, ".termcap");
+ fn = fnbuf;
+ }
break;
case DUMP_HARDCOPY:
- if (hardcopydir && strlen(hardcopydir) < sizeof(fn) - 21)
- sprintf(fn, "%s/hardcopy.%d", hardcopydir, fore->w_number);
- else
- sprintf(fn, "hardcopy.%d", fore->w_number);
+ case DUMP_SCROLLBACK:
+ if (fn == 0)
+ {
+ if (fore == 0)
+ return;
+ if (hardcopydir && *hardcopydir && strlen(hardcopydir) < sizeof(fnbuf) - 21)
+ sprintf(fnbuf, "%s/hardcopy.%d", hardcopydir, fore->w_number);
+ else
+ sprintf(fnbuf, "hardcopy.%d", fore->w_number);
+ fn = fnbuf;
+ }
if (hardcopy_append && !access(fn, W_OK))
mode = "a";
break;
#ifdef COPY_PASTE
case DUMP_EXCHANGE:
- strncpy(fn, BufferFile, sizeof(fn) - 1);
- fn[sizeof(fn) - 1] = 0;
+ if (fn == 0)
+ {
+ strncpy(fnbuf, BufferFile, sizeof(fnbuf) - 1);
+ fnbuf[sizeof(fnbuf) - 1] = 0;
+ fn = fnbuf;
+ }
public = !strcmp(fn, DEFAULT_BUFFERFILE);
# ifdef HAVE_LSTAT
exists = !lstat(fn, &stb);
@@ -413,17 +471,32 @@ int dump;
switch (dump)
{
case DUMP_HARDCOPY:
+ case DUMP_SCROLLBACK:
+ if (!fore)
+ break;
if (*mode == 'a')
{
putc('>', f);
- for (j = D_width - 2; j > 0; j--)
+ for (j = fore->w_width - 2; j > 0; j--)
putc('=', f);
fputs("<\n", f);
}
- for (i = 0; i < D_height; i++)
+ if (dump == DUMP_SCROLLBACK)
{
- p = fore->w_mlines[i].image;
- for (k = D_width - 1; k >= 0 && p[k] == ' '; k--)
+ for (i = 0; i < fore->w_histheight; i++)
+ {
+ p = (char *)(WIN(i)->image);
+ for (k = fore->w_width - 1; k >= 0 && p[k] == ' '; k--)
+ ;
+ for (j = 0; j <= k; j++)
+ putc(p[j], f);
+ putc('\n', f);
+ }
+ }
+ for (i = 0; i < fore->w_height; i++)
+ {
+ p = (char *)fore->w_mlines[i].image;
+ for (k = fore->w_width - 1; k >= 0 && p[k] == ' '; k--)
;
for (j = 0; j <= k; j++)
putc(p[j], f);
@@ -439,8 +512,8 @@ int dump;
break;
#ifdef COPY_PASTE
case DUMP_EXCHANGE:
- p = D_user->u_copybuffer;
- for (i = D_user->u_copylen; i-- > 0; p++)
+ p = user->u_plop.buf;
+ for (i = user->u_plop.len; i-- > 0; p++)
if (*p == '\r' && (i == 0 || p[1] != '\n'))
putc('\n', f);
else
@@ -454,7 +527,7 @@ int dump;
}
if (UserStatus() <= 0)
Msg(0, "Cannot open \"%s\"", fn);
- else
+ else if (display && !*rc_name)
{
switch (dump)
{
@@ -462,6 +535,7 @@ int dump;
Msg(0, "Termcap entry written to \"%s\".", fn);
break;
case DUMP_HARDCOPY:
+ case DUMP_SCROLLBACK:
Msg(0, "Screen image %s to \"%s\".",
(*mode == 'a') ? "appended" : "written", fn);
break;