int safe_asprintf (char **strp, const char *fmt, ...) { va_list ap; int n; va_start (ap, fmt); n = vasprintf (strp, fmt, ap); va_end (ap); /* GNU libc man page for vasprintf(3) states that the value of *strp * is undefined when the return code is -1. */ if (n < 0) { mutt_error _("Out of memory!"); sleep (1); mutt_exit (1); } if (n == 0) { /* Mutt convention is to use NULL for 0-length strings */ FREE (strp); /* __FREE_CHECKED__ */ } return n; }
void safe_realloc (void *ptr, size_t siz) { void *r; void **p = (void **)ptr; if (siz == 0) { if (*p) { free (*p); /* __MEM_CHECKED__ */ *p = NULL; } return; } if (*p) r = (void *) realloc (*p, siz); /* __MEM_CHECKED__ */ else { /* realloc(NULL, nbytes) doesn't seem to work under SunOS 4.1.x --- __MEM_CHECKED__ */ r = (void *) malloc (siz); /* __MEM_CHECKED__ */ } if (!r) { mutt_error _("Out of memory!"); sleep (1); mutt_exit (1); } *p = r; }
/** * mutt_getch - Read a character from the input buffer * @retval obj Event to process * * The priority for reading events is: * 1. UngetKeyEvents buffer * 2. MacroEvents buffer * 3. Keyboard * * This function can return: * - Error `{ -1, OP_NULL }` * - Timeout `{ -2, OP_NULL }` */ struct Event mutt_getch(void) { int ch; struct Event err = { -1, OP_NULL }, ret; struct Event timeout = { -2, OP_NULL }; if (UngetCount) return UngetKeyEvents[--UngetCount]; if (!OptIgnoreMacroEvents && MacroBufferCount) return MacroEvents[--MacroBufferCount]; SigInt = 0; mutt_sig_allow_interrupt(1); #ifdef KEY_RESIZE /* ncurses 4.2 sends this when the screen is resized */ ch = KEY_RESIZE; while (ch == KEY_RESIZE) #endif /* KEY_RESIZE */ #ifdef USE_INOTIFY ch = mutt_monitor_getch(); #else ch = getch(); #endif /* USE_INOTIFY */ mutt_sig_allow_interrupt(0); if (SigInt) { mutt_query_exit(); return err; } /* either timeout, a sigwinch (if timeout is set), or the terminal * has been lost */ if (ch == ERR) { if (!isatty(0)) mutt_exit(1); return timeout; } if ((ch & 0x80) && C_MetaKey) { /* send ALT-x as ESC-x */ ch &= ~0x80; mutt_unget_event(ch, 0); ret.ch = '\033'; ret.op = 0; return ret; } ret.ch = ch; ret.op = 0; return (ch == ctrl('G')) ? err : ret; }
void *safe_calloc (size_t nmemb, size_t size) { void *p; if (!nmemb || !size) return NULL; if (((size_t) -1) / nmemb <= size) { mutt_error _("Integer overflow -- can't allocate memory!"); sleep (1); mutt_exit (1); } if (!(p = calloc (nmemb, size))) { mutt_error _("Out of memory!"); sleep (1); mutt_exit (1); } return p; }
void *safe_malloc (size_t siz) { void *p; if (siz == 0) return 0; if ((p = (void *) malloc (siz)) == 0) /* __MEM_CHECKED__ */ { mutt_error _("Out of memory!"); sleep (1); mutt_exit (1); } return (p); }
/** * mutt_query_exit - Ask the user if they want to leave NeoMutt * * This function is called when the user presses the abort key. */ void mutt_query_exit(void) { mutt_flushinp(); curs_set(1); if (C_Timeout) mutt_getch_timeout(-1); /* restore blocking operation */ if (mutt_yesorno(_("Exit NeoMutt?"), MUTT_YES) == MUTT_YES) { mutt_exit(1); } mutt_clear_error(); mutt_curs_set(-1); SigInt = 0; }
void *safe_calloc (size_t nmemb, size_t size) { void *p; if (!nmemb || !size) return NULL; if (!(p = calloc (nmemb, size))) { mutt_error _("Out of memory!"); sleep (1); mutt_exit (1); } return p; }
/** * crypt_init - Initialise the crypto backends * * This calls CryptModuleSpecs::init() */ void crypt_init(void) { #ifdef CRYPT_BACKEND_CLASSIC_PGP if ( #ifdef CRYPT_BACKEND_GPGME (!C_CryptUseGpgme) #else 1 #endif ) crypto_module_register(&CryptModPgpClassic); #endif #ifdef CRYPT_BACKEND_CLASSIC_SMIME if ( #ifdef CRYPT_BACKEND_GPGME (!C_CryptUseGpgme) #else 1 #endif ) crypto_module_register(&CryptModSmimeClassic); #endif if (C_CryptUseGpgme) { #ifdef CRYPT_BACKEND_GPGME crypto_module_register(&CryptModPgpGpgme); crypto_module_register(&CryptModSmimeGpgme); #else mutt_message(_("\"crypt_use_gpgme\" set" " but not built with GPGME support")); if (mutt_any_key_to_continue(NULL) == -1) mutt_exit(1); #endif } #if defined(CRYPT_BACKEND_CLASSIC_PGP) || \ defined(CRYPT_BACKEND_CLASSIC_SMIME) || defined(CRYPT_BACKEND_GPGME) if (CRYPT_MOD_CALL_CHECK(PGP, init)) CRYPT_MOD_CALL(PGP, init)(); if (CRYPT_MOD_CALL_CHECK(SMIME, init)) CRYPT_MOD_CALL(SMIME, init)(); #endif }
void crypt_init (void) { #ifdef CRYPT_BACKEND_CLASSIC_PGP if ( #ifdef CRYPT_BACKEND_GPGME (! option (OPTCRYPTUSEGPGME)) #else 1 #endif ) crypto_module_register (&crypt_mod_pgp_classic); #endif #ifdef CRYPT_BACKEND_CLASSIC_SMIME if ( #ifdef CRYPT_BACKEND_GPGME (! option (OPTCRYPTUSEGPGME)) #else 1 #endif ) crypto_module_register (&crypt_mod_smime_classic); #endif if (option (OPTCRYPTUSEGPGME)) { #ifdef CRYPT_BACKEND_GPGME crypto_module_register (&crypt_mod_pgp_gpgme); crypto_module_register (&crypt_mod_smime_gpgme); #else mutt_message (_("\"crypt_use_gpgme\" set" " but not built with GPGME support.")); if (mutt_any_key_to_continue (NULL) == -1) mutt_exit(1); #endif } #if defined CRYPT_BACKEND_CLASSIC_PGP || defined CRYPT_BACKEND_CLASSIC_SMIME || defined CRYPT_BACKEND_GPGME if (CRYPT_MOD_CALL_CHECK (PGP, init)) (CRYPT_MOD_CALL (PGP, init)) (); if (CRYPT_MOD_CALL_CHECK (SMIME, init)) (CRYPT_MOD_CALL (SMIME, init)) (); #endif }