1*4fe996c2SAndrew Jeffery // SPDX-License-Identifier: Apache-2.0 2*4fe996c2SAndrew Jeffery // Copyright (C) 2018 IBM Corp. 341f211bcSAndrew Jeffery #define _GNU_SOURCE 441f211bcSAndrew Jeffery #include <stdbool.h> 541f211bcSAndrew Jeffery #include <stdio.h> 641f211bcSAndrew Jeffery #include <string.h> 741f211bcSAndrew Jeffery 841f211bcSAndrew Jeffery #include "common.h" 941f211bcSAndrew Jeffery is_pnor_part(const char * str)1041f211bcSAndrew Jefferystatic bool is_pnor_part(const char *str) 1141f211bcSAndrew Jeffery { 1241f211bcSAndrew Jeffery return strcasestr(str, "pnor") != NULL; 1341f211bcSAndrew Jeffery } 1441f211bcSAndrew Jeffery get_dev_mtd(void)1541f211bcSAndrew Jefferychar *get_dev_mtd(void) 1641f211bcSAndrew Jeffery { 1741f211bcSAndrew Jeffery FILE *f; 1841f211bcSAndrew Jeffery char *ret = NULL, *pos = NULL; 1941f211bcSAndrew Jeffery char line[255]; 2041f211bcSAndrew Jeffery 2141f211bcSAndrew Jeffery f = fopen("/proc/mtd", "r"); 2241f211bcSAndrew Jeffery if (!f) 2341f211bcSAndrew Jeffery return NULL; 2441f211bcSAndrew Jeffery 2541f211bcSAndrew Jeffery while (!pos && fgets(line, sizeof(line), f) != NULL) { 2641f211bcSAndrew Jeffery /* Going to have issues if we didn't get the full line */ 2741f211bcSAndrew Jeffery if (line[strlen(line) - 1] != '\n') 2841f211bcSAndrew Jeffery break; 2941f211bcSAndrew Jeffery 3041f211bcSAndrew Jeffery if (is_pnor_part(line)) { 3141f211bcSAndrew Jeffery pos = strchr(line, ':'); 3241f211bcSAndrew Jeffery if (!pos) 3341f211bcSAndrew Jeffery break; 3441f211bcSAndrew Jeffery } 3541f211bcSAndrew Jeffery } 3641f211bcSAndrew Jeffery fclose(f); 3741f211bcSAndrew Jeffery 3841f211bcSAndrew Jeffery if (pos) { 3941f211bcSAndrew Jeffery *pos = '\0'; 4041f211bcSAndrew Jeffery if (asprintf(&ret, "/dev/%s", line) == -1) 4141f211bcSAndrew Jeffery ret = NULL; 4241f211bcSAndrew Jeffery } 4341f211bcSAndrew Jeffery 4441f211bcSAndrew Jeffery return ret; 4541f211bcSAndrew Jeffery } 46