acrn-hypervisor/misc/tools/acrn-crashlog/acrnprobe/vmrecord.c
Terry Zou a9c38a5cfb HV:Acrn-hypvervisor Root Directory Clean-up and create misc/ folder for Acrn daemons, services and tools.
This patch is to clean-up acrn-hypervisor root directory, targt only 5 folders under acrn-hypervisor:1.hypervisor,2.devicemodel,3.misc,4.doc,5.build

Tracked-On: #3482
Signed-off-by: Terry Zou <terry.zou@intel.com>
Acked-by: Eddie Dong <eddie.dong@intel.com>
2019-07-29 22:58:24 +08:00

172 lines
4.1 KiB
C

/*
* Copyright (C) 2018 Intel Corporation
* SPDX-License-Identifier: BSD-3-Clause
*/
#include "log_sys.h"
#include "fsutils.h"
#include "strutils.h"
#include "vmrecord.h"
#include <stdlib.h>
int vmrecord_last(struct vmrecord_t *vmrecord, const char *vm_name,
size_t nlen, char *vmkey, size_t ksize)
{
int res;
char *p;
char *key;
if (!vmrecord || !vm_name || !nlen || !vmkey || !ksize)
return -1;
key = malloc(nlen + 2);
if (!key)
return -1;
memcpy(key, vm_name, nlen);
key[nlen] = ' ';
key[nlen + 1] = '\0';
pthread_mutex_lock(&vmrecord->mtx);
res = file_read_key_value_r(vmkey, ksize, vmrecord->path, key,
nlen + 1);
pthread_mutex_unlock(&vmrecord->mtx);
free(key);
if (res < 0) {
LOGE("failed to search %s, %s\n", vmrecord->path,
strerror(errno));
return -1;
}
p = strchr(vmkey, ' ');
if (p)
*p = 0;
return 0;
}
/* This function must be called with holding vmrecord mutex */
int vmrecord_mark(struct vmrecord_t *vmrecord, const char *vmkey,
size_t klen, enum vmrecord_mark_t type)
{
size_t len;
char *line;
char *tag;
if (!vmrecord || !vmrecord->recos || !vmkey || !klen)
return -1;
line = get_line(vmkey, klen, vmrecord->recos->begin,
vmrecord->recos->size, vmrecord->recos->begin, &len);
if (!line)
return -1;
tag = line + len - VMRECORD_TAG_LEN;
if (type == SUCCESS)
memcpy(tag, VMRECORD_TAG_SUCCESS, VMRECORD_TAG_LEN);
else if (type == NOT_FOUND)
memcpy(tag, VMRECORD_TAG_NOT_FOUND, VMRECORD_TAG_LEN);
else if (type == MISS_LOG)
memcpy(tag, VMRECORD_TAG_MISS_LOG, VMRECORD_TAG_LEN);
else if (type == WAITING_SYNC)
memcpy(tag, VMRECORD_TAG_WAITING_SYNC, VMRECORD_TAG_LEN);
else if (type == ON_GOING)
memcpy(tag, VMRECORD_TAG_ON_GOING, VMRECORD_TAG_LEN);
else if (type == NO_RESRC)
memcpy(tag, VMRECORD_TAG_NO_RESOURCE, VMRECORD_TAG_LEN);
else
return -1;
return 0;
}
int vmrecord_open_mark(struct vmrecord_t *vmrecord, const char *vmkey,
size_t klen, enum vmrecord_mark_t type)
{
int ret;
if (!vmrecord || !vmkey || !klen)
return -1;
pthread_mutex_lock(&vmrecord->mtx);
vmrecord->recos = mmap_file(vmrecord->path);
if (!vmrecord->recos) {
LOGE("failed to mmap %s, %s\n", vmrecord->path,
strerror(errno));
ret = -1;
goto unlock;
}
if (!vmrecord->recos->size ||
mm_count_lines(vmrecord->recos) < VMRECORD_HEAD_LINES) {
LOGE("(%s) invalid\n", vmrecord->path);
ret = -1;
goto out;
}
ret = vmrecord_mark(vmrecord, vmkey, klen, type);
out:
unmap_file(vmrecord->recos);
unlock:
pthread_mutex_unlock(&vmrecord->mtx);
return ret;
}
int vmrecord_gen_ifnot_exists(struct vmrecord_t *vmrecord)
{
const char * const head =
"/* DONT EDIT!\n"
" * This file records VM id synced or about to be synched,\n"
" * the tag:\n"
" * \"<==\" indicates event waiting to sync.\n"
" * \"NOT_FOUND\" indicates event not found in UOS.\n"
" * \"MISS_LOGS\" indicates event miss logs in UOS.\n"
" * \"ON_GOING\" indicates event is under syncing.\n"
" * \"NO_RESORC\" indicates no enough resources in SOS.\n"
" */\n\n";
if (!vmrecord) {
LOGE("vmrecord was not initialized\n");
return -1;
}
pthread_mutex_lock(&vmrecord->mtx);
if (!file_exists(vmrecord->path)) {
if (overwrite_file(vmrecord->path, head) < 0) {
pthread_mutex_unlock(&vmrecord->mtx);
LOGE("failed to create file (%s), %s\n",
vmrecord->path, strerror(errno));
return -1;
}
}
pthread_mutex_unlock(&vmrecord->mtx);
return 0;
}
int vmrecord_new(struct vmrecord_t *vmrecord, const char *vm_name,
const char *key)
{
char log_new[64];
int nlen;
if (!vmrecord || !vm_name || !key)
return -1;
nlen = snprintf(log_new, sizeof(log_new), "%s %s %s\n",
vm_name, key, VMRECORD_TAG_WAITING_SYNC);
if (s_not_expect(nlen, sizeof(log_new))) {
LOGE("failed to construct record, key (%s)\n", key);
return -1;
}
pthread_mutex_lock(&vmrecord->mtx);
if (append_file(vmrecord->path, log_new, strnlen(log_new, 64)) < 0) {
pthread_mutex_unlock(&vmrecord->mtx);
LOGE("failed to append file (%s), %s\n", vmrecord->path,
strerror(errno));
return -1;
}
pthread_mutex_unlock(&vmrecord->mtx);
return 0;
}