summaryrefslogtreecommitdiff
path: root/usr.sbin
diff options
context:
space:
mode:
authorGilles Chehade <gilles@cvs.openbsd.org>2010-10-09 22:07:57 +0000
committerGilles Chehade <gilles@cvs.openbsd.org>2010-10-09 22:07:57 +0000
commit671895b51c4baf8d841ad081a776d226e6fb6027 (patch)
treea5c3ecf328baa5fd47b505a5971b25735cbd6fe4 /usr.sbin
parentd03e820a64c086ef91e09c750ee5f63d0f92bd91 (diff)
no longer compiled, i will reintroduce them later, lots of stuff needs to
be done before we can write queue backends anyway ...
Diffstat (limited to 'usr.sbin')
-rw-r--r--usr.sbin/smtpd/queue_backend.c330
-rw-r--r--usr.sbin/smtpd/queue_backend.h44
2 files changed, 0 insertions, 374 deletions
diff --git a/usr.sbin/smtpd/queue_backend.c b/usr.sbin/smtpd/queue_backend.c
deleted file mode 100644
index 24ca057e283..00000000000
--- a/usr.sbin/smtpd/queue_backend.c
+++ /dev/null
@@ -1,330 +0,0 @@
-/* $OpenBSD: queue_backend.c,v 1.3 2010/06/01 23:06:23 jacekm Exp $ */
-
-/*
- * Copyright (c) 2010 Jacek Masiulaniec <jacekm@dobremiasto.net>
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include <sys/types.h>
-#include <sys/stat.h>
-
-#include <ctype.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <fts.h>
-#include <libgen.h>
-#include <limits.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "queue_backend.h"
-
-static char path[PATH_MAX];
-
-static char *idchars = "ABCDEFGHIJKLMNOPQRSTUVWYZabcdefghijklmnopqrstuvwxyz0123456789";
-
-int
-queue_be_content_create(u_int64_t *content_id)
-{
- int c, fd;
-
- c = idchars[arc4random_uniform(61)];
- snprintf(path, sizeof path, "content/%c/%cXXXXXXX", c, c);
- fd = mkstemp(path);
- if (fd < 0) {
- if (errno != ENOENT)
- return -1;
- if (mkdir(dirname(path), 0700) < 0)
- return -1;
- fd = mkstemp(path);
- if (fd < 0)
- return -1;
- }
- close(fd);
- *content_id = queue_be_encode(path + 10);
- return 0;
-}
-
-int
-queue_be_content_open(u_int64_t content_id, int wr)
-{
- char *id;
-
- id = queue_be_decode(content_id);
- snprintf(path, sizeof path, "content/%c/%s", id[0], id);
- return open(path, wr ? O_RDWR|O_APPEND|O_EXLOCK : O_RDONLY|O_SHLOCK);
-}
-
-void
-queue_be_content_delete(u_int64_t content_id)
-{
- char *id;
-
- id = queue_be_decode(content_id);
- snprintf(path, sizeof path, "content/%c/%s", id[0], id);
- unlink(path);
-}
-
-int
-queue_be_action_new(u_int64_t content_id, u_int64_t *action_id, char *aux)
-{
- FILE *fp;
- char *id;
- int fd;
-
- id = queue_be_decode(content_id);
- snprintf(path, sizeof path, "action/%c/%s,XXXXXXXX", id[0], id);
- fd = mkstemp(path);
- if (fd < 0) {
- if (errno != ENOENT)
- return -1;
- if (mkdir(dirname(path), 0700) < 0)
- return -1;
- fd = mkstemp(path);
- if (fd < 0)
- return -1;
- }
- fp = fdopen(fd, "w+");
- if (fp == NULL) {
- unlink(path);
- return -1;
- }
- fprintf(fp, "%s\n", aux);
- if (fclose(fp) == EOF) {
- unlink(path);
- return -1;
- }
- *action_id = queue_be_encode(path + 18);
- return 0;
-}
-
-int
-queue_be_action_read(struct action_be *a, u_int64_t content_id, u_int64_t action_id)
-{
- static char status[2048];
- static char aux[2048];
- struct stat sb_status, sb_content;
- char *id;
- FILE *fp;
-
- bzero(a, sizeof *a);
- a->content_id = content_id;
- a->action_id = action_id;
-
- /*
- * Auxillary params for mta and mda.
- */
- id = queue_be_decode(content_id);
- snprintf(path, sizeof path, "action/%c/%s,", id[0], id);
- strlcat(path, queue_be_decode(action_id), sizeof path);
- fp = fopen(path, "r");
- if (fp == NULL)
- return -1;
- if (fgets(aux, sizeof aux, fp) == NULL) {
- fclose(fp);
- return -1;
- }
- fclose(fp);
- aux[strcspn(aux, "\n")] = '\0';
- a->aux = aux;
-
- /*
- * Error status message.
- */
- id = queue_be_decode(content_id);
- snprintf(path, sizeof path, "status/%c/%s,", id[0], id);
- strlcat(path, queue_be_decode(action_id), sizeof path);
- fp = fopen(path, "r");
- if (fp) {
- if (fgets(status, sizeof status, fp) != NULL)
- status[strcspn(status, "\n")] = '\0';
- else
- status[0] = '\0';
- if (fstat(fileno(fp), &sb_status) < 0) {
- fclose(fp);
- return -1;
- }
- fclose(fp);
- } else
- status[0] = '\0';
- a->status = status;
-
- /*
- * Message birth time.
- *
- * For bounces, use mtime of the status file.
- * For non-bounces, use mtime of the content file.
- */
- id = queue_be_decode(content_id);
- snprintf(path, sizeof path, "content/%c/%s", id[0], id);
- if (stat(path, &sb_content) < 0)
- return -1;
- if (sb_content.st_mode & S_IWUSR)
- a->birth = 0;
- else if (status[0] == '5' || status[0] == '6')
- a->birth = sb_status.st_mtime;
- else
- a->birth = sb_content.st_mtime;
-
- return 0;
-}
-
-int
-queue_be_action_status(u_int64_t content_id, u_int64_t action_id, char *status)
-{
- FILE *fp;
- char *id;
-
- id = queue_be_decode(content_id);
- snprintf(path, sizeof path, "status/%c/%s,", id[0], id);
- strlcat(path, queue_be_decode(action_id), sizeof path);
- fp = fopen(path, "w+");
- if (fp == NULL) {
- if (errno != ENOENT)
- return -1;
- mkdir(dirname(path), 0700);
- fp = fopen(path, "w+");
- if (fp == NULL)
- return -1;
- }
- if (fprintf(fp, "%s\n", status) == -1) {
- fclose(fp);
- return -1;
- }
- if (fclose(fp) == EOF)
- return -1;
- return 0;
-}
-
-void
-queue_be_action_delete(u_int64_t content_id, u_int64_t action_id)
-{
- char *id, *dir[] = { "action", "status" };
- u_int i;
-
- for (i = 0; i < 2; i++) {
- id = queue_be_decode(content_id);
- snprintf(path, sizeof path, "%s/%c/%s,", dir[i], id[0], id);
- id = queue_be_decode(action_id);
- strlcat(path, id, sizeof path);
- unlink(path);
- }
-}
-
-int
-queue_be_commit(u_int64_t content_id)
-{
- char *id;
-
- id = queue_be_decode(content_id);
- snprintf(path, sizeof path, "content/%c/%s", id[0], id);
- if (utimes(path, NULL) < 0 || chmod(path, 0400) < 0)
- return -1;
- return 0;
-}
-
-int
-queue_be_getnext(struct action_be *a)
-{
- static FTS *fts;
- static FTSENT *fe;
- char *dir[] = { "action", NULL };
-
- if (fts == NULL) {
- fts = fts_open(dir, FTS_PHYSICAL|FTS_NOCHDIR, NULL);
- if (fts == NULL)
- return -1;
- }
-
- for (;;) {
- fe = fts_read(fts);
- if (fe == NULL) {
- if (errno) {
- fts_close(fts);
- return -1;
- } else {
- if (fts_close(fts) < 0)
- return -1;
- a->content_id = 0;
- a->action_id = 0;
- return 0;
- }
- }
- switch (fe->fts_info) {
- case FTS_F:
- break;
- case FTS_D:
- case FTS_DP:
- continue;
- default:
- fts_close(fts);
- return -1;
- }
- break;
- }
-
- if (fe->fts_namelen != 17 || fe->fts_name[8] != ',') {
- fts_close(fts);
- return -1;
- }
- a->content_id = queue_be_encode(fe->fts_name);
- a->action_id = queue_be_encode(fe->fts_name + 9);
- if (queue_be_action_read(a, a->content_id, a->action_id) < 0)
- return -2;
-
- return 0;
-}
-
-char *
-queue_be_decode(u_int64_t id)
-{
- static char txt[9];
-
- memcpy(txt, &id, sizeof id);
- txt[8] = '\0';
- return txt;
-}
-
-u_int64_t
-queue_be_encode(const char *txt)
-{
- u_int64_t id;
-
- if (strlen(txt) < sizeof id)
- id = INVALID_ID;
- else
- memcpy(&id, txt, sizeof id);
-
- return id;
-}
-
-int
-queue_be_init(char *prefix, uid_t uid, gid_t gid)
-{
- char *dir[] = { "action", "content", "status" };
- int i;
-
- for (i = 0; i < 3; i++) {
- snprintf(path, sizeof path, "%s/%s", prefix, dir[i]);
- if (mkdir(path, 0700) < 0 && errno != EEXIST)
- return -1;
- if (chmod(path, 0700) < 0)
- return -1;
- if (chown(path, uid, gid) < 0)
- return -1;
- }
- return 0;
-}
diff --git a/usr.sbin/smtpd/queue_backend.h b/usr.sbin/smtpd/queue_backend.h
deleted file mode 100644
index c0c7fdd092c..00000000000
--- a/usr.sbin/smtpd/queue_backend.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/* $OpenBSD: queue_backend.h,v 1.3 2010/06/01 23:06:23 jacekm Exp $ */
-
-/*
- * Copyright (c) 2010 Jacek Masiulaniec <jacekm@dobremiasto.net>
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#define INVALID_ID 1
-
-struct action_be {
- u_int64_t content_id;
- u_int64_t action_id;
- time_t birth;
- char *aux;
- char *status;
-};
-
-int queue_be_content_create(u_int64_t *);
-int queue_be_content_open(u_int64_t, int);
-void queue_be_content_delete(u_int64_t);
-
-int queue_be_action_new(u_int64_t, u_int64_t *, char *);
-int queue_be_action_read(struct action_be *, u_int64_t, u_int64_t);
-int queue_be_action_status(u_int64_t, u_int64_t, char *);
-void queue_be_action_delete(u_int64_t, u_int64_t);
-
-int queue_be_commit(u_int64_t);
-
-u_int64_t queue_be_encode(const char *);
-char *queue_be_decode(u_int64_t);
-
-int queue_be_init(char *, uid_t, gid_t);
-int queue_be_getnext(struct action_be *);