]> source.dussan.org Git - rspamd.git/commitdiff
Add offset support to aio operations.
authorVsevolod Stakhov <vsevolod@rambler-co.ru>
Sun, 11 Mar 2012 12:01:20 +0000 (16:01 +0400)
committerVsevolod Stakhov <vsevolod@rambler-co.ru>
Sun, 11 Mar 2012 12:01:20 +0000 (16:01 +0400)
src/aio_event.c
src/aio_event.h

index c171fece53a9961b254b45434b1f87409bae6159..dc1d8284a237786a1d196ea779e49effcacc5dac 100644 (file)
@@ -302,7 +302,7 @@ rspamd_aio_open (struct aio_context *ctx, const gchar *path, int flags)
  * Asynchronous read of file
  */
 gint
-rspamd_aio_read (gint fd, gpointer buf, gsize len, struct aio_context *ctx, rspamd_aio_cb cb, gpointer ud)
+rspamd_aio_read (gint fd, gpointer buf, gsize len, off_t offset, struct aio_context *ctx, rspamd_aio_cb cb, gpointer ud)
 {
        struct io_cbdata                                                        *cbdata;
        gint                                                                             r = -1;
@@ -325,7 +325,7 @@ rspamd_aio_read (gint fd, gpointer buf, gsize len, struct aio_context *ctx, rspa
                iocb[0]->aio_reqprio = 0;
                iocb[0]->aio_buf = (guint64)((uintptr_t)buf);
                iocb[0]->aio_nbytes = len;
-               iocb[0]->aio_offset = 0;
+               iocb[0]->aio_offset = offset;
                iocb[0]->aio_flags |= (1 << 0) /* IOCB_FLAG_RESFD */;
                iocb[0]->aio_resfd = ctx->event_fd;
                iocb[0]->aio_data = (guint64)((uintptr_t)cbdata);
@@ -348,12 +348,15 @@ rspamd_aio_read (gint fd, gpointer buf, gsize len, struct aio_context *ctx, rspa
        else {
                /* Blocking variant */
 blocking:
-               r = read (fd, buf, len);
-               if (r >= 0) {
-                       cb (fd, 0, r, buf, ud);
-               }
-               else {
-                       cb (fd, r, -1, buf, ud);
+               r = lseek (fd, offset, SEEK_SET);
+               if (r > 0) {
+                       r = read (fd, buf, len);
+                       if (r >= 0) {
+                               cb (fd, 0, r, buf, ud);
+                       }
+                       else {
+                               cb (fd, r, -1, buf, ud);
+                       }
                }
        }
 
@@ -364,7 +367,7 @@ blocking:
  * Asynchronous write of file
  */
 gint
-rspamd_aio_write (gint fd, gpointer buf, gsize len, struct aio_context *ctx, rspamd_aio_cb cb, gpointer ud)
+rspamd_aio_write (gint fd, gpointer buf, gsize len, off_t offset, struct aio_context *ctx, rspamd_aio_cb cb, gpointer ud)
 {
        struct io_cbdata                                                        *cbdata;
        gint                                                                             r = -1;
@@ -387,7 +390,7 @@ rspamd_aio_write (gint fd, gpointer buf, gsize len, struct aio_context *ctx, rsp
                iocb[0]->aio_reqprio = 0;
                iocb[0]->aio_buf = (guint64)((uintptr_t)buf);
                iocb[0]->aio_nbytes = len;
-               iocb[0]->aio_offset = 0;
+               iocb[0]->aio_offset = offset;
                iocb[0]->aio_flags |= (1 << 0) /* IOCB_FLAG_RESFD */;
                iocb[0]->aio_resfd = ctx->event_fd;
                iocb[0]->aio_data = (guint64)((uintptr_t)cbdata);
@@ -410,12 +413,15 @@ rspamd_aio_write (gint fd, gpointer buf, gsize len, struct aio_context *ctx, rsp
        else {
                /* Blocking variant */
 blocking:
-               r = write (fd, buf, len);
-               if (r >= 0) {
-                       cb (fd, 0, r, buf, ud);
-               }
-               else {
-                       cb (fd, r, -1, buf, ud);
+               r = lseek (fd, offset, SEEK_SET);
+               if (r > 0) {
+                       r = write (fd, buf, len);
+                       if (r >= 0) {
+                               cb (fd, 0, r, buf, ud);
+                       }
+                       else {
+                               cb (fd, r, -1, buf, ud);
+                       }
                }
        }
 
index 7350d102e74f9ccfb0286197e176c0518e58cb6f..7fcb69469d04e75f41e53b2c7cb9e475e988fdd1 100644 (file)
@@ -50,12 +50,14 @@ gint rspamd_aio_open (struct aio_context *ctx, const gchar *path, int flags);
 /**
  * Asynchronous read of file
  */
-gint rspamd_aio_read (gint fd, gpointer buf, gsize len, struct aio_context *ctx, rspamd_aio_cb cb, gpointer ud);
+gint rspamd_aio_read (gint fd, gpointer buf, gsize len, off_t offset,
+               struct aio_context *ctx, rspamd_aio_cb cb, gpointer ud);
 
 /**
  * Asynchronous write of file
  */
-gint rspamd_aio_write (gint fd, gpointer buf, gsize len, struct aio_context *ctx, rspamd_aio_cb cb, gpointer ud);
+gint rspamd_aio_write (gint fd, gpointer buf, gsize len, off_t offset,
+               struct aio_context *ctx, rspamd_aio_cb cb, gpointer ud);
 
 /**
  * Close of aio operations