summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNatanael Copa <ncopa@alpinelinux.org>2013-07-12 07:08:22 +0000
committerNatanael Copa <ncopa@alpinelinux.org>2013-07-12 07:08:22 +0000
commit05a4d193a7b91f0fa25607ba9cfce38db244304d (patch)
tree8885de049e1aa80e17ddd1a5f87287b130340d08
parentbd83f5998c32c978e3840633eac86a638bb4087f (diff)
downloadalpine-baselayout-05a4d193a7b91f0fa25607ba9cfce38db244304d.tar.bz2
alpine-baselayout-05a4d193a7b91f0fa25607ba9cfce38db244304d.tar.xz
src: remove unused sendbug files
-rw-r--r--src/atomicio.c62
-rw-r--r--src/atomicio.h39
-rw-r--r--src/headers.h26
-rw-r--r--src/lib.c183
-rw-r--r--src/lib.h26
-rw-r--r--src/sendbug.c648
6 files changed, 0 insertions, 984 deletions
diff --git a/src/atomicio.c b/src/atomicio.c
deleted file mode 100644
index d580010..0000000
--- a/src/atomicio.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/* $OpenBSD: atomicio.c,v 1.1.1.1 2007/03/23 01:47:11 ray Exp $ */
-/*
- * Copyright (c) 2006 Damien Miller. All rights reserved.
- * Copyright (c) 2005 Anil Madhavapeddy. All rights reserved.
- * Copyright (c) 1995,1999 Theo de Raadt. All rights reserved.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/param.h>
-#include <sys/uio.h>
-
-#include <errno.h>
-#include <string.h>
-
-#include "atomicio.h"
-
-/*
- * ensure all of data on socket comes through. f==read || f==vwrite
- */
-size_t
-atomicio(ssize_t (*f) (int, void *, size_t), int fd, void *_s, size_t n)
-{
- char *s = _s;
- size_t pos = 0;
- ssize_t res;
-
- while (n > pos) {
- res = (f) (fd, s + pos, n - pos);
- switch (res) {
- case -1:
- if (errno == EINTR || errno == EAGAIN)
- continue;
- return 0;
- case 0:
- errno = EPIPE;
- return pos;
- default:
- pos += (size_t)res;
- }
- }
- return (pos);
-}
diff --git a/src/atomicio.h b/src/atomicio.h
deleted file mode 100644
index 72595db..0000000
--- a/src/atomicio.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/* $OpenBSD: atomicio.h,v 1.1.1.1 2007/03/23 01:47:11 ray Exp $ */
-
-/*
- * Copyright (c) 2006 Damien Miller. All rights reserved.
- * Copyright (c) 1995,1999 Theo de Raadt. All rights reserved.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef _ATOMICIO_H
-#define _ATOMICIO_H
-
-/*
- * Ensure all of data on socket comes through. f==read || f==vwrite
- */
-size_t atomicio(ssize_t (*)(int, void *, size_t), int, void *, size_t);
-
-#define vwrite (ssize_t (*)(int, void *, size_t))write
-
-#endif /* _ATOMICIO_H */
diff --git a/src/headers.h b/src/headers.h
deleted file mode 100644
index 1ebf79d..0000000
--- a/src/headers.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * header.h
- * Dirty little file to include header files w/out autotools.
- *
- * Copyright 1999-2004 Gentoo Foundation
- * Distributed under the terms of the GNU General Public License v2
- * $Header$
- */
-
-/* Common includes */
-#define HAVE_TIOCNOTTY
-#define HAVE_SETSID
-
-/* OS-specific includes */
-#if defined(__linux__)
-# define HAVE_SYS_SYSMACROS_H
-# define HAVE_ERROR_H
-#endif
-
-/* Now we actually include crap ;) */
-#ifdef HAVE_ERROR_H
-# include <error.h>
-#endif
-#ifdef HAVE_SYS_SYSMACROS_H
-# include <sys/sysmacros.h>
-#endif
diff --git a/src/lib.c b/src/lib.c
deleted file mode 100644
index 03433c8..0000000
--- a/src/lib.c
+++ /dev/null
@@ -1,183 +0,0 @@
-/* $OpenBSD: strlcat.c,v 1.13 2005/08/08 08:05:37 espie Exp $ */
-
-/*
- * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
- * Copyright (c) 2004 Ted Unangst and Todd Miller
- * Copyright (c) 2007 Natanael Copa <natanael.copa@gmail.com>
- *
- * 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 <errno.h>
-#include <limits.h>
-#include <stdlib.h>
-#include <string.h>
-
-
-# define LLONG_MAX 9223372036854775807LL
-# define LLONG_MIN (-LLONG_MAX - 1LL)
-
-
-#define INVALID 1
-#define TOOSMALL 2
-#define TOOLARGE 3
-
-#include <sysexits.h>
-#include "lib.h"
-
-#ifndef HAVE_XREALLOC
-void *
-xrealloc(void *ptr, size_t size)
-{
- ptr = realloc(ptr, size);
- if (ptr == NULL)
- err(EX_OSERR, "realloc");
- return ptr;
-}
-#endif
-
-
-#ifndef HAVE_STRLCAT
-/*
- * Appends src to string dst of size siz (unlike strncat, siz is the
- * full size of dst, not space left). At most siz-1 characters
- * will be copied. Always NUL terminates (unless siz <= strlen(dst)).
- * Returns strlen(src) + MIN(siz, strlen(initial dst)).
- * If retval >= siz, truncation occurred.
- */
-size_t
-strlcat(char *dst, const char *src, size_t siz)
-{
- char *d = dst;
- const char *s = src;
- size_t n = siz;
- size_t dlen;
-
- /* Find the end of dst and adjust bytes left but don't go past end */
- while (n-- != 0 && *d != '\0')
- d++;
- dlen = d - dst;
- n = siz - dlen;
-
- if (n == 0)
- return(dlen + strlen(s));
- while (*s != '\0') {
- if (n != 1) {
- *d++ = *s;
- n--;
- }
- s++;
- }
- *d = '\0';
-
- return(dlen + (s - src)); /* count does not include NUL */
-}
-#endif /* HAVE_STRLCAT */
-
-#ifdef HAVE_STRLCPY
-/*
- * Copy src to string dst of size siz. At most siz-1 characters
- * will be copied. Always NUL terminates (unless siz == 0).
- * Returns strlen(src); if retval >= siz, truncation occurred.
- */
-size_t
-strlcpy(char *dst, const char *src, size_t siz)
-{
- char *d = dst;
- const char *s = src;
- size_t n = siz;
-
- /* Copy as many bytes as will fit */
- if (n != 0) {
- while (--n != 0) {
- if ((*d++ = *s++) == '\0')
- break;
- }
- }
-
- /* Not enough room in dst, add NUL and traverse rest of src */
- if (n == 0) {
- if (siz != 0)
- *d = '\0'; /* NUL-terminate dst */
- while (*s++)
- ;
- }
-
- return(s - src - 1); /* count does not include NUL */
-}
-#endif /* HAVE_STRLCPY */
-
-#ifdef HAVE_STRTONUM
-long long
-strtonum(const char *numstr, long long minval, long long maxval,
- const char **errstrp)
-{
- long long ll = 0;
- char *ep;
- int error = 0;
- struct errval {
- const char *errstr;
- int err;
- } ev[4] = {
- { NULL, 0 },
- { "invalid", EINVAL },
- { "too small", ERANGE },
- { "too large", ERANGE },
- };
-
- ev[0].err = errno;
- errno = 0;
- if (minval > maxval)
- error = INVALID;
- else {
- ll = strtoll(numstr, &ep, 10);
- if (numstr == ep || *ep != '\0')
- error = INVALID;
- else if ((ll == LLONG_MIN && errno == ERANGE) || ll < minval)
- error = TOOSMALL;
- else if ((ll == LLONG_MAX && errno == ERANGE) || ll > maxval)
- error = TOOLARGE;
- }
- if (errstrp != NULL)
- *errstrp = ev[error].errstr;
- errno = ev[error].err;
- if (error)
- ll = 0;
-
- return (ll);
-}
-#endif /* HAVE_STRTONUM */
-
-#ifndef HAVE_FGETLN
-char *fgetln(FILE *fh, size_t *len) {
- int c, size = 0;
- char *buf = NULL;
- int i = 0;
-
- while ((c = getc(fh)) != EOF) {
- if (i >= size)
- buf = xrealloc(buf, size += 128);
- buf[i++] = (char) c;
- if (c == '\n')
- break;
- }
- if (buf) {
- buf = xrealloc(buf, i + 1);
- buf[i] = '\0';
- }
- if (len)
- *len = i;
- return buf;
-}
-#endif /* HAVE_FGETLN */
diff --git a/src/lib.h b/src/lib.h
deleted file mode 100644
index fbf8f2b..0000000
--- a/src/lib.h
+++ /dev/null
@@ -1,26 +0,0 @@
-#ifndef RCS_LIB_H
-#define RCS_LIB_H
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#include <stdio.h>
-
-/* strlcpy and strlcat */
-#ifndef HAVE_STRLCPY
-size_t strlcpy(char *, const char *, size_t);
-#endif
-
-#ifndef HAVE_STRLCPY
-size_t strlcat(char *, const char *, size_t);
-#endif
-
-#ifndef HAVE_STRTONUM
-long long strtonum(const char *, long long, long long, const char **);
-#endif
-
-#ifndef HAVE_FGETLN
-char *fgetln(FILE *, size_t *);
-#endif
-
-#endif /* RCS_LIB_H */
diff --git a/src/sendbug.c b/src/sendbug.c
deleted file mode 100644
index f9fe290..0000000
--- a/src/sendbug.c
+++ /dev/null
@@ -1,648 +0,0 @@
-/* $OpenBSD: sendbug.c,v 1.49 2007/05/11 02:07:47 ray Exp $ */
-
-/*
- * Written by Ray Lai <ray@cyth.net>.
- * Public domain.
- */
-#include <sys/types.h>
-#include <sys/mman.h>
-#include <sys/param.h>
-#include <sys/stat.h>
-#include <sys/sysctl.h>
-#include <sys/utsname.h>
-#include <sys/wait.h>
-
-#include <ctype.h>
-#include <err.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <limits.h>
-#include <paths.h>
-#include <pwd.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "atomicio.h"
-#include "lib.h"
-
-#ifndef _PATH_DMESG
-#define _PATH_DMESG "/var/log/dmesg"
-#endif
-#ifndef _PATH_SENDMAIL
-#define _PATH_SENDMAIL "/usr/sbin/sendmail"
-#endif
-#define _DEFAULT_CONFIG "/etc/sendbug/sendbug.conf"
-
-int checkfile(const char *);
-void attatch(FILE *);
-int editit(const char *);
-void init(void);
-static void read_config(const char *);
-int matchline(const char *, const char *, size_t);
-int prompt(void);
-int send_file(const char *, int);
-int sendmail(const char *);
-void template(FILE *);
-
-const char *categories = "acf aports base doc misc hosting";
-char *version = "4.2";
-const char *config_file;
-
-struct passwd *pw;
-//char os[BUFSIZ], rel[BUFSIZ],
-char release[BUFSIZ];
-//char details[BUFSIZ];
-struct utsname uts;
-char *fullname, *tmppath, *pr_form, *mailfrom, *mailto;
-const char *attatchment = NULL;
-int wantcleanup;
-
-static void
-usage(void)
-{
- extern char *__progname;
-
- fprintf(stderr, "usage: %s [-d | -a file] [-LPV] [-c config]\n", __progname);
- exit(1);
-}
-
-void
-cleanup()
-{
- if (wantcleanup && tmppath && unlink(tmppath) == -1)
- warn("unlink");
-}
-
-static void
-fcopy(FILE *srcfp, FILE *dstfp)
-{
- char buf[BUFSIZ];
- size_t len;
- while (!feof(srcfp)) {
- len = fread(buf, 1, sizeof buf, srcfp);
- if (len == 0)
- break;
- if (fwrite(buf, 1, len, dstfp) != len)
- break;
- }
-}
-
-int
-main(int argc, char *argv[])
-{
- int ch, c, fd, ret = 1;
- const char *tmpdir;
- struct stat sb;
- time_t mtime;
- FILE *fp;
-
- if (access(_PATH_SENDMAIL, R_OK | X_OK) == -1) {
- warn("sendmail");
- fprintf(stderr, "Please run 'setup-sendbug' to configure sendbug\n");
- return ret;
- }
-
- config_file = NULL;
- while ((ch = getopt(argc, argv, "a:c:dLPV")) != -1)
- switch (ch) {
- case 'a':
- attatchment = optarg;
- break;
- case 'c':
- config_file = optarg;
- break;
- case 'd':
- attatchment = _PATH_DMESG;
- break;
- case 'L':
- printf("Known categories:\n");
- printf("%s\n\n", categories);
- exit(0);
- case 'P':
- init();
- template(stdout);
- exit(0);
- case 'V':
- printf("%s\n", version);
- exit(0);
- default:
- usage();
- }
- argc -= optind;
- argv += optind;
-
- if (argc > 0)
- usage();
-
- if ((tmpdir = getenv("TMPDIR")) == NULL || tmpdir[0] == '\0')
- tmpdir = _PATH_TMP;
- if (asprintf(&tmppath, "%s%sp.XXXXXXXXXX", tmpdir,
- tmpdir[strlen(tmpdir) - 1] == '/' ? "" : "/") == -1)
- err(1, "asprintf");
- if ((fd = mkstemp(tmppath)) == -1)
- err(1, "mkstemp");
- wantcleanup = 1;
- atexit(cleanup);
- if ((fp = fdopen(fd, "w+")) == NULL)
- err(1, "fdopen");
-
- init();
-
- if (pr_form == NULL)
- pr_form = getenv("PR_FORM");
- if (pr_form) {
- char buf[BUFSIZ];
- size_t len;
- FILE *frfp;
-
- frfp = fopen(pr_form, "r");
- if (frfp == NULL) {
- warn("can't seem to read your template file "
- "(`%s'), ignoring PR_FORM", pr_form);
- template(fp);
- } else {
- fcopy(frfp, fp);
- fclose(frfp);
- }
- } else
- template(fp);
-
- if (!isatty(0)) {
- fcopy(stdin, fp);
- if (freopen(_PATH_TTY, "r", stdin) == NULL)
- err(1, _PATH_TTY);
- }
-
- if (fflush(fp) == EOF || fstat(fd, &sb) == -1 || fclose(fp) == EOF)
- err(1, "error creating template");
- mtime = sb.st_mtime;
-
- edit:
- if (editit(tmppath) == -1)
- err(1, "error running editor");
-
- if (stat(tmppath, &sb) == -1)
- err(1, "stat");
- if (mtime == sb.st_mtime)
- errx(1, "report unchanged, nothing sent");
-
- prompt:
- if (!checkfile(tmppath))
- fprintf(stderr, "fields are blank, must be filled in\n");
- c = prompt();
- switch (c) {
- case 'a':
- case EOF:
- wantcleanup = 0;
- errx(1, "unsent report in %s", tmppath);
- case 'e':
- goto edit;
- case 's':
- if (sendmail(tmppath) == -1)
- goto quit;
- break;
- default:
- goto prompt;
- }
-
- ret = 0;
-quit:
- return (ret);
-}
-
-void
-attatch(FILE *fp)
-{
- char buf[BUFSIZ];
- FILE *dfp;
- off_t offset = -1;
- size_t len;
-
- dfp = fopen(attatchment, "r");
- if (dfp == NULL) {
- warn("can't read %s", attatchment);
- return;
- }
-
- fprintf(fp, "\n"
- "<%s is attached.>\n", attatchment);
-
- fcopy(dfp, fp);
- fclose(dfp);
-}
-
-/*
- * Execute an editor on the specified pathname, which is interpreted
- * from the shell. This means flags may be included.
- *
- * Returns -1 on error, or the exit value on success.
- */
-int
-editit(const char *pathname)
-{
- char *argp[] = {"sh", "-c", NULL, NULL}, *ed, *p;
- sig_t sighup, sigint, sigquit;
- pid_t pid;
- int saved_errno, st;
-
- ed = getenv("VISUAL");
- if (ed == NULL || ed[0] == '\0')
- ed = getenv("EDITOR");
- if (ed == NULL || ed[0] == '\0')
- ed = _PATH_VI;
- if (asprintf(&p, "%s %s", ed, pathname) == -1)
- return (-1);
- argp[2] = p;
-
- sighup = signal(SIGHUP, SIG_IGN);
- sigint = signal(SIGINT, SIG_IGN);
- sigquit = signal(SIGQUIT, SIG_IGN);
- if ((pid = fork()) == -1)
- goto fail;
- if (pid == 0) {
- execv(_PATH_BSHELL, argp);
- _exit(127);
- }
- while (waitpid(pid, &st, 0) == -1)
- if (errno != EINTR)
- goto fail;
- free(p);
- (void)signal(SIGHUP, sighup);
- (void)signal(SIGINT, sigint);
- (void)signal(SIGQUIT, sigquit);
- if (!WIFEXITED(st)) {
- errno = EINTR;
- return (-1);
- }
- return (WEXITSTATUS(st));
-
- fail:
- saved_errno = errno;
- (void)signal(SIGHUP, sighup);
- (void)signal(SIGINT, sigint);
- (void)signal(SIGQUIT, sigquit);
- free(p);
- errno = saved_errno;
- return (-1);
-}
-
-int
-prompt(void)
-{
- int ret, c;
-
- __fpurge(stdin);
- fprintf(stderr, "a)bort, e)dit, or s)end: ");
- fflush(stderr);
- ret = getchar();
- if (ret == EOF || ret == '\n')
- return (ret);
- do {
- c = getchar();
- } while (c != EOF && c != '\n');
-
- return (ret);
-}
-
-int
-sendmail(const char *pathname)
-{
- int filedes[2];
-
- if (pipe(filedes) == -1) {
- warn("pipe: unsent report in %s", pathname);
- return (-1);
- }
- switch (fork()) {
- case -1:
- warn("fork error: unsent report in %s",
- pathname);
- return (-1);
- case 0:
- close(filedes[1]);
- if (dup2(filedes[0], STDIN_FILENO) == -1) {
- warn("dup2 error: unsent report in %s",
- pathname);
- return (-1);
- }
- close(filedes[0]);
- execl("/usr/sbin/sendmail", "sendmail",
- "-oi", "-t", (void *)NULL);
- warn("sendmail error: unsent report in %s",
- pathname);
- return (-1);
- default:
- close(filedes[0]);
- /* Pipe into sendmail. */
- if (send_file(pathname, filedes[1]) == -1) {
- warn("send_file error: unsent report in %s",
- pathname);
- return (-1);
- }
- close(filedes[1]);
- wait(NULL);
- break;
- }
- return (0);
-}
-
-static void readfile(const char *filename, char *buf, size_t size)
-{
- int count;
- int fd = open(filename, O_RDONLY);
- buf[0] = '\0';
- if (fd < 0)
- return;
- count = read(fd, buf, size-1);
- if (count < 0)
- return;
- buf[count] = '\0';
- close(fd);
- return;
-}
-
-static void *xmalloc(size_t size)
-{
- void *ptr;
- ptr = malloc(size);
- if (ptr == NULL)
- err(1, "malloc");
- return ptr;
-}
-
-static char *xstrdup(const char *str)
-{
- char *p;
- p = strdup(str);
- if (p == NULL)
- err(1, "strdup");
- return p;
-}
-
-static void read_config(const char *filename)
-{
- FILE *fh;
- char *line = xmalloc(4096);
-
- fh = fopen(filename, "r");
- if (fh == NULL)
- err(1, filename);
- while (fgets(line, 4095, fh) != NULL) {
- char *p;
- /* strip comments and newline */
- p = strpbrk(line, "#\n");
- if (p) *p = '\0';
-
- /* find keyword */
- p = strchr(line, '=');
- if (p == NULL)
- continue;
- *p++ = '\0';
-
- /* pr_form, editor, mailfrom, */
- if (strcmp(line, "form") == 0) {
- pr_form = xstrdup(p);
- } else if (strcmp(line, "mailfrom") == 0) {
- mailfrom = xstrdup(p);
- } else if (strcmp(line, "mailto") == 0) {
- mailto = xstrdup(p);
- } else
- warn("ignoring unknown keyword: %s", line);
- }
- fclose(fh);
- free(line);
-}
-
-void
-init(void)
-{
- size_t amp, len, gecoslen, namelen;
- int sysname[2];
- char ch, *cp;
-
- if (config_file == NULL)
- config_file = getenv("SENDBUG_CONF");
- if (config_file == NULL || config_file[0] == '\0')
- config_file = _DEFAULT_CONFIG;
- read_config(config_file);
-
- if ((pw = getpwuid(getuid())) == NULL)
- err(1, "getpwuid");
- if (fullname == NULL) {
- namelen = strlen(pw->pw_name);
-
- /* Count number of '&'. */
- for (amp = 0, cp = pw->pw_gecos; *cp && *cp != ','; ++cp)
- if (*cp == '&')
- ++amp;
-
- /* Truncate gecos to full name. */
- gecoslen = cp - pw->pw_gecos;
- pw->pw_gecos[gecoslen] = '\0';
-
- /* Expanded str = orig str - '&' chars + concatenated logins. */
- len = gecoslen - amp + (amp * namelen) + 1;
- fullname = xmalloc(len);
-
- /* Upper case first char of login. */
- ch = pw->pw_name[0];
- pw->pw_name[0] = toupper((unsigned char)pw->pw_name[0]);
-
- cp = pw->pw_gecos;
- fullname[0] = '\0';
- while (cp != NULL) {
- char *token;
-
- token = strsep(&cp, "&");
- if (token != pw->pw_gecos &&
- strlcat(fullname, pw->pw_name, len) >= len)
- errx(1, "truncated string");
- if (strlcat(fullname, token, len) >= len)
- errx(1, "truncated string");
- }
-
- /* Restore case of first char of login. */
- pw->pw_name[0] = ch;
- }
-
- if (mailfrom == NULL)
- mailfrom = getenv("PR_MAILFROM");
- if (mailfrom == NULL)
- mailfrom = pw->pw_name;
-
- if (mailto == NULL)
- mailto = getenv("PR_MAILTO");
- if (mailto == NULL)
- mailto = "bugs@alpinelinux.org";
-
- uname(&uts);
-
- readfile("/etc/alpine-release", release, sizeof(release)-1);
-}
-
-int
-send_file(const char *file, int dst)
-{
- int blank = 0;
- size_t len;
- char *buf;
- FILE *fp;
-
- if ((fp = fopen(file, "r")) == NULL)
- return (-1);
- while ((buf = fgetln(fp, &len))) {
- /* Skip lines starting with "SENDBUG". */
- if (len >= sizeof("SENDBUG") - 1 &&
- memcmp(buf, "SENDBUG", sizeof("SENDBUG") - 1) == 0)
- continue;
- if (len == 1 && buf[0] == '\n')
- blank = 1;
- /* Skip comments, but only if we encountered a blank line. */
- while (len) {
- char *sp = NULL, *ep = NULL;
- size_t copylen;
-
- if (blank && (sp = memchr(buf, '<', len)) != NULL)
- ep = memchr(sp, '>', len - (sp - buf + 1));
- /* Length of string before comment. */
- if (ep)
- copylen = sp - buf;
- else
- copylen = len;
- if (atomicio(vwrite, dst, buf, copylen) != copylen) {
- int saved_errno = errno;
-
- fclose(fp);
- errno = saved_errno;
- return (-1);
- }
- if (!ep)
- break;
- /* Skip comment. */
- len -= ep - buf + 1;
- buf = ep + 1;
- }
- }
- fclose(fp);
- return (0);
-}
-
-/*
- * Does line start with `s' and end with non-comment and non-whitespace?
- * Note: Does not treat `line' as a C string.
- */
-int
-matchline(const char *s, const char *line, size_t linelen)
-{
- size_t slen;
- int comment;
-
- slen = strlen(s);
- /* Is line shorter than string? */
- if (linelen <= slen)
- return (0);
- /* Does line start with string? */
- if (memcmp(line, s, slen) != 0)
- return (0);
- /* Does line contain anything but comments and whitespace? */
- line += slen;
- linelen -= slen;
- comment = 0;
- while (linelen) {
- if (comment) {
- if (*line == '>')
- comment = 0;
- } else if (*line == '<')
- comment = 1;
- else if (!isspace((unsigned char)*line))
- return (1);
- ++line;
- --linelen;
- }
- return (0);
-}
-
-/*
- * Are all required fields filled out?
- */
-int
-checkfile(const char *pathname)
-{
- FILE *fp;
- size_t len;
- int category, class, priority, release, severity, synopsis;
- char *buf;
-
- if ((fp = fopen(pathname, "r")) == NULL) {
- warn("%s", pathname);
- return (0);
- }
- category = class = priority = release = severity = synopsis = 0;
- while ((buf = fgetln(fp, &len))) {
- if (matchline(">Category:", buf, len))
- category = 1;
- else if (matchline(">Class:", buf, len))
- class = 1;
- else if (matchline(">Priority:", buf, len))
- priority = 1;
- else if (matchline(">Release:", buf, len))
- release = 1;
- else if (matchline(">Severity:", buf, len))
- severity = 1;
- else if (matchline(">Synopsis:", buf, len))
- synopsis = 1;
- }
- fclose(fp);
- return (category && class && priority && release && severity &&
- synopsis);
-}
-
-void
-template(FILE *fp)
-{
- fprintf(fp, "SENDBUG: -*- sendbug -*-\n");
- fprintf(fp, "SENDBUG: Lines starting with `SENDBUG' will"
- " be removed automatically, as\n");
- fprintf(fp, "SENDBUG: will all comments (text enclosed in `<' and `>').\n");
- fprintf(fp, "SENDBUG:\n");
- fprintf(fp, "To: %s\n", mailto);
- fprintf(fp, "Subject: \n");
- fprintf(fp, "From: %s\n", mailfrom);
- fprintf(fp, "Cc: %s\n", mailfrom);
- fprintf(fp, "Reply-To: %s\n", mailfrom);
- fprintf(fp, "X-sendbug-version: %s\n", version);
- fprintf(fp, "\n");
- fprintf(fp, "\n");
- fprintf(fp, ">Submitter-Id:\tcurrent-users\n");
- fprintf(fp, ">Originator:\t%s\n", fullname);
- fprintf(fp, ">Organization:\n");
- fprintf(fp, ">Synopsis:\t<synopsis of the problem (one line)>\n");
- fprintf(fp, ">Severity:\t"
- "<[ non-critical | serious | critical ] (one line)>\n");
- fprintf(fp, ">Priority:\t<[ low | medium | high ] (one line)>\n");
- fprintf(fp, ">Category:\t"
- "<[ acf | aports | base | doc | misc | hosting ] (one line)>\n");
- fprintf(fp, ">Class:\t\t"
- "<[ sw-bug | doc-bug | change-request | support ] (one line)>\n");
- fprintf(fp, ">Release:\t%s\n",release);
- fprintf(fp, ">Environment:\n");
- fprintf(fp, "\t<machine, os, target, libraries (multiple lines)>\n");
- fprintf(fp, "\tSystem : %s\n", uts.sysname);
- fprintf(fp, "\tVersion : %s\n", uts.version);
- fprintf(fp, "\tMachine : %s\n", uts.machine);
- fprintf(fp, "\tRelease : %s\n", uts.release);
- fprintf(fp, ">Description:\n");
- fprintf(fp, "\t<precise description of the problem (multiple lines)>\n");
- fprintf(fp, ">How-To-Repeat:\n");
- fprintf(fp, "\t<code/input/activities to reproduce the problem"
- " (multiple lines)>\n");
- fprintf(fp, ">Fix:\n");
- fprintf(fp, "\t<how to correct or work around the problem,"
- " if known (multiple lines)>\n");
-
- if (attatchment)
- attatch(fp);
-}