+
+FILE *create_digest_file(struct ctdlroom *room, int forceCreate) {
+ struct stat stbuf;
+ char fn[PATH_MAX];
+ int exists;
+ FILE *fp;
+
+ snprintf(fn, PATH_MAX, "%s/%ld.eml", ctdl_netdigest_dir, room->QRnumber);
+ StripSlashes(fn, 0);
+
+ exists = stat(fn, &stbuf);
+ if (!forceCreate && (exists == -1))
+ return NULL;
+
+ fp = fopen(fn, "w+");
+ if (fp == NULL) {
+ syslog(LOG_ERR, "failed to create digest file %s: %s", fn, strerror(errno));
+ }
+ return fp;
+}
+
+
+int create_dir(char *which, long ACCESS, long UID, long GID) {
+ int rv;
+ rv = mkdir(which, ACCESS);
+ if ((rv == -1) && (errno != EEXIST)) {
+ syslog(LOG_ERR,
+ "failed to create directory %s: %s",
+ which,
+ strerror(errno));
+ return rv;
+ }
+ rv = chmod(which, ACCESS);
+ if (rv == -1) {
+ syslog(LOG_ERR,
+ "failed to set permissions for directory %s: %s",
+ which,
+ strerror(errno));
+ return rv;
+ }
+ rv = chown(which, UID, GID);
+ if (rv == -1) {
+ syslog(LOG_ERR,
+ "failed to set owner for directory %s: %s",
+ which,
+ strerror(errno));
+ return rv;
+ }
+ return rv;
+}
+
+
+int create_run_directories(long UID, long GID) {
+ int rv = 0;
+ rv += create_dir(ctdl_message_dir , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
+ rv += create_dir(ctdl_file_dir , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
+ rv += create_dir(ctdl_spool_dir , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
+ rv += create_dir(ctdl_netdigest_dir , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
+ rv += create_dir(ctdl_nettmp_dir , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
+ rv += create_dir(ctdl_key_dir , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
+ rv += create_dir(ctdl_run_dir , S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH, UID, GID);
+ return rv;
+}