Comment convertir un char[] string en int dans le noyau Linux?
Comment convertir char[] int dans le noyau linux
avec la validation que le texte entré est en fait un int?
int procfile_write(struct file *file, const char *buffer, unsigned long count,
void *data)
{
char procfs_buffer[PROCFS_MAX_SIZE];
/* get buffer size */
unsigned long procfs_buffer_size = count;
if (procfs_buffer_size > PROCFS_MAX_SIZE ) {
procfs_buffer_size = PROCFS_MAX_SIZE;
}
/* write data to the buffer */
if ( copy_from_user(procfs_buffer, buffer, procfs_buffer_size) ) {
return -EFAULT;
}
int = buffer2int(procfs_buffer, procfs_buffer_size);
return procfs_buffer_size;
}
- Vous êtes essentiellement à la recherche pour
atoi
avec une meilleure validation? - le noyau ne soit pas
atoi
nistrtol
en tant que tel - le "C/C++ standard library" est uniquement disponible pour les applications en espace utilisateur. Pour beaucoup de ces fonctions il y a des équivalents fonctionnels dans le noyau de la terre, bien que, mais pas nécessairement avec le même nom.
Vous devez vous connecter pour publier un commentaire.
Voir les différentes incarnations de
kstrtol()
dans#include <include/linux/kernel.h>
dans votre environnement de linux de l'arbre source.Lequel vous avez besoin dépend de la
*buffer
est un utilisateur ou un noyau adresse, et sur la façon stricte à vos besoins sur la gestion des erreurs et de vérification du contenu de la mémoire tampon sont (des choses comme, est123qx
non valide ou doit-il revenir123
?).strict_strtol()
ousimple_strtol()
va probablement faire le travail ici.kstrtol...()
funcs vssimple_strtol()
et/oustrict_strtol()
. En tout cas, vous avez raison, si vous n'êtes pas sur le bord de saignement de l'utiliser. Voir aussi à propos des "adresse de l'utilisateur".kstrotox()
ne sont pas les remplacements poursimple_strtox()
ceux.En raison de l'indisponibilité d'un lot de la fonction commune/macros dans le noyau de linux, vous ne pouvez pas utiliser de fonction directe pour obtenir la valeur entière d'un tampon de chaîne.
C'est le code que j'ai utilisé pendant un long moment pour le faire et il peut être utilisé sur tous les *NIX saveurs (probablement sans aucune modification).
C'est la modification de la forme de code, que j'ai utilisé un long temps de retour d'un projet open source (ne me souviens pas le nom maintenant).
strtol()
(même documenté dans le Solaris de l'article 9 pages de manuel, afin de ne FreeBSD (c'est dans libkern). Linux a bien nommé différemment. Sur tous ces points, un#define
ferait ...Minimum praticable
kstrtoull_from_user
debugfs
exempleLa
kstrto*_from_user
de la famille est très pratique lorsque vous traitez avec les données de l'utilisateur.kstrto.c:
Utilisation:
Sorties Dmesg:
Testé dans le noyau Linux 4.16 avec cette QEMU + installation de Buildroot.
Pour cet exemple particulier, vous pourriez avoir voulu utiliser
debugfs_create_u32
à la place.Vous pouvez utiliser
strtoul
oustrtol
. Voici un lien vers les pages man:http://www.kernel.org/doc/man-pages/online/pages/man3/strtoul.3.html
http://www.kernel.org/doc/man-pages/online/pages/man3/strtol.3.html
- Je utiliser sscanf() (la version du noyau) pour numériser à partir d'une chaîne de stream, et il fonctionne sur 2.6.39-gentoo-r3. Franchement, je n'ai jamais pu obtenir simple_strtol() pour travailler dans le noyau, je suis actuellement à comprendre pourquoi cela ne fonctionne pas sur ma boîte.
Utiliser atoi et appel isdigit (note appel isdigit prend juste un char).
http://www.cplusplus.com/reference/clibrary/cctype/isdigit/
isdigit()
(en<linux/ctype.h>
mais pas<ctype.h>
) dans le noyau Linux, mais il n'y a pas deatoi()
.