Package: iptraf
Version: 3.0.0-8.1
Severity: minor
Tags: upstream patch

Dear Maintainer,

the help of iptraf (-h) should be visible without becoming root:

~ iptraf -h
IPTraf Version 3.0.0
Copyright (c) Gerard Paul Java 1997-2004l

This program can be run only by the system administrator

It should however present its help message even for non-root users



-- System Information:
Debian Release: 7.0
  APT prefers proposed-updates
  APT policy: (500, 'proposed-updates'), (500, 'stable'), (300, 'unstable'), 
(100, 'experimental')
Architecture: amd64 (x86_64)
Foreign Architectures: i386

Kernel: Linux 3.9.4 (SMP w/2 CPU cores)
Locale: LANG=en_GB.utf8, LC_CTYPE=en_GB.utf8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/bash

Versions of packages iptraf depends on:
ii  libc6        2.13-38
ii  libncurses5  5.9-10
ii  libtinfo5    5.9-10

iptraf recommends no packages.

iptraf suggests no packages.

-- no debconf information
diff -u iptraf-3.0.0/src/iptraf.c iptraf-3.0.0/src/iptraf.c
--- iptraf-3.0.0/src/iptraf.c
+++ iptraf-3.0.0/src/iptraf.c
@@ -479,6 +479,19 @@
     close(fd);
 }
 
+void check_root()
+{
+#ifndef ALLOWUSERS
+    if (getuid() != 0) {
+        fprintf(stderr, "\nIPTraf Version %s\n", VERSION);
+        fprintf(stderr, "Copyright (c) Gerard Paul Java 1997-2004l\n\n");
+        fprintf(stderr,
+                "This program can be run only by the system administrator\n\n");
+        exit(1);
+    }
+#endif
+}
+
 /*
  * Main routine
  */
@@ -492,15 +505,6 @@
     int facilitytime = 0;
     int current_log_interval;
 
-#ifndef ALLOWUSERS
-    if (getuid() != 0) {
-        fprintf(stderr, "\nIPTraf Version %s\n", VERSION);
-        fprintf(stderr, "Copyright (c) Gerard Paul Java 1997-2004l\n\n");
-        fprintf(stderr,
-                "This program can be run only by the system administrator\n\n");
-        exit(1);
-    }
-#endif
 
     setlocale(LC_ALL, "");
 
@@ -521,7 +525,8 @@
                 commandhelp();
                 exit(0);
             } else if (opt == 'f') {
-                removetags();
+		check_root();
+		removetags();
                 remove_sockets();
             } else if (opt == 't') {
                 facilitytime = atoi(optarg);
@@ -573,6 +578,7 @@
             }
         } while ((opt != '?') && (opt != -1));
     }
