NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: bin/47577: Mail(1)/mail(1)/mailx(1) gets stuck when current folder becomes accessible
The following reply was made to PR bin/47577; it has been noted by GNATS.
From: Steffen "Daode" Nurpmeso <sdaoden%gmail.com@localhost>
To: gnats-bugs%NetBSD.org@localhost
Cc: gnats-admin%netbsd.org@localhost, netbsd-bugs%netbsd.org@localhost
Subject: Re: bin/47577: Mail(1)/mail(1)/mailx(1) gets stuck when current
folder becomes accessible
Date: Tue, 19 Feb 2013 18:10:12 +0100
|The following reply was made to PR bin/47577; it has been noted by GNATS.
|
|From: Steffen "Daode" Nurpmeso <sdaoden%gmail.com@localhost>
|To: christos%zoulas.com@localhost (Christos Zoulas)
|Cc: gnats-admin%netbsd.org@localhost, gnats-bugs%NetBSD.org@localhost,
| netbsd-bugs%netbsd.org@localhost
|Subject: Re: bin/47577: Mail(1)/mail(1)/mailx(1) gets stuck when current
| folder becomes accessible
|Date: Mon, 18 Feb 2013 20:07:55 +0100
|
| christos%zoulas.com@localhost (Christos Zoulas) wrote:
||On Feb 18, 7:19pm, sdaoden%gmail.com@localhost (Steffen "Daode" Nurpmeso)
wrote:
||-- Subject: Re: bin/47577: Mail(1)/mail(1)/mailx(1) gets stuck when \
| current \
||f
||
||| Sure; "fi" etc. then always show an absolute path, which is often
||| annoying imho, especially on 80 column terminals, though.
||
||So keep a "displayname" and a "resolvedname" so you always show the
||displayname. It is strange that the name will change when the user cds?
||Don't you agree?
This seems to work after some testing; the actual display length
can be controlled by adjusting sizeof(displayname).
Forgive if i f..d up something, but don't think so.
Ciao,
--steffen
--- fio.c.orig 2013-02-19 01:06:53.000000000 +0100
+++ fio.c 2013-02-19 03:00:56.000000000 +0100
@@ -392,14 +392,18 @@ fsize(FILE *iob)
PUBLIC int
getfold(char *name, size_t namesize)
{
+ char unres[PATHSIZE], res[PATHSIZE];
char *folder;
=20
if ((folder =3D value(ENAME_FOLDER)) =3D=3D NULL)
return -1;
if (*folder =3D=3D '/')
- (void)strlcpy(name, folder, namesize);
+ (void)strlcpy(unres, folder, sizeof unres);
else
- (void)snprintf(name, namesize, "%s/%s", homedir, folder);
+ (void)snprintf(unres, sizeof unres, "%s/%s", homedir, folder);
+ if (realpath(unres, res) =3D=3D NULL)
+ err(EXIT_FAILURE, "Can't canonicalize *folder* `%s'", unres);
+ (void)strlcpy(name, res, namesize);
return 0;
}
=20
--- glob.h.orig 2013-02-18 17:39:46.000000000 +0100
+++ glob.h 2013-02-19 03:02:37.000000000 +0100
@@ -59,6 +59,7 @@ EXTERN FILE *otf; /* Output temp
file
EXTERN int image; /* File descriptor for image of
msg */
EXTERN FILE *input; /* Current command input file */
EXTERN char mailname[PATHSIZE]; /* Name of current file */
+EXTERN char displayname[80]; /* Prettyfied for display */
EXTERN char prevfile[PATHSIZE]; /* Name of previous file */
EXTERN char *tmpdir; /* Path name of temp directory
*/
EXTERN char *homedir; /* Path name of home directory
*/
--- lex.c.orig 2013-02-18 17:38:31.000000000 +0100
+++ lex.c 2013-02-19 03:05:58.000000000 +0100
@@ -141,6 +141,45 @@ file_leak_check(void)
}
#endif /* DEBUG_FILE_LEAK */
=20
+static void
+_update_mailname(char const *name)
+{
+ char tbuf[PATHSIZE];
+ size_t l;
+
+ if (realpath(name, mailname) =3D=3D NULL)
+ err(EXIT_FAILURE, "Can't canonicalize `%s'", name);
+
+ if (getfold(tbuf, sizeof tbuf) >=3D 0) {
+ l =3D strlen(tbuf);
+ if (l < sizeof(tbuf) - 1)
+ tbuf[l++] =3D '/';
+ if (strncmp(tbuf, mailname, l) =3D=3D 0) {
+ char const *sep =3D "", *cp =3D mailname + l;
+
+ l =3D strlen(cp);
+ if (l >=3D sizeof displayname) {
+ cp +=3D l;
+ cp -=3D sizeof(displayname) - 5;
+ sep =3D "...";
+ }
+ (void)snprintf(displayname, sizeof displayname,
+ "+%s%s", sep, cp);
+ goto jleave;
+ }
+ }
+
+ l =3D strlen(mailname);
+ if (l < sizeof displayname)
+ strcpy(displayname, mailname);
+ else {
+ l -=3D sizeof(displayname) - 4 - sizeof(displayname) / 3;
+ (void)snprintf(displayname, sizeof displayname, "%.*s...%s",
+ (int)sizeof(displayname) / 3, mailname, mailname + l);
+ }
+jleave: ;
+}
+
/*
* Set the size of the message vector used to construct argument
* lists to message list functions.
@@ -232,11 +271,8 @@ setfile(const char *name)
shudclob =3D 1;
edit =3D isedit;
(void)strcpy(prevfile, mailname);
- if (name !=3D mailname) {
- (void)strcpy(mailname, name);
-
- (void)strcpy(mailname, name);
- }
+ if (name !=3D mailname)
+ _update_mailname(name);
mailsize =3D fsize(ibuf);
(void)snprintf(tempname, sizeof(tempname),
"%s/mail.RxXXXXXXXXXX", tmpdir);
@@ -975,7 +1011,6 @@ newfileinfo(int omsgCount)
struct message *mp;
int d, n, s, t, u, mdot;
char fname[PATHSIZE];
- char *ename;
=20
/*
* Figure out where to set the 'dot'. Use the first new or
@@ -1019,23 +1054,10 @@ newfileinfo(int omsgCount)
if (mp->m_flag & MTAGGED)
t++;
}
- ename =3D mailname;
- if (getfold(fname, sizeof(fname)) >=3D 0) {
- char zname[PATHSIZE];
- size_t l;
- l =3D strlen(fname);
- if (l < sizeof(fname) - 1)
- fname[l++] =3D '/';
- if (strncmp(fname, mailname, l) =3D=3D 0) {
- (void)snprintf(zname, sizeof(zname), "+%s",
- mailname + l);
- ename =3D zname;
- }
- }
/*
* Display the statistics.
*/
- (void)printf("\"%s\": ", ename);
+ (void)printf("\"%s\": ", displayname);
{
int cnt =3D get_abs_msgCount();
(void)printf("%d message%s", cnt, cnt =3D=3D 1 ? "" : "s");
Home |
Main Index |
Thread Index |
Old Index