init.c could really use some refactoring.
static FILE *
mutt_save_attachment_open (char *path, int flags)
{
+ mode_t omask;
+ FILE *fp = NULL;
+
+ omask = umask(Umask);
+
if (flags == M_SAVE_APPEND)
- return fopen (path, "a");
- if (flags == M_SAVE_OVERWRITE)
- return fopen (path, "w"); /* __FOPEN_CHECKED__ */
-
- return safe_fopen (path, "w");
+ fp = fopen (path, "a");
+ else if (flags == M_SAVE_OVERWRITE)
+ fp = fopen (path, "w"); /* __FOPEN_CHECKED__ */
+ else
+ fp = safe_fopen (path, "w");
+
+ umask(omask);
+
+ return fp;
}
/* returns 0 on success, -1 on error */
WHERE short SendmailWait;
WHERE short SleepTime INITVAL (1);
WHERE short Timeout;
+WHERE short Umask;
WHERE short Wrap;
WHERE short WriteInc;
val = *ptr < 0 ? -*ptr : 0;
/* user requested the value of this variable */
- snprintf (err->data, err->dsize, "%s=%d", MuttVars[idx].option, val);
+ if (mutt_strcmp (MuttVars[idx].option, "umask") == 0)
+ snprintf (err->data, err->dsize, "%s=0%o", MuttVars[idx].option, val);
+ else
+ snprintf (err->data, err->dsize, "%s=%d", MuttVars[idx].option, val);
break;
}
if (mutt_strcmp (MuttVars[idx].option, "wrapmargin") == 0)
sval = sval > 0 ? 0 : -sval;
- snprintf (tmp, sizeof (tmp), "%d", sval);
+ if (mutt_strcmp (MuttVars[idx].option, "umask") == 0)
+ snprintf (tmp, sizeof (tmp), "0%o", sval);
+ else
+ snprintf (tmp, sizeof (tmp), "%d", sval);
}
else if (DTYPE (MuttVars[idx].type) == DT_SORT)
{
** machine without having to enter a password.
*/
#endif
+ { "umask", DT_NUM, R_NONE, &Umask, 0077 },
+ /*
+ ** .pp
+ ** Sets the umask to use when creating mailboxes or saving attachments.
+ */
+
{ "use_8bitmime", DT_BOOL, R_NONE, OPTUSE8BITMIME, 0 },
/*
** .pp
safe_dir, sizeof (safe_dir)) == -1)
return -1;
- if ((fd = open (safe_file, flags, 0600)) < 0)
+ if ((fd = open (safe_file, flags, 0666)) < 0)
{
rmdir (safe_dir);
return fd;
}
else
{
- if ((fd = open (path, flags, 0600)) < 0)
+ if ((fd = open (path, flags, 0666)) < 0)
return fd;
}
{
snprintf (path, _POSIX_PATH_MAX, "%s/.mutt-%s-%d-%d",
dest->path, NONULL (Hostname), (int) getpid (), Counter++);
- if ((fd = open (path, O_WRONLY | O_EXCL | O_CREAT, 0600)) == -1)
+ if ((fd = open (path, O_WRONLY | O_EXCL | O_CREAT, 0666)) == -1)
{
if (errno != EEXIST)
{
dprint (2, (debugfile, "maildir_open_new_message (): Trying %s.\n",
path));
- if ((fd = open (path, O_WRONLY | O_EXCL | O_CREAT, 0600)) == -1)
+ if ((fd = open (path, O_WRONLY | O_EXCL | O_CREAT, 0666)) == -1)
{
if (errno != EEXIST)
{
static int mx_open_mailbox_append (CONTEXT *ctx, int flags)
{
struct stat sb;
+ mode_t omask;
ctx->append = 1;
#endif
+ omask = umask(Umask);
+
if(stat(ctx->path, &sb) == 0)
{
ctx->magic = mx_get_magic (ctx->path);
{
char tmp[_POSIX_PATH_MAX];
- if (mkdir (ctx->path, S_IRWXU))
+ if (mkdir (ctx->path, S_IRWXU|S_IRWXG|S_IRWXO))
{
mutt_perror (ctx->path);
- return (-1);
+ goto err_umask;
}
if (ctx->magic == M_MAILDIR)
{
snprintf (tmp, sizeof (tmp), "%s/cur", ctx->path);
- if (mkdir (tmp, S_IRWXU))
+ if (mkdir (tmp, S_IRWXU|S_IRWXG|S_IRWXO))
{
mutt_perror (tmp);
rmdir (ctx->path);
- return (-1);
+ goto err_umask;
}
snprintf (tmp, sizeof (tmp), "%s/new", ctx->path);
- if (mkdir (tmp, S_IRWXU))
+ if (mkdir (tmp, S_IRWXU|S_IRWXG|S_IRWXO))
{
mutt_perror (tmp);
snprintf (tmp, sizeof (tmp), "%s/cur", ctx->path);
rmdir (tmp);
rmdir (ctx->path);
- return (-1);
+ goto err_umask;
}
snprintf (tmp, sizeof (tmp), "%s/tmp", ctx->path);
- if (mkdir (tmp, S_IRWXU))
+ if (mkdir (tmp, S_IRWXU|S_IRWXG|S_IRWXO))
{
mutt_perror (tmp);
snprintf (tmp, sizeof (tmp), "%s/cur", ctx->path);
snprintf (tmp, sizeof (tmp), "%s/new", ctx->path);
rmdir (tmp);
rmdir (ctx->path);
- return (-1);
+ goto err_umask;
}
}
else
int i;
snprintf (tmp, sizeof (tmp), "%s/.mh_sequences", ctx->path);
- if ((i = creat (tmp, S_IRWXU)) == -1)
+ if ((i = creat (tmp, S_IRWXU|S_IRWXG|S_IRWXO)) == -1)
{
mutt_perror (tmp);
rmdir (ctx->path);
- return (-1);
+ goto err_umask;
}
close (i);
}
else
{
mutt_perror (ctx->path);
- return (-1);
+ goto err_umask;
}
switch (ctx->magic)
mutt_error (_("Couldn't lock %s\n"), ctx->path);
safe_fclose (&ctx->fp);
}
- return (-1);
+ goto err_umask;
}
fseek (ctx->fp, 0, 2);
break;
break;
default:
- return (-1);
+ goto err_umask;
}
+ umask(omask);
return 0;
+
+ err_umask:
+ umask(omask);
+ return -1;
}
/*
MESSAGE *msg;
int (*func) (MESSAGE *, CONTEXT *, HEADER *);
ADDRESS *p = NULL;
+ mode_t omask;
switch (dest->magic)
{
if(msg->received == 0)
time(&msg->received);
+
+ omask = umask(Umask);
if (func (msg, dest, hdr) == 0)
{
else
FREE (&msg);
+ umask(omask);
+
return msg;
}