NeoMutt  2024-04-16-36-g75b6fb
Teaching an old dog new tricks
DOXYGEN
Loading...
Searching...
No Matches
shared.c File Reference

MH shared functions. More...

#include "config.h"
#include <errno.h>
#include <fcntl.h>
#include <inttypes.h>
#include <limits.h>
#include <stdbool.h>
#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>
#include "mutt/lib.h"
#include "core/lib.h"
#include "shared.h"
#include "globals.h"
#include "mdata.h"
+ Include dependency graph for shared.c:

Go to the source code of this file.

Functions

mode_t mh_umask (struct Mailbox *m)
 Create a umask from the mailbox directory.
 
bool mh_mkstemp (struct Mailbox *m, FILE **fp, char **tgt)
 Create a temporary file.
 

Detailed Description

MH shared functions.

Authors
  • Richard Russon

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, see http://www.gnu.org/licenses/.

Definition in file shared.c.

Function Documentation

◆ mh_umask()

mode_t mh_umask ( struct Mailbox m)

Create a umask from the mailbox directory.

Parameters
mMailbox
Return values
numUmask

Definition at line 49 of file shared.c.

50{
51 struct MhMboxData *mhata = mh_mdata_get(m);
52 if (mhata && mhata->umask)
53 return mhata->umask;
54
55 struct stat st = { 0 };
56 if (stat(mailbox_path(m), &st) != 0)
57 {
58 mutt_debug(LL_DEBUG1, "stat failed on %s\n", mailbox_path(m));
59 return 077;
60 }
61
62 return 0777 & ~st.st_mode;
63}
static const char * mailbox_path(const struct Mailbox *m)
Get the Mailbox's path string.
Definition: mailbox.h:223
#define mutt_debug(LEVEL,...)
Definition: logging2.h:89
@ LL_DEBUG1
Log at debug level 1.
Definition: logging2.h:43
struct MhMboxData * mh_mdata_get(struct Mailbox *m)
Get the private data for this Mailbox.
Definition: mdata.c:60
Mh-specific Mailbox data -.
Definition: mdata.h:35
mode_t umask
umask to use when creating files
Definition: mdata.h:38
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mh_mkstemp()

bool mh_mkstemp ( struct Mailbox m,
FILE **  fp,
char **  tgt 
)

Create a temporary file.

Parameters
[in]mMailbox to create the file in
[out]fpFile handle
[out]tgtFile name
Return values
trueSuccess
falseFailure

Definition at line 73 of file shared.c.

74{
75 int fd;
76 char path[PATH_MAX] = { 0 };
77
78 mode_t omask = umask(mh_umask(m));
79 while (true)
80 {
81 snprintf(path, sizeof(path), "%s/.neomutt-%s-%d-%" PRIu64, mailbox_path(m),
82 NONULL(ShortHostname), (int) getpid(), mutt_rand64());
83 fd = open(path, O_WRONLY | O_EXCL | O_CREAT, 0666);
84 if (fd == -1)
85 {
86 if (errno != EEXIST)
87 {
88 mutt_perror("%s", path);
89 umask(omask);
90 return false;
91 }
92 }
93 else
94 {
95 *tgt = mutt_str_dup(path);
96 break;
97 }
98 }
99 umask(omask);
100
101 *fp = fdopen(fd, "w");
102 if (!*fp)
103 {
104 FREE(tgt);
105 close(fd);
106 unlink(path);
107 return false;
108 }
109
110 return true;
111}
char * ShortHostname
Short version of the hostname.
Definition: globals.c:39
#define mutt_perror(...)
Definition: logging2.h:93
#define FREE(x)
Definition: memory.h:45
mode_t mh_umask(struct Mailbox *m)
Create a umask from the mailbox directory.
Definition: shared.c:49
char * mutt_str_dup(const char *str)
Copy a string, safely.
Definition: string.c:253
#define PATH_MAX
Definition: mutt.h:42
uint64_t mutt_rand64(void)
Create a 64-bit random number.
Definition: random.c:122
#define NONULL(x)
Definition: string2.h:37
+ Here is the call graph for this function:
+ Here is the caller graph for this function: