/*
 * Created by jiaqiang.ye@lnxall.com
 *
 * set_facini for EM1000 device
 *
 * 2023/10/31
 */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#include "nvmem.h"
#include "lnxall_facini.h"

int main(int argc, char *argv[])
{
	nvmem_t * pnv;
	int offs, num, update, ret;
	struct lnxall_facini * pfi;

	ret = 0;
	num = 0x1;
	pfi = NULL;
	update = 0;
	pnv = nvmem_create();
	if (pnv == NULL) {
		fputs("Error, nvmem_create has failed.\n", stderr);
		fflush(stderr);
		return 1;
	}

	nvmem_init(pnv, NULL);

	pfi = (struct lnxall_facini *) malloc(sizeof(*pfi));
	if (pfi == NULL) {
		fputs("Error, system out of memory!\n", stderr);
		fflush(stderr);
		nvmem_free(pnv);
		return 2;
	}

	offs = facini_find(pnv, pfi);
	if (offs < 0) {
		offs = 0;
		memset(pfi, 0, sizeof(*pfi));
	}

	for (num = 0x1; num < argc; num++) {
		const char * val = NULL;
		const char * env = argv[num++];

		if (num < argc)
			val = argv[num];
		if (val == NULL) {
			fprintf(stderr, "Error, no value specified for '%s'\n", env);
			fflush(stderr);
			break;
		}

		update++;
		if (strcasecmp(env, "sn") == 0) {
			strncpy(pfi->sn, val, FACINI_SN_LEN - 1);
			pfi->sn[FACINI_SN_LEN - 1] = '\0';
		} else if (strcasecmp(env, "mac") == 0) {
			strncpy(pfi->mac, val, FACINI_MAC_LEN - 1);
			pfi->mac[FACINI_MAC_LEN - 1] = '\0';
		} else if (strcasecmp(env, "date") == 0) {
			strncpy(pfi->date, val, FACINI_DATE_LEN - 1);
			pfi->date[FACINI_DATE_LEN - 1] = '\0';
		} else if (strcasecmp(env, "hwver") == 0) {
			strncpy(pfi->hwver, val, FACINI_HWVER_LEN - 1);
			pfi->hwver[FACINI_HWVER_LEN - 1] = '\0';
		} else if (strcasecmp(env, "product") == 0) {
			strncpy(pfi->product, val, FACINI_PRODUCT_LEN - 1);
			pfi->product[FACINI_PRODUCT_LEN - 1] = '\0';
		} else {
			fprintf(stderr, "Error, unknown ENV: %s\n", env);
			fflush(stderr);
			update--;
		}
	}

	if (update) {
		facini_checksum(pfi);
		ret = facini_write(pnv, offs, pfi);
		if (ret < 0) {
			fprintf(stderr, "Error, factory information write has failed: %d\n", ret);
			fflush(stderr);
			ret = 1;
		} else if (ret != offs) {
			fprintf(stderr, "Warning, factory information written to new location: %d\n", ret);
			fflush(stderr);
			ret = 0;
		} else
			ret = 0;
	}

	free(pfi);
	nvmem_free(pnv);
	return ret;
}
