summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorNikola Pajkovsky <npajkovs@redhat.com>2010-06-07 13:37:27 +0200
committerNikola Pajkovsky <npajkovs@redhat.com>2010-08-17 15:18:18 +0200
commita1c6a692e955ff977616096bae3cb2ffa7a8b831 (patch)
tree39a1bd662767a26369dfd3e272a946a4d19fb5f3 /lib
parent02b874b245cf59249fb90b163ec884e2f2c4cdbe (diff)
downloadabrt-a1c6a692e955ff977616096bae3cb2ffa7a8b831.tar.gz
abrt-a1c6a692e955ff977616096bae3cb2ffa7a8b831.tar.xz
abrt-a1c6a692e955ff977616096bae3cb2ffa7a8b831.zip
get rid of std::string from mailx
Signed-off-by: Nikola Pajkovsky <npajkovs@redhat.com>
Diffstat (limited to 'lib')
-rw-r--r--lib/plugins/Mailx.cpp117
-rw-r--r--lib/plugins/Mailx.h12
-rw-r--r--lib/utils/make_descr.cpp42
3 files changed, 86 insertions, 85 deletions
diff --git a/lib/plugins/Mailx.cpp b/lib/plugins/Mailx.cpp
index a94a2c5c..2580bab3 100644
--- a/lib/plugins/Mailx.cpp
+++ b/lib/plugins/Mailx.cpp
@@ -26,26 +26,34 @@
#define MAILX_COMMAND "/bin/mailx"
-CMailx::CMailx() :
- m_sEmailFrom("user@localhost"),
- m_sEmailTo("root@localhost"),
- m_sSubject("[abrt] full crash report"),
- m_bSendBinaryData(false)
-{}
-
-static void exec_and_feed_input(uid_t uid, const char* pText, char **pArgs)
+CMailx::CMailx()
+{
+ m_email_from = xstrdup("user@localhost");
+ m_email_to = xstrdup("root@localhost");
+ m_subject = xstrdup("[abrt] full crash report");
+ m_send_binary_data = false;
+}
+
+CMailx::~CMailx()
+{
+ free(m_email_from);
+ free(m_email_to);
+ free(m_subject);
+}
+
+static void exec_and_feed_input(uid_t uid, const char* text, char **args)
{
int pipein[2];
pid_t child = fork_execv_on_steroids(
EXECFLG_INPUT | EXECFLG_QUIET | EXECFLG_SETGUID,
- pArgs,
+ args,
pipein,
/*unsetenv_vec:*/ NULL,
/*dir:*/ NULL,
uid);
- full_write(pipein[1], pText, strlen(pText));
+ full_write(pipein[1], text, strlen(text));
close(pipein[1]);
waitpid(child, NULL, 0); /* wait for command completion */
@@ -71,70 +79,29 @@ std::string CMailx::Report(const map_crash_data_t& pCrashData,
unsigned arg_size = 0;
args = append_str_to_vector(args, arg_size, MAILX_COMMAND);
-//TODO: move email body generation to make_descr.cpp
- std::string binaryFiles, commonFiles, additionalFiles, DUPHASHFile;
+ char *dsc = make_dsc_mailx(pCrashData);
+
map_crash_data_t::const_iterator it;
for (it = pCrashData.begin(); it != pCrashData.end(); it++)
{
- if (it->second[CD_TYPE] == CD_TXT)
- {
- if (it->first != CD_DUPHASH
- && it->first != FILENAME_ARCHITECTURE
- && it->first != FILENAME_KERNEL
- && it->first != FILENAME_PACKAGE
- ) {
- additionalFiles += it->first;
- additionalFiles += "\n-----\n";
- additionalFiles += it->second[CD_CONTENT];
- additionalFiles += "\n\n";
- }
- else if (it->first == CD_DUPHASH)
- {
- DUPHASHFile += it->first;
- DUPHASHFile += "\n-----\n";
- DUPHASHFile += it->second[CD_CONTENT];
- DUPHASHFile += "\n\n";
- }
- else
- {
- commonFiles += it->first;
- commonFiles += "\n-----\n";
- commonFiles += it->second[CD_CONTENT];
- commonFiles += "\n\n";
- }
- }
- if (it->second[CD_TYPE] == CD_BIN)
+ if (it->second[CD_TYPE] == CD_BIN && m_send_binary_data)
{
- binaryFiles += " -a ";
- binaryFiles += it->second[CD_CONTENT];
- if (m_bSendBinaryData)
- {
- args = append_str_to_vector(args, arg_size, "-a");
- args = append_str_to_vector(args, arg_size, it->second[CD_CONTENT].c_str());
- }
+ args = append_str_to_vector(args, arg_size, "-a");
+ args = append_str_to_vector(args, arg_size, it->second[CD_CONTENT].c_str());
}
}
- std::string emailBody = "Duplicate check\n";
- emailBody += "=====\n\n";
- emailBody += DUPHASHFile;
- emailBody += "\nCommon information\n";
- emailBody += "=====\n\n";
- emailBody += commonFiles;
- emailBody += "\nAdditional information\n";
- emailBody += "=====\n\n";
- emailBody += additionalFiles;
- emailBody += '\n';
-
args = append_str_to_vector(args, arg_size, "-s");
- args = append_str_to_vector(args, arg_size, (pArgs[0] != '\0' ? pArgs : m_sSubject.c_str()));
+ args = append_str_to_vector(args, arg_size, (pArgs[0] != '\0' ? pArgs : m_subject));
args = append_str_to_vector(args, arg_size, "-r");
- args = append_str_to_vector(args, arg_size, m_sEmailFrom.c_str());
- args = append_str_to_vector(args, arg_size, m_sEmailTo.c_str());
+ args = append_str_to_vector(args, arg_size, m_email_from);
+ args = append_str_to_vector(args, arg_size, m_email_to);
update_client(_("Sending an email..."));
- const char *uid_str = get_crash_data_item_content(pCrashData, CD_UID).c_str();
- exec_and_feed_input(xatoi_u(uid_str), emailBody.c_str(), args);
+ const char *uid_str = get_crash_data_item_content_or_NULL(pCrashData, CD_UID);
+ exec_and_feed_input(xatoi_u(uid_str), dsc, args);
+
+ free(dsc);
while (*args)
{
@@ -143,7 +110,7 @@ std::string CMailx::Report(const map_crash_data_t& pCrashData,
args -= arg_size;
free(args);
- return "Email was sent to: " + m_sEmailTo;
+ return ssprintf("Email was sent to: %s", m_email_to);
}
void CMailx::SetSettings(const map_plugin_settings_t& pSettings)
@@ -155,36 +122,28 @@ void CMailx::SetSettings(const map_plugin_settings_t& pSettings)
it = pSettings.find("Subject");
if (it != end)
{
- m_sSubject = it->second;
+ free(m_subject);
+ m_subject = xstrdup(it->second.c_str());
}
it = pSettings.find("EmailFrom");
if (it != end)
{
- m_sEmailFrom = it->second;
+ free(m_email_from);
+ m_email_from = xstrdup(it->second.c_str());
}
it = pSettings.find("EmailTo");
if (it != end)
{
- m_sEmailTo = it->second;
+ free(m_email_to);
+ m_email_to = xstrdup(it->second.c_str());
}
it = pSettings.find("SendBinaryData");
if (it != end)
{
- m_bSendBinaryData = string_to_bool(it->second.c_str());
+ m_send_binary_data = string_to_bool(it->second.c_str());
}
}
-//ok to delete?
-//const map_plugin_settings_t& CMailx::GetSettings()
-//{
-// m_pSettings["Subject"] = m_sSubject;
-// m_pSettings["EmailFrom"] = m_sEmailFrom;
-// m_pSettings["EmailTo"] = m_sEmailTo;
-// m_pSettings["SendBinaryData"] = m_bSendBinaryData ? "yes" : "no";
-//
-// return m_pSettings;
-//}
-
PLUGIN_INFO(REPORTER,
CMailx,
"Mailx",
diff --git a/lib/plugins/Mailx.h b/lib/plugins/Mailx.h
index aa870ec6..326a6371 100644
--- a/lib/plugins/Mailx.h
+++ b/lib/plugins/Mailx.h
@@ -29,17 +29,17 @@
class CMailx : public CReporter
{
private:
- std::string m_sEmailFrom;
- std::string m_sEmailTo;
- std::string m_sSubject;
- bool m_bSendBinaryData;
+ char *m_email_from;
+ char *m_email_to;
+ char *m_subject;
+ bool m_send_binary_data;
public:
CMailx();
+ ~CMailx();
virtual void SetSettings(const map_plugin_settings_t& pSettings);
-//ok to delete?
-// virtual const map_plugin_settings_t& GetSettings();
+
virtual std::string Report(const map_crash_data_t& pCrashData,
const map_plugin_settings_t& pSettings,
const char *pArgs);
diff --git a/lib/utils/make_descr.cpp b/lib/utils/make_descr.cpp
index 93ae2925..8569100f 100644
--- a/lib/utils/make_descr.cpp
+++ b/lib/utils/make_descr.cpp
@@ -88,6 +88,48 @@ static const char *const blacklisted_items[] = {
NULL
};
+char* make_dsc_mailx(const map_crash_data_t & crash_data)
+{
+ struct strbuf *buf_dsc = strbuf_new();
+ struct strbuf *buf_additional_files = strbuf_new();
+ struct strbuf *buf_duphash_file = strbuf_new();
+ struct strbuf *buf_common_files = strbuf_new();
+
+ map_crash_data_t::const_iterator it;
+ for (it = crash_data.begin(); it != crash_data.end(); it++)
+ {
+ if (it->second[CD_TYPE] == CD_TXT)
+ {
+ const char *itemname = it->first.c_str();
+ if ((strcmp(itemname, CD_DUPHASH) != 0)
+ && (strcmp(itemname, FILENAME_ARCHITECTURE) != 0)
+ && (strcmp(itemname, FILENAME_KERNEL) != 0)
+ && (strcmp(itemname, FILENAME_PACKAGE) != 0)
+ ) {
+ strbuf_append_strf(buf_additional_files, "%s\n-----\n%s\n\n", itemname, it->second[CD_CONTENT].c_str());
+ }
+ else if (strcmp(itemname, CD_DUPHASH) == 0)
+ strbuf_append_strf(buf_duphash_file, "%s\n-----\n%s\n\n", itemname, it->second[CD_CONTENT].c_str());
+ else
+ strbuf_append_strf(buf_common_files, "%s\n-----\n%s\n\n", itemname, it->second[CD_CONTENT].c_str());
+ }
+ }
+
+ char *common_files = strbuf_free_nobuf(buf_common_files);
+ char *duphash_file = strbuf_free_nobuf(buf_duphash_file);
+ char *additional_files = strbuf_free_nobuf(buf_additional_files);
+
+ strbuf_append_strf(buf_dsc, "Duplicate check\n=====\n%s\n\n", duphash_file);
+ strbuf_append_strf(buf_dsc, "Common information\n=====\n%s\n\n", common_files);
+ strbuf_append_strf(buf_dsc, "Additional information\n=====\n%s\n", additional_files);
+
+ free(common_files);
+ free(duphash_file);
+ free(additional_files);
+
+ return strbuf_free_nobuf(buf_dsc);
+}
+
char* make_description_bz(const map_crash_data_t& pCrashData)
{
struct strbuf *buf_dsc = strbuf_new();