これは私のコードです:
void get_pass(char *p);
int main(){
char *host, *user, *pass;
host = malloc(64); /* spazio per max 64 caratteri */
if(!host) abort(); /* se malloc ritorna NULL allora termino l'esecuzione */
host[63] = '\0'; /* evitare un tipo di buffer overflow impostando l'ultimo byte come NUL byte */
user = malloc(64);
if(!user) abort();
user[63] = '\0';
pass = malloc(64);
if(!pass) abort();
pass[63] = '\0';
/* Immissione di hostname, username e password; controllo inoltre i 'return code' dei vari fscanf e, se non sono 0, esco */
fprintf(stdout,"--> Inserisci <hostname>: ");
if(fscanf(stdin, "%63s", host) == EOF){
fprintf(stdout, "\nErrore, impossibile leggere i dati\n");
exit(EXIT_FAILURE);
}
fprintf(stdout,"\n--> Inserisci <username>: ");
if(fscanf(stdin, "%63s", user) == EOF){
fprintf(stdout, "\nErrore, impossibile leggere i dati\n");
exit(EXIT_FAILURE);
};
fprintf(stdout, "\n--> Inserisci <password>: ");
get_pass(pass);
/* Stampo a video le informazioni immesse */
fprintf(stdout, "\n\nHost: %s\nUser: %s\nPass: %s\n\n", host,user,pass);
/* Azzero il buffer della password e libero la memoria occupata */
memset(pass,0,(strlen(pass)+1));
free(host);
free(user);
free(pass);
return EXIT_SUCCESS;
}
void get_pass(char *p){
/* Grazie a termios.h posso disabilitare l'echoing del terminale (password nascosta) */
struct termios term, term_orig;
tcgetattr(STDIN_FILENO, &term);
term_orig = term;
term.c_lflag &= ~ECHO;
tcsetattr(STDIN_FILENO, TCSANOW, &term);
/* Leggo la password e controllo il 'return code' di fscanf */
if(fscanf(stdin, "%63s", p) == EOF){
fprintf(stdout, "\nErrore, impossibile leggere i dati\n");
tcsetattr(STDIN_FILENO, TCSANOW, &term_orig);
exit(EXIT_FAILURE);
};
/* Reimposto il terminale allo stato originale */
tcsetattr(STDIN_FILENO, TCSANOW, &term_orig);
}
関数 get_pass にコードがないことが正しいかどうか知りたいreturn
ですか?
この関数では、パスワードを読み取り、fscanf
それをメインプログラムに返さなければならないと思います...しかし:
- 方法がわからない(
return p;
警告が表示された) - なくても動作
return p;
するので大丈夫だと思いますが...よくわかりません...
return が関数でどのように機能するかわかりません。