Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 026ddde6 authored by Tom Cherry's avatar Tom Cherry
Browse files

liblog: remove the rest of the log reader transport

This is simplified down to the point there are only two branches that
need to be made, so remove the rest of the transport structs and
simply branch where needed.

Test: liblog-unit-tests
Change-Id: Ic82e7e70eb7b4e40b381a4d8066629c5b7d4f827
parent 7d16aedc
Loading
Loading
Loading
Loading
+9 −43
Original line number Diff line number Diff line
@@ -14,6 +14,8 @@
 * limitations under the License.
 */

#include "logd_reader.h"

#include <errno.h>
#include <fcntl.h>
#include <inttypes.h>
@@ -35,39 +37,8 @@
#include <private/android_filesystem_config.h>
#include <private/android_logger.h>

#include "log_portability.h"
#include "logd_reader.h"
#include "logger.h"

static int LogdAvailable(log_id_t LogId);
static int LogdRead(struct logger_list* logger_list, struct android_log_transport_context* transp,
                    struct log_msg* log_msg);
static void LogdClose(struct logger_list* logger_list,
                      struct android_log_transport_context* transp);

struct android_log_transport_read logdLoggerRead = {
    .name = "logd",
    .available = LogdAvailable,
    .close = LogdClose,
    .read = LogdRead,
};

static int LogdAvailable(log_id_t logId) {
  if (logId >= LOG_ID_MAX) {
    return -EINVAL;
  }
  if (logId == LOG_ID_SECURITY) {
    uid_t uid = __android_log_uid();
    if (uid != AID_SYSTEM) {
      return -EPERM;
    }
  }
  if (access("/dev/socket/logdw", W_OK) == 0) {
    return 0;
  }
  return -EBADF;
}

