From a1c6a692e955ff977616096bae3cb2ffa7a8b831 Mon Sep 17 00:00:00 2001 From: Nikola Pajkovsky Date: Mon, 7 Jun 2010 13:37:27 +0200 Subject: get rid of std::string from mailx Signed-off-by: Nikola Pajkovsky --- lib/plugins/Mailx.cpp | 117 +++++++++++++++-------------------------------- lib/plugins/Mailx.h | 12 ++--- lib/utils/make_descr.cpp | 42 +++++++++++++++++ 3 files changed, 86 insertions(+), 85 deletions(-) (limited to 'lib') 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(); -- cgit