added feature of changing user - fiche - A pastebin adjusted for gopher use
 (HTM) git clone git://vernunftzentrum.de/fiche.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) LICENSE
       ---
 (DIR) commit d1a66efe6e498d93f7319a2cea8071a340c756d1
 (DIR) parent d6865f63f2725bb0f447cfb3f113abeb1376a73c
 (HTM) Author: solusipse <solus1ps3@gmail.com>
       Date:   Fri, 13 Sep 2013 23:51:58 +0200
       
       added feature of changing user
       
       Diffstat:
         fiche.c                             |      42 +++++++++++++++++++++++--------
         fiche.h                             |      14 ++++++++++----
       
       2 files changed, 42 insertions(+), 14 deletions(-)
       ---
 (DIR) diff --git a/fiche.c b/fiche.c
       @@ -10,9 +10,9 @@ Live example: http://code.solusipse.net/
        -------------------------------------------------------------------------------
        
        usage: fiche [-bdpqs].
       -             [-d domain] [-p port] [-s slug_size]
       -             [-o output directory] [-B buffer_size]
       -             [-l log file] [-q queue_size] [-b banlist]
       +             [-d domain] [-p port] [-s slug size]
       +             [-o output directory] [-B buffer size] [-u user name]
       +             [-l log file] [-b banlist] [-w whitelist]
        
        Compile with Makefile or manually with -O2 and -pthread flags.
        To install use `make install` command.
       @@ -254,6 +254,8 @@ int create_directory(char *slug)
            mkdir(BASEDIR, S_IRWXU | S_IRGRP | S_IROTH | S_IXOTH | S_IXGRP);
            int result = mkdir(directory, S_IRWXU | S_IRGRP | S_IROTH | S_IXOTH | S_IXGRP);
        
       +    change_owner(directory);
       +
            free(directory);
        
            return result;
       @@ -271,11 +273,29 @@ void save_to_file(char *slug, char *buffer)
            fprintf(fp, "%s", buffer);
            fclose(fp);
        
       +    change_owner(directory);
       +
            printf("Saved to: %s\n", directory);
            display_line();
            free(directory);
        }
        
       +void change_owner(char *directory)
       +{
       +    if ((UID != -1)&&(GID != -1))
       +    chown(directory, UID, GID);
       +}
       +
       +void set_uid_gid(char *username)
       +{
       +    struct passwd *userdata = getpwnam(username);
       +    if (userdata == NULL)
       +        error();
       +
       +    UID = userdata->pw_uid;
       +    GID = userdata->pw_gid;
       +}
       +
        void set_basedir()
        {
            BASEDIR = getenv("HOME");
       @@ -295,7 +315,7 @@ void parse_parameters(int argc, char **argv)
        {
            int c;
        
       -    while ((c = getopt (argc, argv, "p:b:q:s:d:o:l:B:")) != -1)
       +    while ((c = getopt (argc, argv, "p:b:s:d:o:l:B:u:w:")) != -1)
                switch (c)
                {
                    case 'd':
       @@ -312,10 +332,6 @@ void parse_parameters(int argc, char **argv)
                        BANFILE = optarg;
                        load_banlist(BANFILE);
                        break;
       -            case 'q':
       -                QUEUE_SIZE = atoi(optarg);
       -                printf("Queue size set to: %d.\n", QUEUE_SIZE);
       -                break;
                    case 's':
                        SLUG_SIZE = atoi(optarg);
                        printf("Slug size set to: %d.\n", SLUG_SIZE);
       @@ -329,11 +345,17 @@ void parse_parameters(int argc, char **argv)
                        LOG = optarg;
                        printf("Log file: %s\n", LOG);
                        break;
       +            case 'u':
       +                set_uid_gid(optarg);
       +                break;
       +            case 'w':
       +                WHITELIST = optarg;
       +                break;
                    default:
                        printf("usage: fiche [-bdpqs].\n");
                        printf("                     [-d domain] [-p port] [-s slug_size]\n");
       -                printf("                     [-o output directory] [-B buffer_size]\n");
       -                printf("                     [-l log file] [-q queue_size] [-b banlist]\n");
       +                printf("                     [-o output directory] [-B buffer_size] [-u user name]\n");
       +                printf("                     [-l log file] [-b banlist] [-w whitelist]\n");
                        exit(1);
                }
        }
        \ No newline at end of file
 (DIR) diff --git a/fiche.h b/fiche.h
       @@ -10,9 +10,9 @@ Live example: http://code.solusipse.net/
        -------------------------------------------------------------------------------
        
        usage: fiche [-bdpqs].
       -             [-d domain] [-p port] [-s slug_size]
       -             [-o output directory] [-B buffer_size]
       -             [-l log file] [-q queue_size]
       +             [-d domain] [-p port] [-s slug size]
       +             [-o output directory] [-B buffer size] [-u user name]
       +             [-l log file] [-b banlist] [-w whitelist]
        
        Compile with Makefile or manually with -O2 and -pthread flags.
        To install use `make install` command.
       @@ -27,6 +27,7 @@ $ cat fiche.c | nc localhost 9999
        #ifndef FICHE_H
        #define FICHE_H
        
       +#include <pwd.h>
        #include <time.h>
        #include <netdb.h>
        #include <stdio.h>
       @@ -40,14 +41,17 @@ $ cat fiche.c | nc localhost 9999
        #include <sys/socket.h>
        #include <netinet/in.h>
        
       +int UID = -1;
       +int GID = -1;
        char *LOG;
        char *BASEDIR;
        char *BANLIST;
        char *BANFILE;
       +char *WHITELIST;
        int PORT = 9999;
        int SLUG_SIZE = 4;
        int BUFSIZE = 32768;
       -int QUEUE_SIZE = 100;
       +int QUEUE_SIZE = 500;
        char DOMAIN[128] = "http://localhost/";
        
        int time_seed;
       @@ -68,6 +72,8 @@ void set_basedir();
        void load_banlist();
        void parse_parameters(int argc, char **argv);
        void save_log(char *slug, char *hostaddrp, char *h_name);
       +void change_owner(char *directory);
       +void set_uid_gid();
        
        char *return_line(){return("\n====================================");}
        char *check_banlist(char *ip_address);