UN PROMPT LINUX

NitRic Messages postés 402 Date d'inscription mardi 1 mai 2001 Statut Membre Dernière intervention 15 août 2011 - 11 déc. 2005 à 07:08
xxdids Messages postés 2 Date d'inscription mardi 28 février 2012 Statut Membre Dernière intervention 12 novembre 2012 - 12 nov. 2012 à 00:21
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/35020-un-prompt-linux

xxdids Messages postés 2 Date d'inscription mardi 28 février 2012 Statut Membre Dernière intervention 12 novembre 2012
12 nov. 2012 à 00:21
Bonjour, et merci pour ton code il m'est d'un parfait secourt.
Mais je me demande comment je peux gérer les PS1 et PS2 décrit dans le SCL (Shell Command Language).
Si j'ai bien compris, PS1 c'est juste ' $ ' et PS2 c'est au cas ou le shell a besoin de plus d'infos donc il donne à nouveau la mais à l'utilisateur et dans ce cas de figure le ' $ ' devient ' > '.....

Comment je fais ça avec ton code??? Stp.
Merci d'avance...
huntermaster Messages postés 1 Date d'inscription mardi 30 décembre 2008 Statut Membre Dernière intervention 17 août 2011
17 août 2011 à 19:25
slt,
cette fonction est parfaitement ce que je recherchai pour ce que j'essaye de faire et je t'en remercie de l'avoir posté, mais il y a une petite partie que je n'arrive pas a comprendre...

char const *rep = aux + strlen(aux);
while (rep >= aux && *rep != '/')
{
rep--;
}

comment une chaine peut etre additionné à un entier? et du coup je ne comprend pas ce que "rep" renvoie et ce que fait la boucle while...
Merci
lalla0623 Messages postés 1 Date d'inscription dimanche 19 avril 2009 Statut Membre Dernière intervention 2 novembre 2010
2 nov. 2010 à 00:06
slt,
apparement l'utilisateur ne peut changer le prompte normalement si tu veux decrire le comportement d'un shell : tu peux faire export ps1 = " "
ensuite tu veras que le prompt a changer et parail pour le ps2
ensuite pour la gestion des variables speciales de shell.
je suis entraine de faire la meme choses mais c vrai que pour juste afficher juste un prompt c pas mal
NitRic Messages postés 402 Date d'inscription mardi 1 mai 2001 Statut Membre Dernière intervention 15 août 2011
12 déc. 2005 à 19:27
et déclare tes variables en début de scope!!! pas n'importe ou avec tes {} !



~(.:: NitRic ::.)~
PiloteLeblanc Messages postés 1 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 12 décembre 2005
12 déc. 2005 à 18:56
Je ne vois qu'une petite erreur technique:

invite = malloc(strlen(user) + strlen(host) + strlen(rep) + 6);

strlen() ne calcul pas le caractère NULL de fin de "string", et puisque tu ajoutes exactement 6 caractères, il faudrait ajouter +1 dans le total des caractères pour ce malloc().
NitRic Messages postés 402 Date d'inscription mardi 1 mai 2001 Statut Membre Dernière intervention 15 août 2011
12 déc. 2005 à 10:59
« MAIS, pour les mêmes raisons qu'avec snprintf, il vaut mieux utiliser strncpy/strncat »
- la principale raison est le débordement ...

strncpy()/strncat() ne sont pas a utiliser pour éviter les débordements, elles copies X caractère(s) sans ce préoccuper de la taille des chaines

char * strncpy(char * dst, const char * src, size_t cnt)
{
char * start = dst;

while (cnt-- && *src) {
*dst++ = *src++;
}
/* implémentation spécifique */
if (cnt != 0) {
while (--cnt) {
*dst++ = 0;
}
}
return start;
}

et un strncat() ressemble grossièrement a ceci:

char * strncat(char * dst, const char * src, size_t cnt)
{
char * start = dst;

while (*dst) {
*dst++;
}
strncpy(dst, src, cnt);
return start;
}

y'a aucune vérification au niveau de l'espace maximale des chaines(dst en l'occurence) ...

char * strncat_safe(char * dst, size_t dst_size, const char * src, size_t cnt)
{
char * start = dst;

if (dst_size == 0)
return start;

while (dst_size && *dst) {
dst++;
dst_size--;
}
while (dst_size && cnt && *src) {
*dst++ = *src++;
cnt--;
dst_size--;
}
if (dst_size == 0) {
dst--;
}
*dst = 0;
return start;
}

char buffer[8] = {0};
strncat_safe(buffer, 8, "abcdefghijklmnopqrstuvwxyz", 512);
puts(buffer); /* va afficher dans la console: abcdefg */

ce genre de fonction par contre peut éviter les débordements ...
---------------------------

char buffer[8] = {0};
strncat(buffer, "abcdefghijklmnopqrstuvwxyz", 512);
puts(buffer); /* j'crois qu'il va y avoir un p'tit problème au dessus ... */

pas ce genre de fonction ...
---------------------------




~(.:: NitRic ::.)~
mickbad Messages postés 71 Date d'inscription mercredi 17 juillet 2002 Statut Membre Dernière intervention 20 avril 2008
12 déc. 2005 à 08:26
salut,

Tout à fait d'accord d'essayer de ne pas utiliser strcpy/strcat car d'une part (comme NitRic la précisé) c'est long et d'autre part, ce n'est pas très élégant ;)

Par contre au sujet de s[n]printf, mieux vaut utiliser snprintf plutôt que sprintf car tu gères la taille à écrire => sinon attention au débordement de tampon pouvant rendre instable/vulnérable le programme.

Utilisation :

char* s = (char*)malloc(256 * sizeof(char));
if (s != NULL) // au cas où ya plus de mémoire :)
snprintf(s, 256, "ma réponse n°%d: %s", [tonID], [tonStr]);

Ainsi tu es sûr que ton pointeur s contiendra au maximum 256 éléments ! (évitant des débordements, des fuites de mémoires potentielles, ...)

Ceci dit, il ne faut pas réellement bouder les fonction strcpy/strcat surtout s'il s'agit de les utiliser de temps en temps. MAIS, pour les mêmes raisons qu'avec snprintf, il vaut mieux utiliser strncpy/strncat

voilà...
Mick
NitRic Messages postés 402 Date d'inscription mardi 1 mai 2001 Statut Membre Dernière intervention 15 août 2011
11 déc. 2005 à 07:08
#include "string.h"
#include "stdlib.h"
#include "stdio.h"
...

il te faut des <> pas des ""

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


si tu compile en C++ ton « char *invite... » est okay mais si c'est du C
il te faut le déclarer en début de fonction(début du scope de la fonction) !

vérifie ton malloc()
----

[...]

char * invite = (char *)malloc( [...] );

if (invite == NULL)
return NULL;

[...]

----

je te conseil d'utiliser sprintf()( et même _snprintf() ) au lieux des 10000 strcat() ...
strcat() part _toujours_ du début de la chaine jusqu'a la fin pour _ensuite_ ajouter
a la suite ... c'est très long surtout pour _un_ caractère ...

ou encore te créer un strcpy() maison pour toutes ces copies(strcpy()/strcat()) ...


~(.:: NitRic ::.)~
Rejoignez-nous