// Connects to /dev/socket/<name> and returns the associated fd or returns -1 on error.
// O_CLOEXEC is always set.
static int socket_local_client(const std::string& name, int type) {
@@ -296,15 +267,11 @@ int android_logger_set_prune_list(struct logger_list* logger_list, char* buf, si
  return check_log_success(buf, SendLogdControlMessage(buf, len));
}

static int logdOpen(struct logger_list* logger_list, struct android_log_transport_context* transp) {
static int logdOpen(struct logger_list* logger_list) {
  char buffer[256], *cp, c;
  int ret, remaining, sock;

  if (!logger_list) {
    return -EINVAL;
  }

  sock = atomic_load(&transp->context.sock);
  sock = atomic_load(&logger_list->fd);
  if (sock > 0) {
    return sock;
  }
@@ -377,7 +344,7 @@ static int logdOpen(struct logger_list* logger_list, struct android_log_transpor
    return ret;
  }

  ret = atomic_exchange(&transp->context.sock, sock);
  ret = atomic_exchange(&logger_list->fd, sock);
  if ((ret > 0) && (ret != sock)) {
    close(ret);
  }
@@ -385,9 +352,8 @@ static int logdOpen(struct logger_list* logger_list, struct android_log_transpor
}

/* Read from the selected logs */
static int LogdRead(struct logger_list* logger_list, struct android_log_transport_context* transp,
                    struct log_msg* log_msg) {
  int ret = logdOpen(logger_list, transp);
int LogdRead(struct logger_list* logger_list, struct log_msg* log_msg) {
  int ret = logdOpen(logger_list);
  if (ret < 0) {
    return ret;
  }
@@ -407,8 +373,8 @@ static int LogdRead(struct logger_list* logger_list, struct android_log_transpor
}

/* Close all the logs */
static void LogdClose(struct logger_list*, struct android_log_transport_context* transp) {
  int sock = atomic_exchange(&transp->context.sock, -1);
void LogdClose(struct logger_list* logger_list) {
  int sock = atomic_exchange(&logger_list->fd, -1);
  if (sock > 0) {
    close(sock);
  }
+4 −0
Original line number Diff line number Diff line
@@ -18,10 +18,14 @@

#include <unistd.h>

#include "log/log_read.h"
#include "log_portability.h"

__BEGIN_DECLS

int LogdRead(struct logger_list* logger_list, struct log_msg* log_msg);
void LogdClose(struct logger_list* logger_list);

ssize_t SendLogdControlMessage(char* buf, size_t buf_size);

__END_DECLS
+1 −25
Original line number Diff line number Diff line
@@ -46,32 +46,8 @@ struct android_log_transport_write {
               size_t nr);
};

struct android_log_transport_context;

struct android_log_transport_read {
  const char* name; /* human name to describe the transport */

  /* Does not cause resources to be taken */
  int (*available)(log_id_t logId);
  /* Release resources taken by the following interfaces */
  void (*close)(struct logger_list* logger_list, struct android_log_transport_context* transp);
  /*
   * Expect all to instantiate open automagically on any call,
   * so we do not have an explicit open call.
   */
  int (*read)(struct logger_list* logger_list, struct android_log_transport_context* transp,
              struct log_msg* log_msg);
};

struct android_log_transport_context {
  union android_log_context_union context; /* zero init per-transport context */

  struct android_log_transport_read* transport;
};

struct logger_list {
  android_log_transport_context transport_context;
  bool transport_initialized;
  atomic_int fd;
  int mode;
  unsigned int tail;
  log_time start;
+17 −16
Original line number Diff line number Diff line
@@ -31,7 +31,9 @@
#include <private/android_filesystem_config.h>

#include "log_portability.h"
#include "logd_reader.h"
#include "logger.h"
#include "pmsg_reader.h"

/* method for getting the associated sublog id */
log_id_t android_logger_get_id(struct logger* logger) {
@@ -50,14 +52,6 @@ static struct logger_list* android_logger_list_alloc_internal(int mode, unsigned
  logger_list->tail = tail;
  logger_list->pid = pid;

#if (FAKE_LOG_DEVICE == 0)
  extern struct android_log_transport_read logdLoggerRead;
  extern struct android_log_transport_read pmsgLoggerRead;

  logger_list->transport_context.transport =
      (mode & ANDROID_LOG_PSTORE) ? &pmsgLoggerRead : &logdLoggerRead;
#endif

  return logger_list;
}

@@ -100,14 +94,19 @@ struct logger_list* android_logger_list_open(log_id_t logId, int mode, unsigned
}

int android_logger_list_read(struct logger_list* logger_list, struct log_msg* log_msg) {
  if (logger_list == nullptr || logger_list->transport_context.transport == nullptr ||
      logger_list->log_mask == 0) {
  if (logger_list == nullptr || logger_list->log_mask == 0) {
    return -EINVAL;
  }

  android_log_transport_context* transp = &logger_list->transport_context;
  int ret = 0;

  int ret = (*transp->transport->read)(logger_list, transp, log_msg);
#if (FAKE_LOG_DEVICE == 0)
  if (logger_list->mode & ANDROID_LOG_PSTORE) {
    ret = PmsgRead(logger_list, log_msg);
  } else {
    ret = LogdRead(logger_list, log_msg);
  }
#endif

  if (ret <= 0) {
    return ret;
@@ -138,11 +137,13 @@ void android_logger_list_free(struct logger_list* logger_list) {
    return;
  }

  android_log_transport_context* transport_context = &logger_list->transport_context;

  if (transport_context->transport && transport_context->transport->close) {
    (*transport_context->transport->close)(logger_list, transport_context);
#if (FAKE_LOG_DEVICE == 0)
  if (logger_list->mode & ANDROID_LOG_PSTORE) {
    PmsgClose(logger_list);
  } else {
    LogdClose(logger_list);
  }
#endif

  free(logger_list);
}
+13 −37
Original line number Diff line number Diff line
@@ -14,6 +14,8 @@
 * limitations under the License.
 */

#include "pmsg_reader.h"

#include <ctype.h>
#include <errno.h>
#include <fcntl.h>
@@ -26,31 +28,7 @@

#include "logger.h"

static int PmsgAvailable(log_id_t logId);
static int PmsgRead(struct logger_list* logger_list, struct android_log_transport_context* transp,
                    struct log_msg* log_msg);
static void PmsgClose(struct logger_list* logger_list,
                      struct android_log_transport_context* transp);

struct android_log_transport_read pmsgLoggerRead = {
    .name = "pmsg",
    .available = PmsgAvailable,
    .close = PmsgClose,
    .read = PmsgRead,
};

static int PmsgAvailable(log_id_t logId) {
  if (logId > LOG_ID_SECURITY) {
    return -EINVAL;
  }
  if (access("/dev/pmsg0", W_OK) == 0) {
    return 0;
  }
  return -EBADF;
}

static int PmsgRead(struct logger_list* logger_list, struct android_log_transport_context* transp,
                    struct log_msg* log_msg) {
int PmsgRead(struct logger_list* logger_list, struct log_msg* log_msg) {
  ssize_t ret;
  off_t current, next;
  struct __attribute__((__packed__)) {
@@ -62,7 +40,7 @@ static int PmsgRead(struct logger_list* logger_list, struct android_log_transpor

  memset(log_msg, 0, sizeof(*log_msg));

  if (atomic_load(&transp->context.fd) <= 0) {
  if (atomic_load(&logger_list->fd) <= 0) {
    int i, fd = open("/sys/fs/pstore/pmsg-ramoops-0", O_RDONLY | O_CLOEXEC);

    if (fd < 0) {
@@ -75,7 +53,7 @@ static int PmsgRead(struct logger_list* logger_list, struct android_log_transpor
        return -errno;
      }
    }
    i = atomic_exchange(&transp->context.fd, fd);
    i = atomic_exchange(&logger_list->fd, fd);
    if ((i > 0) && (i != fd)) {
      close(i);
    }
@@ -86,7 +64,7 @@ static int PmsgRead(struct logger_list* logger_list, struct android_log_transpor
    int fd;

    if (preread_count < sizeof(buf)) {
      fd = atomic_load(&transp->context.fd);
      fd = atomic_load(&logger_list->fd);
      if (fd <= 0) {
        return -EBADF;
      }
@@ -120,7 +98,7 @@ static int PmsgRead(struct logger_list* logger_list, struct android_log_transpor
        (!logger_list->pid || (logger_list->pid == buf.p.pid))) {
      char* msg = log_msg->entry.msg;
      *msg = buf.prio;
      fd = atomic_load(&transp->context.fd);
      fd = atomic_load(&logger_list->fd);
      if (fd <= 0) {
        return -EBADF;
      }
@@ -144,7 +122,7 @@ static int PmsgRead(struct logger_list* logger_list, struct android_log_transpor
      return ret + sizeof(buf.prio) + log_msg->entry.hdr_size;
    }

    fd = atomic_load(&transp->context.fd);
    fd = atomic_load(&logger_list->fd);
    if (fd <= 0) {
      return -EBADF;
    }
@@ -152,7 +130,7 @@ static int PmsgRead(struct logger_list* logger_list, struct android_log_transpor
    if (current < 0) {
      return -errno;
    }
    fd = atomic_load(&transp->context.fd);
    fd = atomic_load(&logger_list->fd);
    if (fd <= 0) {
      return -EBADF;
    }
@@ -166,8 +144,8 @@ static int PmsgRead(struct logger_list* logger_list, struct android_log_transpor
  }
}

static void PmsgClose(struct logger_list*, struct android_log_transport_context* transp) {
  int fd = atomic_exchange(&transp->context.fd, 0);
void PmsgClose(struct logger_list* logger_list) {
  int fd = atomic_exchange(&logger_list->fd, 0);
  if (fd > 0) {
    close(fd);
  }
@@ -185,7 +163,6 @@ ssize_t __android_log_pmsg_file_read(log_id_t logId, char prio, const char* pref
                                     __android_log_pmsg_file_read_fn fn, void* arg) {
  ssize_t ret;
  struct logger_list logger_list;
  struct android_log_transport_context transp;
  struct content {
    struct listnode node;
    struct logger_entry entry;
@@ -207,7 +184,6 @@ ssize_t __android_log_pmsg_file_read(log_id_t logId, char prio, const char* pref

  /* Add just enough clues in logger_list and transp to make API function */
  memset(&logger_list, 0, sizeof(logger_list));
  memset(&transp, 0, sizeof(transp));

  logger_list.mode = ANDROID_LOG_PSTORE | ANDROID_LOG_NONBLOCK | ANDROID_LOG_RDONLY;
  logger_list.log_mask = (unsigned)-1;
@@ -241,7 +217,7 @@ ssize_t __android_log_pmsg_file_read(log_id_t logId, char prio, const char* pref

  /* Read the file content */
  log_msg log_msg;
  while (PmsgRead(&logger_list, &transp, &log_msg) > 0) {
  while (PmsgRead(&logger_list, &log_msg) > 0) {
    const char* cp;
    size_t hdr_size = log_msg.entry.hdr_size;

@@ -399,7 +375,7 @@ ssize_t __android_log_pmsg_file_read(log_id_t logId, char prio, const char* pref
    }
    list_add_head(node, &content->node);
  }
  PmsgClose(&logger_list, &transp);
  PmsgClose(&logger_list);

  /* Progress through all the collected files */
  list_for_each_safe(node, n, &name_list) {
Loading