Skip to content
Toggle navigation
Toggle navigation
This project
Loading...
Sign in
John McEleney
/
mailutils
Go to a project
Toggle navigation
Toggle navigation pinning
Projects
Groups
Snippets
Help
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Network
Create a new issue
Builds
Commits
Issue Boards
Files
Commits
Network
Compare
Branches
Tags
Commit
c1f2442c
...
c1f2442cd53e43cf11cc8f5b649b454b3f2cb03f
authored
2017-06-15 22:09:30 +0300
by
Sergey Poznyakoff
Committed by
Sergey Poznyakoff
2017-06-16 09:50:36 +0300
Browse Files
Options
Browse Files
Tag
Download
Plain Diff
Merge branch 'master' into locus
2 parents
8b5715db
fe90e86d
Hide whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
431 additions
and
73 deletions
NEWS
mh/comp.c
mh/forw.c
mh/mh.h
mh/mh_alias_gram.y
mh/mh_getopt.c
mh/mh_getopt.h
mh/mh_whatnow.c
mh/mh_whom.c
mh/repl.c
mh/tests/comp.at
mh/tests/forw.at
mh/tests/repl.at
mh/whom.c
NEWS
View file @
c1f2442
GNU mailutils NEWS -- history of user-visible changes. 2017-06-
01
GNU mailutils NEWS -- history of user-visible changes. 2017-06-
16
Copyright (C) 2002-2017 Free Software Foundation, Inc.
See the end of file for copying conditions.
...
...
@@ -75,6 +75,13 @@ value is anything but "no", the settings from the global "tls" section
will be used. In this case, it is an error if the global "tls"
section is not defined.
* Source location API
Libmailutils provides functions for keeping track of locations in
source files for diagnostic purposes.
* Improve error reporting
* AM_GNU_MAILUTILS autoconf macro
Required version must be literal string.
...
...
mh/comp.c
View file @
c1f2442
...
...
@@ -127,15 +127,16 @@ copy_message (mu_mailbox_t mbox, size_t n, const char *file)
return
rc
;
}
static
struct
mh_optinit
optinit
[]
=
{
{
"draftfolder"
,
"Draft-Folder"
},
{
"whatnowproc"
,
"whatnowproc"
},
{
NULL
}
};
int
main
(
int
argc
,
char
**
argv
)
{
mh_getopt
(
&
argc
,
&
argv
,
options
,
0
,
args_doc
,
prog_doc
,
NULL
);
if
(
!
draftfolder
)
draftfolder
=
mh_global_profile_get
(
"Draft-Folder"
,
NULL
);
if
(
!
whatnowproc
)
whatnowproc
=
mh_global_profile_get
(
"whatnowproc"
,
NULL
);
mh_getopt_ext
(
&
argc
,
&
argv
,
options
,
0
,
optinit
,
args_doc
,
prog_doc
,
NULL
);
if
(
use_draft
)
draftmessage
=
"cur"
;
...
...
mh/forw.c
View file @
c1f2442
...
...
@@ -377,17 +377,19 @@ finish_draft ()
mu_stream_destroy
(
&
stream
);
}
static
struct
mh_optinit
optinit
[]
=
{
{
"draftfolder"
,
"Draft-Folder"
},
{
"whatnowproc"
,
"whatnowproc"
},
{
NULL
}
};
int
main
(
int
argc
,
char
**
argv
)
{
int
rc
;
mh_getopt
(
&
argc
,
&
argv
,
options
,
MH_GETOPT_DEFAULT_FOLDER
,
args_doc
,
prog_doc
,
NULL
);
if
(
!
draftfolder
)
draftfolder
=
mh_global_profile_get
(
"Draft-Folder"
,
NULL
);
if
(
!
whatnowproc
)
whatnowproc
=
mh_global_profile_get
(
"whatnowproc"
,
NULL
);
mh_getopt_ext
(
&
argc
,
&
argv
,
options
,
MH_GETOPT_DEFAULT_FOLDER
,
optinit
,
args_doc
,
prog_doc
,
NULL
);
if
(
!
formfile
)
mh_find_file
(
"forwcomps"
,
&
formfile
);
...
...
mh/mh.h
View file @
c1f2442
...
...
@@ -342,7 +342,11 @@ int mh_usedraft (const char *filename);
int
mh_file_copy
(
const
char
*
from
,
const
char
*
to
);
char
*
mh_draft_name
(
void
);
char
*
mh_create_message_id
(
int
);
int
mh_whom
(
const
char
*
filename
,
int
check
);
int
mh_whom_header
(
mu_header_t
hdr
);
int
mh_whom_file
(
const
char
*
filename
,
int
check
);
int
mh_whom_message
(
mu_message_t
msg
,
int
check
);
void
mh_set_reply_regex
(
const
char
*
str
);
int
mh_decode_2047
(
char
*
text
,
char
**
decoded_text
);
const
char
*
mh_charset
(
const
char
*
);
...
...
mh/mh_alias_gram.y
View file @
c1f2442
...
...
@@ -502,6 +502,9 @@ int
mh_read_aliases (void)
{
const char *p;
if (alias_list)
return 0;
p = mh_global_profile_get ("Aliasfile", NULL);
if (p)
...
...
mh/mh_getopt.c
View file @
c1f2442
...
...
@@ -179,10 +179,39 @@ has_folder_option (struct mu_option *opt)
return
0
;
}
static
void
opt_init
(
struct
mu_parseopt
*
po
,
struct
mu_option
**
optv
,
struct
mh_optinit
*
optinit
)
{
if
(
!
optinit
)
return
;
for
(;
optinit
->
opt
;
optinit
++
)
{
size_t
i
;
for
(
i
=
0
;
optv
[
i
];
i
++
)
{
struct
mu_option
*
opt
;
for
(
opt
=
optv
[
i
];
!
MU_OPTION_IS_END
(
opt
);
opt
++
)
{
if
(
strcmp
(
opt
->
opt_long
,
optinit
->
opt
)
==
0
)
{
char
const
*
val
=
mh_global_profile_get
(
optinit
->
var
,
NULL
);
if
(
val
)
{
(
opt
->
opt_set
?
opt
->
opt_set
:
mu_option_set_value
)
(
po
,
opt
,
val
);
}
break
;
}
}
}
}
}
void
mh_getopt
(
int
*
pargc
,
char
***
pargv
,
struct
mu_option
*
options
,
int
mhflags
,
char
*
argdoc
,
char
*
progdoc
,
char
*
extradoc
)
mh_getopt
_ext
(
int
*
pargc
,
char
***
pargv
,
struct
mu_option
*
options
,
int
mhflags
,
struct
mh_optinit
*
optinit
,
char
*
argdoc
,
char
*
progdoc
,
char
*
extradoc
)
{
int
argc
=
*
pargc
;
char
**
argv
=
*
pargv
;
...
...
@@ -256,6 +285,7 @@ mh_getopt (int *pargc, char ***pargv, struct mu_option *options,
if
(
options
)
optv
[
i
++
]
=
options
;
optv
[
i
]
=
NULL
;
opt_init
(
&
po
,
optv
,
optinit
);
if
(
mu_parseopt
(
&
po
,
argc
,
argv
,
optv
,
flags
))
exit
(
po
.
po_exit_error
);
...
...
@@ -285,6 +315,14 @@ mh_getopt (int *pargc, char ***pargv, struct mu_option *options,
}
void
mh_getopt
(
int
*
pargc
,
char
***
pargv
,
struct
mu_option
*
options
,
int
mhflags
,
char
*
argdoc
,
char
*
progdoc
,
char
*
extradoc
)
{
mh_getopt_ext
(
pargc
,
pargv
,
options
,
mhflags
,
NULL
,
argdoc
,
progdoc
,
extradoc
);
}
void
mh_opt_notimpl
(
struct
mu_parseopt
*
po
,
struct
mu_option
*
opt
,
char
const
*
arg
)
{
mu_error
(
_
(
"option is not yet implemented: %s"
),
opt
->
opt_long
);
...
...
mh/mh_getopt.h
View file @
c1f2442
...
...
@@ -20,9 +20,18 @@
#define MH_GETOPT_DEFAULT_FOLDER 0x1
struct
mh_optinit
{
char
const
*
opt
;
/* Option name */
char
const
*
var
;
/* mh_property name */
};
void
mh_getopt_ext
(
int
*
pargc
,
char
***
pargv
,
struct
mu_option
*
options
,
int
mhflags
,
struct
mh_optinit
*
optinit
,
char
*
argdoc
,
char
*
progdoc
,
char
*
extradoc
);
void
mh_getopt
(
int
*
pargc
,
char
***
pargv
,
struct
mu_option
*
options
,
int
flags
,
char
*
argdoc
,
char
*
progdoc
,
char
*
extradoc
);
int
flags
,
char
*
argdoc
,
char
*
progdoc
,
char
*
extradoc
);
void
mh_opt_notimpl
(
struct
mu_parseopt
*
po
,
struct
mu_option
*
opt
,
char
const
*
arg
);
...
...
mh/mh_whatnow.c
View file @
c1f2442
...
...
@@ -544,9 +544,10 @@ whom (struct mh_whatnow_env *wh, int argc, char **argv, int *status)
if
(
!
wh
->
file
)
mu_error
(
_
(
"no draft file to display"
));
else
mh_whom
(
wh
->
file
,
(
argc
==
2
&&
(
strcmp
(
argv
[
1
],
"-check"
)
==
0
||
strcmp
(
argv
[
1
],
"--check"
)
==
0
)));
mh_whom_file
(
wh
->
file
,
(
argc
==
2
&&
(
strcmp
(
argv
[
1
],
"-check"
)
==
0
||
strcmp
(
argv
[
1
],
"--check"
)
==
0
)));
return
0
;
}
...
...
mh/mh_whom.c
View file @
c1f2442
...
...
@@ -261,7 +261,46 @@ read_header (mu_stream_t stream)
}
int
mh_whom
(
const
char
*
filename
,
int
check
)
mh_whom_header
(
mu_header_t
hdr
)
{
size_t
count
=
0
;
int
rc
;
const
char
*
val
;
mh_read_aliases
();
if
(
mu_header_sget_value
(
hdr
,
MU_HEADER_TO
,
&
val
)
==
0
)
scan_addrs
(
val
,
0
);
if
(
mu_header_sget_value
(
hdr
,
MU_HEADER_CC
,
&
val
)
==
0
)
scan_addrs
(
val
,
0
);
if
(
mu_header_sget_value
(
hdr
,
MU_HEADER_BCC
,
&
val
)
==
0
)
scan_addrs
(
val
,
1
);
if
(
local_rcp
)
{
printf
(
" %s
\n
"
,
_
(
"-- Local Recipients --"
));
mu_list_foreach
(
local_rcp
,
_print_local_recipient
,
&
count
);
}
if
(
network_rcp
)
{
printf
(
" %s
\n
"
,
_
(
"-- Network Recipients --"
));
mu_list_foreach
(
network_rcp
,
_print_recipient
,
&
count
);
}
if
(
count
==
0
)
{
mu_error
(
_
(
"no recipients"
));
rc
=
-
1
;
}
destroy_addrs
(
&
network_rcp
);
destroy_addrs
(
&
local_rcp
);
return
rc
;
}
int
mh_whom_file
(
const
char
*
filename
,
int
check
)
{
int
rc
=
0
;
...
...
@@ -272,11 +311,9 @@ mh_whom (const char *filename, int check)
}
else
{
size_t
count
=
0
;
mu_header_t
hdr
;
mu_stream_t
str
;
int
rc
;
const
char
*
val
;
rc
=
mu_file_stream_create
(
&
str
,
filename
,
MU_STREAM_READ
);
if
(
rc
)
...
...
@@ -288,35 +325,26 @@ mh_whom (const char *filename, int check)
hdr
=
read_header
(
str
);
mu_stream_unref
(
str
);
mh_read_aliases
();
if
(
mu_header_sget_value
(
hdr
,
MU_HEADER_TO
,
&
val
)
==
0
)
scan_addrs
(
val
,
0
);
if
(
mu_header_sget_value
(
hdr
,
MU_HEADER_CC
,
&
val
)
==
0
)
scan_addrs
(
val
,
0
);
if
(
mu_header_sget_value
(
hdr
,
MU_HEADER_BCC
,
&
val
)
==
0
)
scan_addrs
(
val
,
1
);
if
(
local_rcp
)
{
printf
(
" %s
\n
"
,
_
(
"-- Local Recipients --"
));
mu_list_foreach
(
local_rcp
,
_print_local_recipient
,
&
count
);
}
rc
=
mh_whom_header
(
hdr
);
mu_header_destroy
(
&
hdr
);
}
return
rc
;
}
if
(
network_rcp
)
{
printf
(
" %s
\n
"
,
_
(
"-- Network Recipients --"
));
mu_list_foreach
(
network_rcp
,
_print_recipient
,
&
count
)
;
}
int
mh_whom_message
(
mu_message_t
msg
,
int
check
)
{
mu_header_t
hdr
;
int
rc
;
if
(
count
==
0
)
{
mu_error
(
_
(
"no recipients"
));
rc
=
-
1
;
}
rc
=
mu_message_get_header
(
msg
,
&
hdr
);
if
(
rc
)
mu_error
(
_
(
"can't get headers: %s"
),
mu_strerror
(
rc
));
else
{
rc
=
mh_whom_header
(
hdr
);
mu_header_destroy
(
&
hdr
);
}
destroy_addrs
(
&
network_rcp
);
destroy_addrs
(
&
local_rcp
);
return
rc
;
}
...
...
mh/repl.c
View file @
c1f2442
...
...
@@ -289,19 +289,19 @@ make_draft (mu_mailbox_t mbox, int disp, struct mh_whatnow_env *wh)
}
}
static
struct
mh_optinit
optinit
[]
=
{
{
"draftfolder"
,
"Draft-Folder"
},
{
"whatnowproc"
,
"whatnowproc"
},
{
NULL
}
};
int
main
(
int
argc
,
char
**
argv
)
{
int
rc
;
mh_getopt
(
&
argc
,
&
argv
,
options
,
MH_GETOPT_DEFAULT_FOLDER
,
args_doc
,
prog_doc
,
NULL
);
if
(
!
draftfolder
)
draftfolder
=
mh_global_profile_get
(
"Draft-Folder"
,
NULL
);
if
(
!
whatnowproc
)
whatnowproc
=
mh_global_profile_get
(
"whatnowproc"
,
NULL
);
mh_getopt_ext
(
&
argc
,
&
argv
,
options
,
MH_GETOPT_DEFAULT_FOLDER
,
optinit
,
args_doc
,
prog_doc
,
NULL
);
if
(
!
format_str
)
format_str
=
default_format_str
;
...
...
mh/tests/comp.at
View file @
c1f2442
...
...
@@ -193,6 +193,49 @@ message body
Seen by mhed
])
MH_CHECK([use Draft-Folder],[comp07 draftfolder],
[mkdir Mail/drafts
echo "Draft-Folder: +drafts" >> $MH
echo 'quit' | compcmd | cwdrepl
sed 's/ *$//' Mail/drafts/1
],
[0],
[-- Editor invocation: ./Mail/drafts/1
-- Input file:
To:
cc:
Subject:
--------
-- Input file end
What now? draft left on "./Mail/drafts/1".
To:
cc:
Subject:
--------
Seen by mhed
])
MH_CHECK([-nodraftfolder],[comp08 nodraftfolder draftfolder],
[mkdir Mail/drafts
echo "Draft-Folder: +drafts" >> $MH
echo 'quit' | compcmd -nodraftfolder | cwdrepl
sed 's/ *$//' Mail/draft
],
[0],
[-- Editor invocation: ./Mail/draft
-- Input file:
To:
cc:
Subject:
--------
-- Input file end
What now? draft left on "./Mail/draft".
To:
cc:
Subject:
--------
Seen by mhed
])
m4_popdef([compcmd])
m4_popdef([MH_KEYWORDS])
...
...
mh/tests/forw.at
View file @
c1f2442
...
...
@@ -397,6 +397,129 @@ message body
What now? draft left on "./Mail/draft".
])
MH_CHECK([Draft-Folder],[forw07 forw-draftfolder draftfolder],[
mkdir Mail/inbox
mkdir Mail/drafts
echo "Draft-Folder: +drafts" >> $MH
AT_DATA([Mail/inbox/1],[From: gray
To: root
Subject: test input
message body
])
echo "quit" | forwcmd 1 | cwdrepl
echo == Mail/drafts/1 ==
cat Mail/drafts/1
echo == Message ==
sed '/^X-IMAPbase/d' Mail/inbox/1
],
[0],
[-- Editor invocation: ./Mail/drafts/1
-- Input file:
To:
cc:
Subject:
--------
------- Forwarded message
From: gray
To: root
Subject: test input
message body
------- End of Forwarded message
-- Input file end
What now? draft left on "./Mail/drafts/1".
== Mail/drafts/1 ==
To:
cc:
Subject:
--------
------- Forwarded message
From: gray
To: root
Subject: test input
message body
------- End of Forwarded message
Seen by mhed
== Message ==
From: gray
To: root
Subject: test input
message body
])
MH_CHECK([-nodraftfolder],[forw08 forw-nodraftfolder nodraftfolder draftfolder],[
mkdir Mail/inbox
mkdir Mail/drafts
echo "Draft-Folder: +drafts" >> $MH
AT_DATA([Mail/inbox/1],[From: gray
To: root
Subject: test input
message body
])
echo "quit" | forwcmd -nodraftfolder 1 | cwdrepl
echo == Mail/draft ==
cat Mail/draft
echo == Message ==
sed '/^X-IMAPbase/d' Mail/inbox/1
],
[0],
[-- Editor invocation: ./Mail/draft
-- Input file:
To:
cc:
Subject:
--------
------- Forwarded message
From: gray
To: root
Subject: test input
message body
------- End of Forwarded message
-- Input file end
What now? draft left on "./Mail/draft".
== Mail/draft ==
To:
cc:
Subject:
--------
------- Forwarded message
From: gray
To: root
Subject: test input
message body
------- End of Forwarded message
Seen by mhed
== Message ==
From: gray
To: root
Subject: test input
message body
])
m4_popdef([forwcmd])
m4_popdef([MH_KEYWORDS])
...
...
mh/tests/repl.at
View file @
c1f2442
...
...
@@ -79,6 +79,70 @@ X-Mailer: MH (AT_PACKAGE_NAME AT_PACKAGE_VERSION)
Seen by mhed
])
MH_CHECK([Draft-Folder],[repl02 repl-draftfolder draftfolder],[
mkdir Mail/inbox
mkdir Mail/drafts
echo "Draft-Folder: +drafts" >> $MH
AT_DATA([Mail/inbox/1],[From: gray@example.com
To: root@example.com
Subject: test input
message body
])
echo "quit" | replcmd +inbox 1 | cwdrepl
echo == Mail/drafts/1 ==
cat Mail/drafts/1
],
[0],
[-- Editor invocation: ./Mail/drafts/1
-- Input file:
To: <gray@example.com>
Subject: Re: test input
X-Mailer: MH (AT_PACKAGE_NAME AT_PACKAGE_VERSION)
--------
-- Input file end
What now? draft left on "./Mail/drafts/1".
== Mail/drafts/1 ==
To: <gray@example.com>
Subject: Re: test input
X-Mailer: MH (AT_PACKAGE_NAME AT_PACKAGE_VERSION)
--------
Seen by mhed
])
MH_CHECK([-nodraftfolder],[repl03 repl-nodraftfolder nodraftfolder draftfolder],[
mkdir Mail/inbox
mkdir Mail/drafts
echo "Draft-Folder: +drafts" >> $MH
AT_DATA([Mail/inbox/1],[From: gray@example.com
To: root@example.com
Subject: test input
message body
])
echo "quit" | replcmd -nodraftfolder +inbox 1 | cwdrepl
echo == Mail/draft ==
cat Mail/draft
],
[0],
[-- Editor invocation: ./Mail/draft
-- Input file:
To: <gray@example.com>
Subject: Re: test input
X-Mailer: MH (AT_PACKAGE_NAME AT_PACKAGE_VERSION)
--------
-- Input file end
What now? draft left on "./Mail/draft".
== Mail/draft ==
To: <gray@example.com>
Subject: Re: test input
X-Mailer: MH (AT_PACKAGE_NAME AT_PACKAGE_VERSION)
--------
Seen by mhed
])
m4_popdef([replcmd])
m4_popdef([MH_KEYWORDS])
# End of repl.at
...
...
mh/whom.c
View file @
c1f2442
...
...
@@ -21,7 +21,7 @@ static char prog_doc[] = N_("Report to whom a message would go");
static
char
args_doc
[]
=
"[FILE]"
;
static
int
check_recipients
;
static
int
use_draft
;
/* Use the prepared draft */
static
char
*
message
;
static
const
char
*
draft_folder
;
/* Use this draft folder */
static
void
...
...
@@ -45,7 +45,7 @@ static struct mu_option options[] = {
mu_c_string
,
NULL
,
add_alias
},
{
"draft"
,
0
,
NULL
,
MU_OPTION_DEFAULT
,
N_
(
"use prepared draft"
),
mu_c_
bool
,
&
use_draft
},
mu_c_
string
,
&
message
,
NULL
,
"draft"
},
{
"draftfolder"
,
0
,
N_
(
"FOLDER"
),
MU_OPTION_DEFAULT
,
N_
(
"specify the folder for message drafts"
),
mu_c_string
,
&
draft_folder
},
...
...
@@ -60,22 +60,57 @@ static struct mu_option options[] = {
mu_c_bool
,
&
check_recipients
},
MU_OPTION_END
};
static
struct
mh_optinit
optinit
[]
=
{
{
"draftfolder"
,
"Draft-Folder"
},
{
NULL
}
};
int
main
(
int
argc
,
char
**
argv
)
{
char
*
name
=
"draft"
;
mh_getopt
(
&
argc
,
&
argv
,
options
,
0
,
args_doc
,
prog_doc
,
NULL
);
int
rc
;
mh_getopt
_ext
(
&
argc
,
&
argv
,
options
,
0
,
optinit
,
args_doc
,
prog_doc
,
NULL
);
if
(
!
use_draft
&&
argc
>
0
)
name
=
argv
[
0
];
if
(
draft_folder
)
{
mu_mailbox_t
mbox
=
mh_open_folder
(
draft_folder
,
MU_STREAM_READ
);
mu_msgset_t
msgset
;
size_t
msgno
;
mu_message_t
msg
;
mh_msgset_parse
(
&
msgset
,
mbox
,
argc
,
argv
,
"cur"
);
if
(
!
mh_msgset_single_message
(
msgset
))
{
mu_error
(
_
(
"only one message at a time!"
));
return
1
;
}
msgno
=
mh_msgset_first
(
msgset
,
RET_MSGNO
);
rc
=
mu_mailbox_get_message
(
mbox
,
msgno
,
&
msg
);
if
(
rc
)
{
mu_error
(
_
(
"can't read message: %s"
),
mu_strerror
(
rc
));
exit
(
1
);
}
rc
=
mh_whom_message
(
msg
,
check_recipients
);
}
else
{
if
(
argc
>
0
)
{
if
(
message
||
argc
>
1
)
{
mu_error
(
_
(
"only one file at a time!"
));
exit
(
1
);
}
message
=
argv
[
0
];
}
else
message
=
"draft"
;
rc
=
mh_whom_file
(
mh_expand_name
(
draft_folder
,
message
,
NAME_ANY
),
check_recipients
);
}
if
(
!
draft_folder
)
draft_folder
=
mh_global_profile_get
(
"Draft-Folder"
,
mu_folder_directory
());
return
mh_whom
(
mh_expand_name
(
draft_folder
,
name
,
NAME_ANY
),
check_recipients
)
?
1
:
0
;
return
rc
?
1
:
0
;
}
...
...
Please
register
or
sign in
to post a comment