1/* 2 * patch-cmdline.c - patch the kernel command line on rb532 3 * 4 * Copyright (C) 2006 Felix Fietkau <nbd@openwrt.org> 5 * 6 * This program is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU General Public License 8 * as published by the Free Software Foundation; either version 2 9 * of the License, or (at your option) any later version. 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with this program; if not, write to the Free Software 18 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 19 * 20 */ 21 22#include <stdio.h> 23#include <stdlib.h> 24#include <stddef.h> 25#include <unistd.h> 26#include <fcntl.h> 27#include <sys/mman.h> 28#include <sys/stat.h> 29#include <string.h> 30 31#define SEARCH_SPACE (16 * 1024) 32#define CMDLINE_MAX 512 33 34int main(int argc, char **argv) 35{ 36 int fd, found = 0, len, ret = -1; 37 char *ptr, *p; 38 39 if (argc != 3) { 40 fprintf(stderr, "Usage: %s <file> <cmdline>\n", argv[0]); 41 goto err1; 42 } 43 len = strlen(argv[2]); 44 if (len + 9 > CMDLINE_MAX) { 45 fprintf(stderr, "Command line string too long\n"); 46 goto err1; 47 } 48 49 if (((fd = open(argv[1], O_RDWR)) < 0) || 50 (ptr = (char *) mmap(0, SEARCH_SPACE + CMDLINE_MAX, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0)) == (void *) (-1)) { 51 fprintf(stderr, "Could not open kernel image"); 52 goto err2; 53 } 54 55 for (p = ptr; p < (ptr + SEARCH_SPACE); p += 4) { 56 if (memcmp(p, "CMDLINE:", 8) == 0) { 57 found = 1; 58 p += 8; 59 break; 60 } 61 } 62 if (!found) { 63 fprintf(stderr, "Command line marker not found!\n"); 64 goto err3; 65 } 66 67 memset(p, 0, CMDLINE_MAX - 8); 68 strcpy(p, argv[2]); 69 msync(p, CMDLINE_MAX, MS_SYNC|MS_INVALIDATE); 70 ret = 0; 71 72err3: 73 munmap((void *) ptr, len); 74err2: 75 if (fd > 0) 76 close(fd); 77err1: 78 return ret; 79} 80