]> git.tuebingen.mpg.de Git - paraslash.git/commitdiff
Merge branch 'maint'
authorAndre Noll <maan@systemlinux.org>
Thu, 5 Nov 2009 23:27:40 +0000 (00:27 +0100)
committerAndre Noll <maan@systemlinux.org>
Thu, 5 Nov 2009 23:27:40 +0000 (00:27 +0100)
Conflicts:
server.c

1  2 
server.c

diff --combined server.c
index be97516f1e66272cf53abde69122d80906d53159,95ff25cf77afb9f772a4336626e2bf340a2da868..f7aad89841306a3e4e431b039584f86822d82474
+++ b/server.c
@@@ -14,7 -14,7 +14,7 @@@
   *
   *
   *    - The main programs: \ref server.c, \ref audiod.c, \ref client.c,
 - *      \ref audioc.c, \ref fsck.c, \ref afh.c
 + *      \ref audioc.c, \ref afh.c
   *    - Server: \ref server_command, \ref sender,
   *    - Audio file selector: \ref audio_format_handler, \ref mood, \ref afs_table,
   *    - Client: \ref receiver, \ref receiver_node, \ref filter, \ref filter_node.
@@@ -47,6 -47,7 +47,6 @@@
   *    - Time: \ref time.c,
   *    - Spawning processes: \ref exec.c,
   *    - Inter process communication: \ref ipc.c,
 - *    - The object storage layer: \ref osl.c,
   *    - Blob tables: \ref blob.c,
   *    - The error subssystem: \ref error.h.
   *    - Access control for paraslash senders: \ref acl.c, \ref acl.h.
@@@ -54,6 -55,7 +54,6 @@@
   * Low-level data structures:
   *
   *    - Doubly linked lists: \ref list.h,
 - *    - Red-black trees: \ref rbtree.h, \ref rbtree.c,
   *    - Ring buffer: \ref ringbuffer.c, \ref ringbuffer.h,
   *    - Hashing: \ref hash.h, \ref sha1.h, \ref sha1.c,
   *    - Crypto: \ref crypt.c.
  #include <signal.h>
  #include <dirent.h>
  #include <sys/time.h>
 +#include <openssl/rc4.h>
 +#include <regex.h>
 +#include <osl.h>
  
  #include "para.h"
  #include "error.h"
 +#include "crypt.h"
  #include "server.cmdline.h"
  #include "afh.h"
  #include "string.h"
@@@ -320,6 -318,7 +320,6 @@@ static void signal_post_select(struct s
                waitpid(mmd->afs_pid, NULL, 0);
  cleanup:
                free(mmd->afd.afhi.chunk_table);
 -              free(mmd->afd.afhi.info_string);
                close_listed_fds();
                mutex_destroy(mmd_mutex);
                shm_detach(mmd);
@@@ -361,6 -360,7 +361,6 @@@ static void command_post_select(struct 
        char *peer_name;
        pid_t child_pid;
        uint32_t *chunk_table;
 -      char *info_string;
  
        if (!FD_ISSET(sct->listen_fd, &s->rfds))
                return;
        PARA_INFO_LOG("got connection from %s, forking\n", peer_name);
        mmd->num_connects++;
        mmd->active_connections++;
 -      random();
 -      /* The chunk table and the info_string are pointers located in the
 -       * mmd struct that point to dynamically allocated memory that must be
 -       * freed by the parent and the child. However, as the mmd struct is in
 -       * a shared memory area, there's no guarantee that after the fork these
 -       * pointers are still valid in child context. As these two pointers are
 -       * not used in the child anyway, we save them to local variables and
 -       * free the memory via that copy in the child.
 +      /*
 +       * The chunk table is a pointer located in the mmd struct that points
 +       * to dynamically allocated memory, i.e. it must be freed by the parent
 +       * and the child. However, as the mmd struct is in a shared memory
 +       * area, there's no guarantee that after the fork this pointer is still
 +       * valid in child context. As it is not used in the child anyway, we
 +       * save it to a local variable before the fork and free the memory via
 +       * that copy in the child directly after the fork.
         */
 -      info_string = mmd->afd.afhi.info_string;
        chunk_table = mmd->afd.afhi.chunk_table;
        child_pid = fork();
        if (child_pid < 0) {
                return;
        }
        /* mmd might already have changed at this point */
 -      free(info_string);
        free(chunk_table);
        alarm(ALARM_TIMEOUT);
        close_listed_fds();
@@@ -436,22 -438,52 +436,24 @@@ err
        exit(EXIT_FAILURE);
  }
  
 -static void init_random_seed(void)
 -{
 -      unsigned int seed;
 -      int fd, ret = para_open("/dev/urandom", O_RDONLY, 0);
 -
 -      if (ret < 0)
 -              goto err;
 -      fd = ret;
 -      ret = read(fd, &seed, sizeof(seed));
 -      if (ret < 0) {
 -              ret = -ERRNO_TO_PARA_ERROR(errno);
 -              goto out;
 -      }
 -      if (ret != sizeof(seed)) {
 -              ret = -ERRNO_TO_PARA_ERROR(EIO);
 -              goto out;
 -      }
 -      srandom(seed);
 -      ret = 1;
 -out:
 -      close(fd);
 -      if (ret >= 0)
 -              return;
 -err:
 -      PARA_EMERG_LOG("can not seed pseudo random number generator: %s\n",
 -              para_strerror(-ret));
 -      exit(EXIT_FAILURE);
 -}
 -
  static int init_afs(void)
  {
        int ret, afs_server_socket[2];
+       pid_t afs_pid;
  
        ret = socketpair(PF_UNIX, SOCK_DGRAM, 0, afs_server_socket);
        if (ret < 0)
                exit(EXIT_FAILURE);
 -      afs_socket_cookie = para_random((uint32_t)-1);
 +      get_random_bytes_or_die((unsigned char *)&afs_socket_cookie,
 +              sizeof(afs_socket_cookie));
-       mmd->afs_pid = fork();
-       if (mmd->afs_pid < 0)
+       afs_pid = fork();
+       if (afs_pid < 0)
                exit(EXIT_FAILURE);
-       if (!mmd->afs_pid) { /* child (afs) */
+       if (afs_pid == 0) { /* child (afs) */
                close(afs_server_socket[0]);
                afs_init(afs_socket_cookie, afs_server_socket[1]);
        }
+       mmd->afs_pid = afs_pid;
        close(afs_server_socket[1]);
        ret = mark_fd_nonblocking(afs_server_socket[0]);
        if (ret < 0)
@@@ -480,7 -512,7 +482,7 @@@ static void server_init(int argc, char 
        int afs_socket;
  
        valid_fd_012();
 -      init_random_seed();
 +      init_random_seed_or_die();
        /* parse command line options */
        server_cmdline_parser_ext(argc, argv, &conf, &params);
        HANDLE_VERSION_FLAG("server", conf);