El kernel de linux nos provee de algunas funciónes para la conversión de cadenas de caracteres, integros, medidas, dentro de otras...
Ésto es de gran ayuda, pero muchas veces no es suficiente.
Así que se me ocurrió programar esta función(que también fue usada en un sistema anti-freeze que hice hace algún tiempo).

Convierte una cadena de caracteres en un integro(desde una longitud seleccionada), y a diferencia de un simple sprintf no produce desbordamiento de integro(ni de ningún tipo), si la sucesión del buffer son más caracteres, solo toma el numero ignorando el resto.
Código:
/*
Autor: NvK
Nombre funcion : buff_to_strint
Funcion: Convierte una string dentro de un buffer a un integro.

Fecha: domingo 12 enero 2014.
*/
static int32_t __attribute__((__section__(".text.data")))
	buff_to_strint(char *str, char *type_str)
{
	int base_int;
	char buff[1024];
	
	strncpy(buff, str+strlen(type_str), strlen(str)-0x1);
	return simple_strtol((const char*)buff, NULL, base_int);
}
Ejemplo de uso en un driver:
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/sched.h>

static int __section(.init.text) __cold notrace INIT_KERNEL(void)
{
	char s[]="{CADENA}50{OTRA_CADENA}";
	int x= buff_to_strint(s, "{CADENA}");
	
	printk(KERN_INFO "\n valor de x:%d", x);
  
  return 0x0;
}

static void __section(.exit.data) EXIT_KERNEL(void)
{
  // fin de seccion
}

module_init(INIT_KERNEL);
module_exit(EXIT_KERNEL);
Ésto da como resultado 50, como ven, selecciono desde donde copiar(osea "{CADENA}"), y cuando encuentra el integro ignora lo que hay después sin generar desbordamientos...

Otro ejemplo:
static int __section(.init.text) __cold notrace INIT_KERNEL(void)
{
	char s[]="[MAS_TEXTO]50<$IGNORADO@>";
	int x= buff_to_strint(s, "[MAS_TEXTO]") + 50;
	
	printk(KERN_INFO "\n valor de x:%d", x);
  
  return 0x0;
}
En este ejemplo además de ignorar "[MAS_TEXTO]" suma el resultante con 50, dando como resultado 100.

Espero que les sirva, y hasta otra.
Responder

Volver a “Fuentes”