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

Commit 40239389 authored by Tom Cherry's avatar Tom Cherry Committed by Gerrit Code Review
Browse files

Merge "liblog: remove the rest of the log reader transport"

parents 332f99a7 026ddde6
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;
  }
@@ -405,8 +371,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