NeoMutt  2024-04-25-76-g20fe7b
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 new_umask = mh_umask(m);
79 mode_t old_umask = umask(new_umask);
80 mutt_debug(LL_DEBUG3, "umask set to %03o\n", new_umask);
81
82 while (true)
83 {
84 snprintf(path, sizeof(path), "%s/.neomutt-%s-%d-%" PRIu64, mailbox_path(m),
85 NONULL(ShortHostname), (int) getpid(), mutt_rand64());
86 fd = open(path, O_WRONLY | O_EXCL | O_CREAT, 0666);
87 if (fd == -1)
88 {
89 if (errno != EEXIST)
90 {
91 mutt_perror("%s", path);
92 umask(old_umask);
93 mutt_debug(LL_DEBUG3, "umask set to %03o\n", old_umask);
94 return false;
95 }
96 }
97 else
98 {
99 *tgt = mutt_str_dup(path);
100 break;
101 }
102 }
103 umask(old_umask);
104 mutt_debug(LL_DEBUG3, "umask set to %03o\n", old_umask);
105
106 *fp = fdopen(fd, "w");
107 if (!*fp)
108 {
109 FREE(tgt);
110 close(fd);
111 unlink(path);
112 return false;
113 }
114
115 return true;
116}
char * ShortHostname
Short version of the hostname.
Definition: globals.c:39
#define mutt_perror(...)
Definition: logging2.h:93
@ LL_DEBUG3
Log at debug level 3.
Definition: logging2.h:45
#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:123
#define NONULL(x)
Definition: string2.h:37
+ Here is the call graph for this function:
+ Here is the caller graph for this function: