/*
+ * Copyright notice from original mutt:
* Copyright (C) 1996-2000 Michael R. Elkins <me@mutt.org>
* Copyright (C) 1999-2000 Thomas Roessler <roessler@does-not-exist.org>
- *
- * This program 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 of the License, or (at your option) any later
- * version.
- *
- * This program 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 this program; if not, write to the Free
- * Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111, USA.
+ *
+ * This file is part of mutt-ng, see http://www.muttng.org/.
+ * It's licensed under the GNU General Public License,
+ * please see the file GPL in the top level source directory.
*/
/*
#include <fcntl.h>
#include <pwd.h>
+#ifdef HAVE_SYSEXITS_H
+#include <sysexits.h>
+#else /* Make sure EX_OK is defined <philiph@pobox.com> */
+#define EX_OK 0
+#endif
+
#include "lib.h"
+#include "lib/mem.h"
+#include "lib/str.h"
+#include "lib/debug.h"
+
extern short Umask;
+static struct sysexits
+{
+ int v;
+ const char *str;
+}
+sysexits_h[] =
+{
+#ifdef EX_USAGE
+ { 0xff & EX_USAGE, "Bad usage." },
+#endif
+#ifdef EX_DATAERR
+ { 0xff & EX_DATAERR, "Data format error." },
+#endif
+#ifdef EX_NOINPUT
+ { 0xff & EX_NOINPUT, "Cannot open input." },
+#endif
+#ifdef EX_NOUSER
+ { 0xff & EX_NOUSER, "User unknown." },
+#endif
+#ifdef EX_NOHOST
+ { 0xff & EX_NOHOST, "Host unknown." },
+#endif
+#ifdef EX_UNAVAILABLE
+ { 0xff & EX_UNAVAILABLE, "Service unavailable." },
+#endif
+#ifdef EX_SOFTWARE
+ { 0xff & EX_SOFTWARE, "Internal error." },
+#endif
+#ifdef EX_OSERR
+ { 0xff & EX_OSERR, "Operating system error." },
+#endif
+#ifdef EX_OSFILE
+ { 0xff & EX_OSFILE, "System file missing." },
+#endif
+#ifdef EX_CANTCREAT
+ { 0xff & EX_CANTCREAT, "Can't create output." },
+#endif
+#ifdef EX_IOERR
+ { 0xff & EX_IOERR, "I/O error." },
+#endif
+#ifdef EX_TEMPFAIL
+ { 0xff & EX_TEMPFAIL, "Deferred." },
+#endif
+#ifdef EX_PROTOCOL
+ { 0xff & EX_PROTOCOL, "Remote protocol error." },
+#endif
+#ifdef EX_NOPERM
+ { 0xff & EX_NOPERM, "Insufficient permission." },
+#endif
+#ifdef EX_CONFIG
+ { 0xff & EX_NOPERM, "Local configuration error." },
+#endif
+ { S_ERR, "Exec error." },
+ { -1, NULL}
+};
+
void mutt_nocurses_error (const char *fmt, ...)
{
va_list ap;
fputc ('\n', stderr);
}
-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);
-}
-
-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;
-}
-
-void safe_free (void *ptr)
-{
- void **p = (void **) ptr;
-
- if (*p) {
- free (*p); /* __MEM_CHECKED__ */
- *p = 0;
- }
-}
-
int safe_fclose (FILE ** f)
{
int r = 0;
return r;
}
-char *safe_strdup (const char *s)
-{
- char *p;
- size_t l;
-
- if (!s || !*s)
- return 0;
- l = strlen (s) + 1;
- p = (char *) safe_malloc (l);
- memcpy (p, s, l);
- return (p);
-}
-
-char *safe_strcat (char *d, size_t l, const char *s)
-{
- char *p = d;
-
- if (!l)
- return d;
-
- l--; /* Space for the trailing '\0'. */
-
- for (; *d && l; l--)
- d++;
- for (; *s && l; l--)
- *d++ = *s++;
-
- *d = '\0';
-
- return p;
-}
-
-char *safe_strncat (char *d, size_t l, const char *s, size_t sl)
-{
- char *p = d;
-
- if (!l)
- return d;
-
- l--; /* Space for the trailing '\0'. */
-
- for (; *d && l; l--)
- d++;
- for (; *s && l && sl; l--, sl--)
- *d++ = *s++;
-
- *d = '\0';
-
- return p;
-}
-
-
-void mutt_str_replace (char **p, const char *s)
-{
- FREE (p);
- *p = safe_strdup (s);
-}
-
-void mutt_str_adjust (char **p)
-{
- if (!p || !*p)
- return;
- safe_realloc (p, strlen (*p) + 1);
-}
-
-/* convert all characters in the string to lowercase */
-char *mutt_strlower (char *s)
-{
- char *p = s;
-
- while (*p) {
- *p = tolower ((unsigned char) *p);
- p++;
- }
-
- return (s);
-}
-
void mutt_unlink (const char *s)
{
int fd;
if ((chunk = fread (buf, 1, chunk, in)) < 1)
break;
if (fwrite (buf, 1, chunk, out) != chunk) {
- /* dprint (1, (debugfile, "mutt_copy_bytes(): fwrite() returned short byte count\n")); */
+ debug_print (1, ("fwrite() returned short byte count\n"));
return (-1);
}
size -= chunk;
char abs_oldpath[_POSIX_PATH_MAX];
if ((getcwd (abs_oldpath, sizeof abs_oldpath) == NULL) ||
- (strlen (abs_oldpath) + 1 + strlen (oldpath) + 1 >
+ (str_len (abs_oldpath) + 1 + str_len (oldpath) + 1 >
sizeof abs_oldpath))
return -1;
/* make sure the file is not symlink */
if (lstat (path, &osb) < 0 || fstat (fd, &nsb) < 0 ||
compare_stat (&osb, &nsb) == -1) {
-/* dprint (1, (debugfile, "safe_open(): %s is a symlink!\n", path)); */
+ debug_print (1, ("%s is a symlink!\n", path));
close (fd);
return (-1);
}
char *ch;
if (!s) {
- s = safe_malloc (STRING);
+ s = mem_malloc (STRING);
*size = STRING;
}
FOREVER {
if (fgets (s + offset, *size - offset, fp) == NULL) {
- FREE (&s);
+ mem_free (&s);
return NULL;
}
if ((ch = strchr (s + offset, '\n')) != NULL) {
/* There wasn't room for the line -- increase ``s'' */
offset = *size - 1; /* overwrite the terminating 0 */
*size += STRING;
- safe_realloc (&s, *size);
+ mem_realloc (&s, *size);
}
}
}
}
-char *mutt_substrcpy (char *dest, const char *beg, const char *end,
- size_t destlen)
-{
- size_t len;
-
- len = end - beg;
- if (len > destlen - 1)
- len = destlen - 1;
- memcpy (dest, beg, len);
- dest[len] = 0;
- return dest;
-}
-
-char *mutt_substrdup (const char *begin, const char *end)
-{
- size_t len;
- char *p;
-
- if (end)
- len = end - begin;
- else
- len = strlen (begin);
-
- p = safe_malloc (len + 1);
- memcpy (p, begin, len);
- p[len] = 0;
- return p;
-}
-
/* prepare a file name to survive the shell's quoting rules.
* From the Unix programming FAQ by way of Liviu.
*/
return j;
}
-/* NULL-pointer aware string comparison functions */
-
-int mutt_strcmp (const char *a, const char *b)
-{
- return strcmp (NONULL (a), NONULL (b));
-}
-
-int mutt_strcasecmp (const char *a, const char *b)
-{
- return strcasecmp (NONULL (a), NONULL (b));
-}
-
-int mutt_strncmp (const char *a, const char *b, size_t l)
-{
- return strncmp (NONULL (a), NONULL (b), l);
-}
-
-int mutt_strncasecmp (const char *a, const char *b, size_t l)
-{
- return strncasecmp (NONULL (a), NONULL (b), l);
-}
-
-size_t mutt_strlen (const char *a)
-{
- return a ? strlen (a) : 0;
-}
-
-int mutt_strcoll (const char *a, const char *b)
-{
- return strcoll (NONULL (a), NONULL (b));
-}
-
-const char *mutt_stristr (const char *haystack, const char *needle)
-{
- const char *p, *q;
-
- if (!haystack)
- return NULL;
- if (!needle)
- return (haystack);
-
- while (*(p = haystack)) {
- for (q = needle;
- *p && *q &&
- tolower ((unsigned char) *p) == tolower ((unsigned char) *q);
- p++, q++);
- if (!*q)
- return (haystack);
- haystack++;
- }
- return NULL;
-}
-
-char *mutt_skip_whitespace (char *p)
-{
- SKIPWS (p);
- return p;
-}
-
-void mutt_remove_trailing_ws (char *s)
-{
- char *p;
-
- for (p = s + mutt_strlen (s) - 1; p >= s && ISSPACE (*p); p--)
- *p = 0;
-}
-
char *mutt_concat_path (char *d, const char *dir, const char *fname, size_t l)
{
const char *fmt = "%s/%s";
- if (!*fname || (*dir && dir[strlen (dir) - 1] == '/'))
+ if (!*fname || (*dir && dir[str_len (dir) - 1] == '/'))
fmt = "%s%s";
snprintf (d, l, fmt, dir, fname);
else
return f;
}
+
+const char *
+mutt_strsysexit(int e)
+{
+ int i;
+
+ for(i = 0; sysexits_h[i].str; i++)
+ {
+ if(e == sysexits_h[i].v)
+ break;
+ }
+
+ return sysexits_h[i].str;
+}