+    check_root();
     is_first_instance = first_instance();
 
     if ((getenv("TERM") == NULL) && (!daemonized)) {
diff -u iptraf-3.0.0/debian/changelog iptraf-3.0.0/debian/changelog
--- iptraf-3.0.0/debian/changelog
+++ iptraf-3.0.0/debian/changelog
@@ -1,3 +1,10 @@
+iptraf (3.0.0-8.2) UNRELEASED; urgency=low
+
+  * Non-maintainer upload.
+  * patched to query help as non-root.
+
+ -- Michael Eyrich <m...@newtec.eu>  Fri, 31 May 2013 10:16:07 +0200
+
 iptraf (3.0.0-8.1) unstable; urgency=low
 
   * Non-maintainer upload.
only in patch2:
unchanged:
--- iptraf-3.0.0.orig/patch-help.diff
+++ iptraf-3.0.0/patch-help.diff
@@ -0,0 +1,56 @@
+--- src/iptraf.c~	2013-05-29 11:33:11.000000000 +0200
++++ src/iptraf.c	2013-05-31 10:06:19.891603025 +0200
+@@ -479,6 +479,19 @@
+     close(fd);
+ }
+ 
++void check_root()
++{
++#ifndef ALLOWUSERS
++    if (getuid() != 0) {
++        fprintf(stderr, "\nIPTraf Version %s\n", VERSION);
++        fprintf(stderr, "Copyright (c) Gerard Paul Java 1997-2004l\n\n");
++        fprintf(stderr,
++                "This program can be run only by the system administrator\n\n");
++        exit(1);
++    }
++#endif
++}
++
+ /*
+  * Main routine
+  */
+@@ -492,15 +505,6 @@
+     int facilitytime = 0;
+     int current_log_interval;
+ 
+-#ifndef ALLOWUSERS
+-    if (getuid() != 0) {
+-        fprintf(stderr, "\nIPTraf Version %s\n", VERSION);
+-        fprintf(stderr, "Copyright (c) Gerard Paul Java 1997-2004l\n\n");
+-        fprintf(stderr,
+-                "This program can be run only by the system administrator\n\n");
+-        exit(1);
+-    }
+-#endif
+ 
+     setlocale(LC_ALL, "");
+ 
+@@ -521,7 +525,8 @@
+                 commandhelp();
+                 exit(0);
+             } else if (opt == 'f') {
+-                removetags();
++                check_root();
++                removetags();
+                 remove_sockets();
+             } else if (opt == 't') {
+                 facilitytime = atoi(optarg);
+@@ -573,6 +578,7 @@
+             }
+         } while ((opt != '?') && (opt != -1));
+     }
++    check_root();
+     is_first_instance = first_instance();
+ 
+     if ((getenv("TERM") == NULL) && (!daemonized)) {
only in patch2:
unchanged:
--- iptraf-3.0.0.orig/.pc/.version
+++ iptraf-3.0.0/.pc/.version
@@ -0,0 +1 @@
+2
only in patch2:
unchanged:
--- iptraf-3.0.0.orig/.pc/.quilt_patches
+++ iptraf-3.0.0/.pc/.quilt_patches
@@ -0,0 +1 @@
+patches
only in patch2:
unchanged:
--- iptraf-3.0.0.orig/.pc/.quilt_series
+++ iptraf-3.0.0/.pc/.quilt_series
@@ -0,0 +1 @@
+series
only in patch2:
unchanged:
--- iptraf-3.0.0.orig/.pc/applied-patches
+++ iptraf-3.0.0/.pc/applied-patches
@@ -0,0 +1 @@
+fix-help-as-non-root.patch
only in patch2:
unchanged:
--- iptraf-3.0.0.orig/.pc/fix-help-as-non-root.patch/src/iptraf.c
+++ iptraf-3.0.0/.pc/fix-help-as-non-root.patch/src/iptraf.c
@@ -0,0 +1,694 @@
+/*
+===========================================================================
+IPTraf
+An IP Network Statistics Utility
+Written by Gerard Paul Java <ri...@seul.org>
+Copyright (c) Gerard Paul Java 1997-2004
+
+Version 3.0.0
+Main Module
+
+---------------------------------------------------------------------------
+This software is open-source; you may redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed WITHOUT ANY WARRANTY; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+See the GNU General Public License in the included COPYING file for
+details.
+---------------------------------------------------------------------------
+*/
+
+#define MAIN_MODULE
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <getopt.h>
+#include <curses.h>
+#include <panel.h>
+#include <signal.h>
+#include <string.h>
+#include <locale.h>
+#include <time.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <dirent.h>
+#include <errno.h>
+#include <menurt.h>
+#include <winops.h>
+#include <msgboxes.h>
+#include "dirs.h"
+#include "deskman.h"
+#include "fltdefs.h"
+#include "fltselect.h"
+#include "fltmgr.h"
+#include "fltedit.h"
+#include "ifstats.h"
+#include "serv.h"
+#include "options.h"
+#include "promisc.h"
+#include "externs.h"
+#include "instances.h"
+#include "tcptable.h"
+#include "log.h"
+#include "attrs.h"
+#include "rvnamed.h"
+#include "logvars.h"
+#include "getpath.h"
+
+#define WITHALL 1
+#define WITHOUTALL 0
+
+const char *ALLSPEC = "all";
+
+/*
+ * Important globals used throughout the
+ * program.
+ */
+int exitloop = 0;
+int daemonized = 0;
+int facility_running = 0;
+int is_first_instance;
+char active_facility_lockfile[64];
+char active_facility_countfile[64];
+int accept_unsupported_interfaces = 0;
+char graphing_filter[80];
+
+extern void about();
+
+void press_enter_to_continue(void)
+{
+    fprintf(stderr, "Press Enter to continue.\n");
+    getchar();
+}
+
+void clearfiles(char *prefix, char *directory)
+{
+    DIR *dir;
+    struct dirent *dir_entry;
+    char target_name[80];
+
+    dir = opendir(directory);
+
+    if (dir == NULL) {
+        fprintf(stderr, "\nUnable to read directory %s\n%s\n",
+                directory, strerror(errno));
+        press_enter_to_continue();
+        return;
+    }
+
+    do {
+        dir_entry = readdir(dir);
+        if (dir_entry != NULL) {
+            if (strncmp(dir_entry->d_name, prefix, strlen(prefix)) == 0) {
+                snprintf(target_name, 80, "%s/%s", directory,
+                         dir_entry->d_name);
+                unlink(target_name);
+            }
+        }
+    } while (dir_entry != NULL);
+
+    closedir(dir);
+}
+
+void removetags(void)
+{
+    clearfiles("iptraf", LOCKDIR);
+}
+
+void remove_sockets(void)
+{
+    clearfiles(SOCKET_PREFIX, WORKDIR);
+}
+
+/*
+ * Handlers for the TERM signal and HUP signals.  There's nothing we can do
+ * for the KILL.
+ */
+
+void term_signal_handler(int signo)
+{
+    erase();
+    refresh();
+    endwin();
+
+    if (signo != SIGHUP)
+        fprintf(stderr, "IPTraf process %u exiting on signal %d\n\n",
+                getpid(), signo);
+
+    if (active_facility_lockfile[0] != '\0') {
+        unlink(active_facility_lockfile);
+        adjust_instance_count(PROCCOUNTFILE, -1);
+        if (active_facility_countfile[0] != '\0')
+            adjust_instance_count(active_facility_countfile, -1);
+    }
+
+    if (is_first_instance)
+        unlink(IPTIDFILE);
+
+    exit(1);
+}
+
+/* 
+ * Handler for the SIGSEGV, Segmentation Fault.  Tries to clear the screen
+ * and issue a better message than "Segmentation fault".  May not always
+ * clean up properly.
+ */
+
+void segvhandler()
+{
+    erase();
+    refresh();
+    endwin();
+    fprintf(stderr, "Fatal: memory allocation error\n\n");
+    fprintf(stderr,
+            "If you suspect a bug, please report the exact circumstances under which this\n");
+    fprintf(stderr,
+            "error was generated.  If possible, include gdb or strace data which may point\n");
+    fprintf(stderr,
+            "out where the error occured.  Bug reports may be sent in to ipt...@seul.org.\n\n");
+    fprintf(stderr,
+            "An attempt will be made to clear all lock files, but if stale lock files\n");
+    fprintf(stderr,
+            "remain, exit all other instances of IPTraf and restart with the -f\n");
+    fprintf(stderr, "command-line parameter.\n\n");
+    fprintf(stderr, "IPTraf process %u aborting on signal 11.\n\n",
+            getpid());
+
+    if (active_facility_lockfile[0] != '\0')
+        unlink(active_facility_lockfile);
+
+    if (is_first_instance)
+        unlink(IPTIDFILE);
+
+    if (active_facility_lockfile[0] != '\0') {
+        unlink(active_facility_lockfile);
+        adjust_instance_count(PROCCOUNTFILE, -1);
+        if (active_facility_countfile[0] != '\0')
+            adjust_instance_count(active_facility_countfile, -1);
+    }
+
+    exit(2);
+}
+
+/*
+ * USR2 handler.  Used to normally exit a daemonized facility.
+ */
+
+void term_usr2_handler()
+{
+    exitloop = 1;
+}
+
+void init_break_menu(struct MENU *break_menu)
+{
+    tx_initmenu(break_menu, 6, 20, (LINES - 6) / 2, COLS / 2,
+                BOXATTR, STDATTR, HIGHATTR, BARSTDATTR, BARHIGHATTR,
+                DESCATTR);
+    tx_additem(break_menu, " By packet ^s^ize",
+               "Displays packet counts by packet size range");
+    tx_additem(break_menu, " By TCP/UDP ^p^ort",
+               "Displays packet and byte counts by service port");
+    tx_additem(break_menu, NULL, NULL);
+    tx_additem(break_menu, " E^x^it menu", "Return to main menu");
+}
+
+/*
+ * Get the ball rolling: The program interface routine.
+ */
+
+void program_interface(struct OPTIONS *options,
+                       int opt, char *optarg, int facilitytime)
+{
+    struct MENU menu;
+    struct MENU break_menu;
+
+    int endloop = 0;
+    int row = 1;
+    int break_row = 1;
+    int aborted;
+    int break_aborted;
+
+    struct filterstate ofilter;
+    struct ffnode *fltfiles;
+
+    char ifname[10];
+    char *ifptr = NULL;
+    struct porttab *ports;
+
+    draw_desktop();
+
+    attrset(STATUSBARATTR);
+    mvprintw(0, 1, "IPTraf");
+
+    /*
+     * Load saved filter or graphing filter if specified
+     */
+    if (graphing_logfile[0] != '\0') {
+        loadfilterlist(&fltfiles);
+        memset(&ofilter, 0, sizeof(struct filterstate));
+        loadfilter(pickfilterbyname(fltfiles, graphing_filter),
+                   &(ofilter.fl), FLT_RESOLVE);
+    } else {
+        loadfilters(&ofilter);
+        indicate("");
+    }
+
+    loadaddports(&ports);
+
+    if (opt == 0) {
+        attrset(STATUSBARATTR);
+        mvprintw(LINES - 1, 1, PLATFORM);
+        about();
+
+        tx_initmenu(&menu, 13, 35, (LINES - 14) / 2, (COLS - 35) / 2,
+                    BOXATTR, STDATTR, HIGHATTR, BARSTDATTR, BARHIGHATTR,
+                    DESCATTR);
+
+        tx_additem(&menu, " IP traffic ^m^onitor",
+                   "Displays current IP traffic information");
+        tx_additem(&menu, " General interface ^s^tatistics",
+                   "Displays some statistics for attached interfaces");
+        tx_additem(&menu, " ^D^etailed interface statistics",
+                   "Displays more statistics for a selected interface");
+        tx_additem(&menu, " Statistical ^b^reakdowns...",
+                   "Facilities for traffic counts by packet size or TCP/UDP port");
+        tx_additem(&menu, " ^L^AN station monitor",
+                   "Displays statistics on detected LAN stations");
+        tx_additem(&menu, NULL, NULL);
+        tx_additem(&menu, " ^F^ilters...",
+                   "Allows you to select traffic display and logging criteria");
+        tx_additem(&menu, NULL, NULL);
+        tx_additem(&menu, " C^o^nfigure...",
+                   "Set various program options");
+        tx_additem(&menu, NULL, NULL);
+        tx_additem(&menu, " E^x^it", "Exits program");
+
+        endloop = 0;
+
+        do {
+            tx_showmenu(&menu);
+            tx_operatemenu(&menu, &row, &aborted);
+
+            switch (row) {
+            case 1:
+                selectiface(ifname, WITHALL, &aborted);
+                if (!aborted) {
+                    if (strcmp(ifname, "") != 0)
+                        ifptr = ifname;
+                    else
+                        ifptr = NULL;
+
+                    ipmon(options, &ofilter, 0, ifptr);
+                }
+                break;
+            case 2:
+                ifstats(options, &ofilter, 0);
+                break;
+            case 3:
+                selectiface(ifname, WITHOUTALL, &aborted);
+                if (!aborted)
+                    detstats(ifname, options, 0, &ofilter);
+                break;
+            case 4:
+                break_row = 1;
+                init_break_menu(&break_menu);
+                tx_showmenu(&break_menu);
+                tx_operatemenu(&break_menu, &break_row, &break_aborted);
+
+                switch (break_row) {
+                case 1:
+                    selectiface(ifname, WITHOUTALL, &aborted);
+                    if (!aborted)
+                        packet_size_breakdown(options, ifname, 0,
+                                              &ofilter);
+                    break;
+                case 2:
+                    selectiface(ifname, WITHOUTALL, &aborted);
+                    if (!aborted)
+                        servmon(ifname, ports, options, 0, &ofilter);
+                    break;
+                case 4:
+                    break;
+                }
+                tx_destroymenu(&break_menu);
+                break;
+            case 5:
+                selectiface(ifname, WITHALL, &aborted);
+                if (!aborted) {
+                    if (strcmp(ifname, "") != 0)
+                        ifptr = ifname;
+                    else
+                        ifptr = NULL;
+                    hostmon(options, 0, ifptr, &ofilter);
+                }
+                break;
+            case 7:
+                config_filters(&ofilter);
+                savefilters(&ofilter);
+                break;
+            case 9:
+                setoptions(options, &ports);
+                saveoptions(options);
+                break;
+            case 11:
+                endloop = 1;
+                break;
+            }
+        } while (!endloop);
+
+        tx_destroymenu(&menu);
+    } else {
+        switch (opt) {
+        case 'i':
+            if ((strcmp(optarg, ALLSPEC) == 0)
+                || (strcmp(optarg, "") == 0))
+                ifptr = NULL;
+            else
+                ifptr = optarg;
+
+            ipmon(options, &ofilter, facilitytime, ifptr);
+            break;
+        case 'g':
+            ifstats(options, &ofilter, facilitytime);
+            break;
+        case 'd':
+            detstats(optarg, options, facilitytime, &ofilter);
+            break;
+        case 's':
+            servmon(optarg, ports, options, facilitytime, &ofilter);
+            break;
+        case 'z':
+            packet_size_breakdown(options, optarg, facilitytime, &ofilter);
+            break;
+        case 'l':
+            if ((strcmp(optarg, ALLSPEC) == 0)
+                || (strcmp(optarg, "") == 0))
+                ifptr = NULL;
+            else
+                ifptr = optarg;
+
+            hostmon(options, facilitytime, ifptr, &ofilter);
+            break;
+        }
+    }
+
+    destroyporttab(ports);
+    erase();
+    update_panels();
+    doupdate();
+}
+
+
+/*
+ * Command-line help facility.
+ */
+
+void commandhelp()
+{
+    printf("\nSyntax:\n");
+    printf
+        ("    iptraf [ -f ] [ -u ] [ { -i iface | -g | -d iface | -s iface | -z iface |\n");
+    printf
+        ("           -l iface } [ -t timeout ] [ -B ] [ -L logfile ] [-I interval] ] \n\n");
+    printf
+        ("Issue the iptraf command with no parameters for menu-driven operation.\n");
+    printf("These options can also be supplied to the command:\n\n");
+    printf
+        ("-i iface    - start the IP traffic monitor (use \"-i all\" for all interfaces)\n");
+    printf("-g          - start the general interface statistics\n");
+    printf
+        ("-d iface    - start the detailed statistics facility on an interface\n");
+    printf
+        ("-s iface    - start the TCP and UDP monitor on an interface\n");
+    printf("-z iface    - shows the packet size counts on an interface\n");
+    printf
+        ("-l iface    - start the LAN station monitor (\"-l all\" for all LAN interfaces)\n");
+    printf
+        ("-B          - run in background (use only with one of the above parameters)\n");
+    printf
+        ("-t timeout  - when used with one of the above parameters, tells\n");
+    printf
+        ("              the facility to run only for the specified number of\n");
+    printf("              minutes (timeout)\n");
+    printf
+        ("-L logfile  - specifies an alternate log file for any direct invocation\n");
+    printf
+        ("              of a facility from the command line.  The log is placed in\n");
+    printf("              %s if path is not specified.\n", LOGDIR);
+    printf
+        ("-I interval - specifies the log interval for all facilities except the IP\n");
+    printf("              traffic monitor.  Value is in minutes.\n");
+    printf
+        ("-f          - clear all locks and counters.  Use with great caution.\n");
+    printf
+        ("              Normally used to recover from an abnormal termination.\n\n");
+    printf
+        ("-u          - allow use of unsupported interfaces as ethernet devices.\n");
+    printf("IPTraf %s Copyright (c) Gerard Paul Java 1997-2004\n",
+           VERSION);
+}
+
+int first_instance()
+{
+    int fd;
+
+    fd = open(IPTIDFILE, O_RDONLY);
+
+    if (fd < 0)
+        return !0;
+    else {
+        close(fd);
+        return 0;
+    }
+}
+
+void mark_first_instance()
+{
+    int fd;
+
+    fd = open(IPTIDFILE, O_CREAT | O_WRONLY | O_TRUNC, S_IRUSR | S_IWUSR);
+    if (fd < 0) {
+        fprintf(stderr, "\nWarning: unable to tag this process\r\n");
+        press_enter_to_continue();
+        return;
+    }
+    close(fd);
+}
+
+/*
+ * Main routine
+ */
+
+int main(int argc, char **argv)
+{
+    struct OPTIONS options;
+    int opt = 0;
+    int command = 0;
+    char keyparm[12];
+    int facilitytime = 0;
+    int current_log_interval;
+
+#ifndef ALLOWUSERS
+    if (getuid() != 0) {
+        fprintf(stderr, "\nIPTraf Version %s\n", VERSION);
+        fprintf(stderr, "Copyright (c) Gerard Paul Java 1997-2004l\n\n");
+        fprintf(stderr,
+                "This program can be run only by the system administrator\n\n");
+        exit(1);
+    }
+#endif
+
+    setlocale(LC_ALL, "");
+
+    strcpy(current_logfile, "");
+    strcpy(graphing_logfile, "");
+    strcpy(graphing_filter, "");
+
+    /*
+     * Parse command line
+     */
+
+    if (argc > 1) {
+        do {
+            opterr = 0;
+            opt = getopt(argc, argv, "i:gd:s:z:l:hfqt:BL:uI:G:F:");
+
+            if (opt == 'h') {
+                commandhelp();
+                exit(0);
+            } else if (opt == 'f') {
+                removetags();
+                remove_sockets();
+            } else if (opt == 't') {
+                facilitytime = atoi(optarg);
+                if (facilitytime == 0) {
+                    fprintf(stderr, "\nInvalid time value\n\n");
+                    exit(1);
+                }
+            } else if (opt == 'B') {
+                daemonized = 1;
+                setenv("TERM", "linux", 1);
+            } else if (opt == 'L') {
+                if (strchr(optarg, '/') != NULL)
+                    strncpy(current_logfile, optarg, 80);
+                else
+                    strncpy(current_logfile, get_path(T_LOGDIR, optarg),
+                            80);
+            } else if (opt == 'q') {
+                /* -q parameter now ignored, maintained for compatibility */
+            } else if (opt == 'u') {
+                accept_unsupported_interfaces = 1;
+            } else if (opt == 'I') {
+                current_log_interval = atoi(optarg);
+                if (current_log_interval == 0)
+                    fprintf(stderr, "Invalid log interval value\n");
+
+                exit(1);
+            } else if (opt == 'G') {
+                if (strchr(optarg, '/') != NULL)
+                    strncpy(graphing_logfile, optarg, 80);
+                else
+                    strncpy(graphing_logfile, get_path(T_LOGDIR, optarg),
+                            80);
+
+                daemonized = 1;
+            } else if (opt == 'F') {
+                strncpy(graphing_filter, optarg, 80);
+            } else if (opt == '?') {
+                fprintf(stderr,
+                        "\nInvalid option or missing parameter, use iptraf -h for help\n\n");
+                exit(1);
+            } else if (opt != -1) {
+                if (optarg != 0) {
+                    bzero(keyparm, 12);
+                    strncpy(keyparm, optarg, 11);
+                } else
+                    strcpy(keyparm, "");
+
+                command = opt;
+            }
+        } while ((opt != '?') && (opt != -1));
+    }
+    is_first_instance = first_instance();
+
+    if ((getenv("TERM") == NULL) && (!daemonized)) {
+        fprintf(stderr, "Your TERM variable is not set.\n");
+        fprintf(stderr, "Please set it to an appropriate value.\n");
+        exit(1);
+    }
+
+    if (graphing_logfile[0] != '\0' && graphing_filter[0] == '\0') {
+        fprintf(stderr, "Specify an IP filter name with -F\n");
+        exit(1);
+    }
+
+    loadoptions(&options);
+
+    /*
+     * If a facility is directly invoked from the command line, check for
+     * a daemonization request
+     */
+
+    if ((daemonized) && (command != 0)) {
+        switch (fork()) {
+        case 0:                /* child */
+            setsid();
+            freopen("/dev/null", "w", stdout);  /* redirect std output */
+            freopen("/dev/null", "r", stdin);   /* redirect std input */
+            freopen("/dev/null", "w", stderr);  /* redirect std error */
+            signal(SIGUSR2, (void *) term_usr2_handler);
+
+            if (graphing_logfile[0] != '\0')
+                options.logging = 0;    /* if raw logging is specified */
+            else                /* then standard logging is disabled */
+                options.logging = 1;
+            break;
+        case -1:               /* error */
+            fprintf(stderr,
+                    "\nFork error, IPTraf cannot run in background\n\n");
+            exit(1);
+        default:               /* parent */
+            exit(0);
+        }
+    }
+#ifdef SIMDAEMON
+    daemonized = 1;
+    freopen("/dev/null", "w", stdout);  /* redirect std output */
+    freopen("/dev/null", "r", stdin);
+    freopen("/dev/null", "w", stderr);
+#endif
+    
+    /* Check whether LOCKDIR exists (/var/run is on a tmpfs in Ubuntu) */
+    if(access(LOCKDIR,F_OK) != 0) {
+	if(mkdir(LOCKDIR, 0700) == -1) {
+	    fprintf(stderr, "Cannot create %s: %s", LOCKDIR, strerror(errno));
+	    exit(1);
+        }
+	if(chown(LOCKDIR, 0, 0) == -1) {
+	    fprintf(stderr, "Cannot change owner of %s: %s", LOCKDIR, strerror(errno));
+	    exit(1);
+	}
+    }
+
+    initscr();
+
+    if ((LINES < 24) || (COLS < 80)) {
+        endwin();
+        fprintf(stderr,
+                "\nThis program requires a screen size of at least 80 columns by 24 lines\n");
+        fprintf(stderr, "Please resize your window\n\n");
+        exit(1);
+    }
+
+    mark_first_instance();
+
+    signal(SIGTERM, (void *) term_signal_handler);
+    signal(SIGHUP, (void *) term_signal_handler);
+    signal(SIGSEGV, (void *) segvhandler);
+    signal(SIGTSTP, SIG_IGN);
+    signal(SIGINT, SIG_IGN);
+    signal(SIGUSR1, SIG_IGN);
+
+    start_color();
+    standardcolors(options.color);
+    noecho();
+    nonl();
+    cbreak();
+
+#ifndef DEBUG
+    curs_set(0);
+#endif
+
+    /*
+     * Set logfilename variable to NULL if -L was specified without an
+     * appropriate facility on the command line.
+     */
+
+    if (command == 0)
+        strcpy(current_logfile, "");
+
+    /*
+     * If by this time the logfile is still acceptable, obtain the
+     * logspan from the command line if so specified.
+     */
+
+    if (current_logfile[0] != '\0') {
+        options.logging = 1;
+        if (current_log_interval != 0) {
+            options.logspan = current_log_interval;
+        }
+    }
+
+    program_interface(&options, command, keyparm, facilitytime);
+
+    endwin();
+
+    if (is_first_instance)
+        unlink(IPTIDFILE);
+
+    return (0);
+}
only in patch2:
unchanged:
--- iptraf-3.0.0.orig/patches/series
+++ iptraf-3.0.0/patches/series
@@ -0,0 +1 @@
+fix-help-as-non-root.patch
only in patch2:
unchanged:
--- iptraf-3.0.0.orig/patches/fix-help-as-non-root.patch
+++ iptraf-3.0.0/patches/fix-help-as-non-root.patch
@@ -0,0 +1,58 @@
+Index: iptraf-3.0.0/src/iptraf.c
+===================================================================
+--- iptraf-3.0.0.orig/src/iptraf.c	2013-05-29 11:33:11.000000000 +0200
++++ iptraf-3.0.0/src/iptraf.c	2013-05-31 10:18:56.281437921 +0200
+@@ -479,6 +479,19 @@ void mark_first_instance()
+     close(fd);
+ }
+ 
++void check_root()
++{
++#ifndef ALLOWUSERS
++    if (getuid() != 0) {
++        fprintf(stderr, "\nIPTraf Version %s\n", VERSION);
++        fprintf(stderr, "Copyright (c) Gerard Paul Java 1997-2004l\n\n");
++        fprintf(stderr,
++                "This program can be run only by the system administrator\n\n");
++        exit(1);
++    }
++#endif
++}
++
+ /*
+  * Main routine
+  */
+@@ -492,15 +505,6 @@ int main(int argc, char **argv)
+     int facilitytime = 0;
+     int current_log_interval;
+ 
+-#ifndef ALLOWUSERS
+-    if (getuid() != 0) {
+-        fprintf(stderr, "\nIPTraf Version %s\n", VERSION);
+-        fprintf(stderr, "Copyright (c) Gerard Paul Java 1997-2004l\n\n");
+-        fprintf(stderr,
+-                "This program can be run only by the system administrator\n\n");
+-        exit(1);
+-    }
+-#endif
+ 
+     setlocale(LC_ALL, "");
+ 
+@@ -521,7 +525,8 @@ int main(int argc, char **argv)
+                 commandhelp();
+                 exit(0);
+             } else if (opt == 'f') {
+-                removetags();
++		check_root();
++		removetags();
+                 remove_sockets();
+             } else if (opt == 't') {
+                 facilitytime = atoi(optarg);
+@@ -573,6 +578,7 @@ int main(int argc, char **argv)
+             }
+         } while ((opt != '?') && (opt != -1));
+     }
++    check_root();
+     is_first_instance = first_instance();
+ 
+     if ((getenv("TERM") == NULL) && (!daemonized)) {

Reply via email to