]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - afs.c
afs.cmd: Add documentation of addatt, touch.
[paraslash.git] / afs.c
diff --git a/afs.c b/afs.c
index a7778a5854ce782221cc7090b09eaa1a07e62049..6d51d4f58ad9f35a3a79b03d41cbd90b6a85b418 100644 (file)
--- a/afs.c
+++ b/afs.c
@@ -174,15 +174,13 @@ int send_callback_request(callback_function *f, struct osl_object *query,
        ret = init_unix_addr(&unix_addr, conf.afs_socket_arg);
        if (ret < 0)
                goto out;
-       ret = -E_CONNECT;
-       if (connect(fd, (struct sockaddr *)&unix_addr, sizeof(unix_addr)) < 0) /* FIXME: Use para_connect() */
+       ret = PARA_CONNECT(fd, &unix_addr);
+       if (ret < 0)
                goto out;
        ret = send_bin_buffer(fd, buf, sizeof(buf));
-       PARA_NOTICE_LOG("bin buffer ret: %d\n", ret);
        if (ret < 0)
                goto out;
        ret = recv_bin_buffer(fd, buf, sizeof(buf));
-       PARA_NOTICE_LOG("ret: %d\n", ret);
        if (ret < 0)
                goto out;
        if (ret != sizeof(int)) {
@@ -190,7 +188,6 @@ int send_callback_request(callback_function *f, struct osl_object *query,
                goto out;
        }
        ret = *(int *) buf;
-       PARA_NOTICE_LOG("result_shmid: %d\n", ret);
        if (ret <= 0)
                goto out;
        result_shmid = ret;
@@ -214,7 +211,7 @@ out:
                PARA_ERROR_LOG("%s\n", "shm destroy error");
        if (fd >= 0)
                close(fd);
-       PARA_DEBUG_LOG("callback_ret: %d\n", ret);
+//     PARA_DEBUG_LOG("callback_ret: %d\n", ret);
        return ret;
 }
 
@@ -336,41 +333,33 @@ out:
 
 
 /*
- * write input from fd to dynamically allocated char array,
- * but maximal max_size byte. Return size.
+ * write input from fd to dynamically allocated buffer,
+ * but maximal max_size byte.
  */
-static int fd2buf(int fd, char **buf, int max_size)
+static int fd2buf(int fd, unsigned max_size, struct osl_object *obj)
 {
        const size_t chunk_size = 1024;
-       size_t size = 2048;
-       char *p;
+       size_t size = 2048, received = 0;
        int ret;
+       char *buf = para_malloc(size);
 
-       *buf = para_malloc(size * sizeof(char));
-       p = *buf;
-       while ((ret = read(fd, p, chunk_size)) > 0) {
-               p += ret;
-               if ((p - *buf) + chunk_size >= size) {
-                       char *tmp;
-
+       for (;;) {
+               ret = recv_bin_buffer(fd, buf + received, chunk_size);
+               if (ret <= 0)
+                       break;
+               received += ret;
+               if (received + chunk_size >= size) {
                        size *= 2;
-                       if (size > max_size) {
-                               ret = -E_INPUT_TOO_LARGE;
-                               goto out;
-                       }
-                       tmp = para_realloc(*buf, size);
-                       p = (p - *buf) + tmp;
-                       *buf = tmp;
+                       ret = -E_INPUT_TOO_LARGE;
+                       if (size > max_size)
+                               break;
+                       buf = para_realloc(buf, size);
                }
        }
-       if (ret < 0) {
-               ret = -E_READ;
-               goto out;
-       }
-       ret = p - *buf;
-out:
-       if (ret < 0 && *buf)
-               free(*buf);
+       obj->data = buf;
+       obj->size = received;
+       if (ret < 0)
+               free(buf);
        return ret;
 }
 
@@ -391,22 +380,23 @@ out:
  * \return Negative on errors, the return value of the underlying call to
  * send_callback_request() otherwise.
  */
-int stdin_command(struct osl_object *arg_obj, callback_function *f,
+int stdin_command(int fd, struct osl_object *arg_obj, callback_function *f,
                unsigned max_len, struct osl_object *result)
 {
-       char *stdin_buf;
-       size_t stdin_len;
-       struct osl_object query;
-       int ret = fd2buf(STDIN_FILENO, &stdin_buf, max_len);
+       struct osl_object query, stdin_obj;
+       int ret;
 
+       ret = send_buffer(fd, AWAITING_DATA_MSG);
        if (ret < 0)
                return ret;
-       stdin_len = ret;
-       query.size = arg_obj->size + stdin_len;
+       ret = fd2buf(fd, max_len, &stdin_obj);
+       if (ret < 0)
+               return ret;
+       query.size = arg_obj->size + stdin_obj.size;
        query.data = para_malloc(query.size);
        memcpy(query.data, arg_obj->data, arg_obj->size);
-       memcpy((char *)query.data + arg_obj->size, stdin_buf, stdin_len);
-       free(stdin_buf);
+       memcpy((char *)query.data + arg_obj->size, stdin_obj.data, stdin_obj.size);
+       free(stdin_obj.data);
        ret = send_callback_request(f, &query, result);
        free(query.data);
        return ret;
@@ -673,36 +663,29 @@ static void command_post_select(struct sched *s, struct task *t)
        t->ret = recv_bin_buffer(fd, buf, sizeof(buf));
        if (t->ret < 0) {
                PARA_NOTICE_LOG("%s (%d)\n", PARA_STRERROR(-t->ret), t->ret);
-               t->ret = 1;
                goto out;
        }
        if (t->ret != sizeof(buf)) {
                PARA_NOTICE_LOG("short read (%d bytes, expected %lu)\n",
                        t->ret, (long unsigned) sizeof(buf));
-               t->ret = 1;
                goto out;
        }
        cookie = *(uint32_t *)buf;
        if (cookie != ct->cookie) {
                PARA_NOTICE_LOG("received invalid cookie(got %u, expected %u)\n",
                        (unsigned)cookie, (unsigned)ct->cookie);
-               t->ret = 1;
                goto out;
        }
        query_shmid = *(int *)(buf + sizeof(cookie));
        if (query_shmid < 0) {
                PARA_WARNING_LOG("received invalid query shmid %d)\n",
                        query_shmid);
-               t->ret = 1;
-               goto out;
-       }
-       t->ret = call_callback(fd, query_shmid);
-       if (t->ret < 0) {
-               PARA_NOTICE_LOG("%s\n", PARA_STRERROR(-t->ret));
-               t->ret = 1;
                goto out;
        }
+       /* Ignore return value: Errors might be ok here. */
+       call_callback(fd, query_shmid);
 out:
+       t->ret = 1;
        close(fd);
 }
 
@@ -805,6 +788,9 @@ __noreturn int afs_init(uint32_t cookie, int socket_fd)
                exit(EXIT_FAILURE);
        }
        server_socket = socket_fd;
+       ret = mark_fd_nonblock(server_socket);
+       if (ret < 0)
+               exit(EXIT_FAILURE);
        PARA_INFO_LOG("server_socket: %d, afs_socket_cookie: %u\n",
                server_socket, (unsigned) cookie);
        current_play_mode = init_admissible_files();