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
5c50702c
...
5c50702cdf6552db0098564009f3b49c3ce80df1
authored
2003-03-11 14:11:31 +0000
by
Sergey Poznyakoff
Browse Files
Options
Browse Files
Tag
Download
Email Patches
Plain Diff
Added to the repository
1 parent
c36e5d80
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
304 additions
and
0 deletions
mh/mh_whom.c
mh/whom.c
mh/mh_whom.c
0 → 100644
View file @
5c50702
/* GNU Mailutils -- a suite of utilities for electronic mail
Copyright (C) 2003 Free Software Foundation, Inc.
GNU Mailutils is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Mailutils is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Mailutils; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
#include <mh.h>
struct
recipient
{
char
*
addr
;
int
isbcc
;
};
static
list_t
local_rcp
;
/* Local recipients */
static
list_t
network_rcp
;
/* Network recipients */
static
void
addrcp
(
list_t
*
list
,
char
*
addr
,
int
isbcc
)
{
int
rc
;
struct
recipient
*
p
=
xmalloc
(
sizeof
(
*
p
));
p
->
addr
=
addr
;
p
->
isbcc
=
isbcc
;
if
(
!*
list
&&
(
rc
=
list_create
(
list
)))
{
mh_error
(
_
(
"can't create list: %s"
),
mu_strerror
(
rc
));
exit
(
1
);
}
list_append
(
*
list
,
p
);
}
static
int
ismydomain
(
char
*
p
)
{
char
*
domain
;
if
(
!
p
)
return
1
;
mu_get_user_email_domain
(
&
domain
);
return
strcasecmp
(
domain
,
p
+
1
)
==
0
;
}
static
void
scan_addrs
(
char
*
str
,
int
isbcc
)
{
address_t
addr
;
size_t
i
,
count
;
address_create
(
&
addr
,
str
);
address_get_count
(
addr
,
&
count
);
for
(
i
=
1
;
i
<=
count
;
i
++
)
{
char
*
buf
,
*
p
;
int
rc
;
rc
=
address_aget_email
(
addr
,
i
,
&
buf
);
if
(
rc
)
{
mh_error
(
"address_aget_email: %s"
,
mu_strerror
(
rc
));
continue
;
}
p
=
strchr
(
buf
,
'@'
);
if
(
ismydomain
(
p
))
addrcp
(
&
local_rcp
,
buf
,
isbcc
);
else
addrcp
(
&
network_rcp
,
buf
,
isbcc
);
}
address_destroy
(
&
addr
);
free
(
str
);
/* FIXME: This will disappear. Note comment to
mh_context_get_value! */
}
static
int
_destroy_recipient
(
void
*
item
,
void
*
unused_data
)
{
struct
recipient
*
p
=
item
;
free
(
p
->
addr
);
free
(
p
);
return
0
;
}
static
void
destroy_addrs
(
list_t
*
list
)
{
if
(
!*
list
)
return
;
list_do
(
*
list
,
_destroy_recipient
,
NULL
);
list_destroy
(
list
);
}
/* Print an email in more readable form: localpart + "at" + domain */
static
void
print_readable
(
char
*
email
,
int
islocal
)
{
printf
(
" "
);
for
(;
*
email
&&
*
email
!=
'@'
;
email
++
)
putchar
(
*
email
);
if
(
!*
email
||
islocal
)
return
;
printf
(
_
(
" at %s"
),
email
+
1
);
}
static
int
_print_recipient
(
void
*
item
,
void
*
data
)
{
struct
recipient
*
p
=
item
;
size_t
*
count
=
data
;
print_readable
(
p
->
addr
,
0
);
if
(
p
->
isbcc
)
printf
(
"[BCC]"
);
printf
(
"
\n
"
);
(
*
count
)
++
;
return
0
;
}
static
int
_print_local_recipient
(
void
*
item
,
void
*
data
)
{
struct
recipient
*
p
=
item
;
size_t
*
count
=
data
;
print_readable
(
p
->
addr
,
1
);
if
(
p
->
isbcc
)
printf
(
"[BCC]"
);
printf
(
"
\n
"
);
(
*
count
)
++
;
return
0
;
}
int
mh_whom
(
char
*
filename
,
int
check
)
{
int
rc
=
0
;
mh_context_t
*
ctx
;
ctx
=
mh_context_create
(
filename
,
1
);
if
(
mh_context_read
(
ctx
))
{
mh_error
(
_
(
"malformed message"
));
rc
=
-
1
;
}
else
{
size_t
count
=
0
;
scan_addrs
(
mh_context_get_value
(
ctx
,
MU_HEADER_TO
,
NULL
),
0
);
scan_addrs
(
mh_context_get_value
(
ctx
,
MU_HEADER_CC
,
NULL
),
0
);
scan_addrs
(
mh_context_get_value
(
ctx
,
MU_HEADER_BCC
,
NULL
),
1
);
if
(
local_rcp
)
{
printf
(
" %s
\n
"
,
_
(
"-- Local Recipients --"
));
list_do
(
local_rcp
,
_print_local_recipient
,
&
count
);
}
if
(
network_rcp
)
{
printf
(
" %s
\n
"
,
_
(
"-- Network Recipients --"
));
list_do
(
network_rcp
,
_print_recipient
,
&
count
);
}
if
(
count
==
0
)
{
mh_error
(
_
(
"No recipients"
));
rc
=
-
1
;
}
}
free
(
ctx
);
destroy_addrs
(
&
network_rcp
);
destroy_addrs
(
&
local_rcp
);
return
rc
;
}
mh/whom.c
0 → 100644
View file @
5c50702
/* GNU Mailutils -- a suite of utilities for electronic mail
Copyright (C) 2003 Free Software Foundation, Inc.
GNU Mailutils is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Mailutils is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Mailutils; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
#include <mh.h>
const
char
*
argp_program_version
=
"whom ("
PACKAGE_STRING
")"
;
static
char
doc
[]
=
N_
(
"GNU MH whom
\v
"
"Use -help to obtain the list of traditional MH options."
);
static
char
args_doc
[]
=
"[file]"
;
/* GNU options */
static
struct
argp_option
options
[]
=
{
{
"alias"
,
ARG_ALIAS
,
N_
(
"FILE"
),
0
,
N_
(
"* Specify additional alias file"
)
},
{
"draft"
,
ARG_DRAFT
,
NULL
,
0
,
N_
(
"Use prepared draft"
)
},
{
"draftfolder"
,
ARG_DRAFTFOLDER
,
N_
(
"FOLDER"
),
0
,
N_
(
"Specify the folder for message drafts"
)
},
{
"draftmessage"
,
ARG_DRAFTMESSAGE
,
NULL
,
0
,
N_
(
"Treat the arguments as a list of messages from the draftfolder"
)
},
{
"nodraftfolder"
,
ARG_NODRAFTFOLDER
,
NULL
,
0
,
N_
(
"Undo the effect of the last --draftfolder option"
)
},
{
"check"
,
ARG_CHECK
,
N_
(
"BOOL"
),
OPTION_ARG_OPTIONAL
,
N_
(
"Check if addresses are deliverable"
)
},
{
"nocheck"
,
ARG_NOCHECK
,
NULL
,
OPTION_HIDDEN
,
""
},
{
NULL
}
};
/* Traditional MH options */
struct
mh_option
mh_option
[]
=
{
{
"alias"
,
1
,
0
,
"aliasfile"
},
{
"draft"
,
5
,
0
,
NULL
},
{
"draftfolder"
,
6
,
0
,
"folder"
},
{
"draftmessage"
,
6
,
0
,
"message"
},
{
"nodraftfolder"
,
3
,
0
,
NULL
},
{
"check"
,
1
,
0
,
MH_OPT_BOOL
,
NULL
},
{
NULL
}
};
static
int
check_recipients
;
static
int
use_draft
;
/* Use the prepared draft */
static
char
*
draft_folder
;
/* Use this draft folder */
static
int
opt_handler
(
int
key
,
char
*
arg
,
void
*
unused
,
struct
argp_state
*
state
)
{
switch
(
key
)
{
case
ARG_ALIAS
:
return
1
;
case
ARG_DRAFT
:
use_draft
=
1
;
break
;
case
ARG_DRAFTFOLDER
:
draft_folder
=
arg
;
break
;
case
ARG_NODRAFTFOLDER
:
draft_folder
=
NULL
;
break
;
case
ARG_DRAFTMESSAGE
:
if
(
!
draft_folder
)
draft_folder
=
mh_global_profile_get
(
"Draft-Folder"
,
mu_path_folder_dir
);
break
;
case
ARG_CHECK
:
check_recipients
=
is_true
(
arg
);
break
;
case
ARG_NOCHECK
:
check_recipients
=
0
;
break
;
default:
return
1
;
}
return
0
;
}
int
main
(
int
argc
,
char
**
argv
)
{
int
index
;
char
*
name
=
"draft"
;
mu_init_nls
();
mh_argp_parse
(
argc
,
argv
,
0
,
options
,
mh_option
,
args_doc
,
doc
,
opt_handler
,
NULL
,
&
index
);
argc
-=
index
;
argv
+=
index
;
if
(
!
use_draft
&&
argc
>
1
)
name
=
argv
[
0
];
if
(
!
draft_folder
)
draft_folder
=
mh_global_profile_get
(
"Draft-Folder"
,
mu_path_folder_dir
);
return
mh_whom
(
mh_expand_name
(
draft_folder
,
name
,
0
),
check_recipients
)
?
1
:
0
;
}
Please
register
or
sign in
to post a comment