Changeset 1234:a7b79e64107a in roaraudio
- Timestamp:
- 02/25/09 21:36:04 (15 years ago)
- Branch:
- default
- Phase:
- public
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
include/libroar/pinentry.h
r1233 r1234 52 52 int roar_pinentry_close(struct roar_pinentry * pe); 53 53 54 int roar_pinentry_send (struct roar_pinentry * pe, char * cmd, char *args);55 int roar_pinentry_recv (struct roar_pinentry * pe, char * line, char* opts);56 int roar_pinentry_req (struct roar_pinentry * pe, char * cmd, char * args, char * line, char* opts);54 int roar_pinentry_send (struct roar_pinentry * pe, char * cmd, char * args); 55 int roar_pinentry_recv (struct roar_pinentry * pe, char ** line, char ** opts); 56 int roar_pinentry_req (struct roar_pinentry * pe, char * cmd, char * args, char ** line, char ** opts); 57 57 58 58 int roar_pinentry_set_desc (struct roar_pinentry * pe, char * desc); 59 int roar_pinentry_set_prompt(struct roar_pinentry * pe, char * prompt); 60 int roar_pinentry_set_yes (struct roar_pinentry * pe, char * yes); 61 int roar_pinentry_set_no (struct roar_pinentry * pe, char * no); 59 62 int roar_pinentry_set (struct roar_pinentry * pe, char * obj, char * text); 63 64 int roar_pinentry_getpin (struct roar_pinentry * pe, char ** pw, char * desc, char * prompt); 65 int roar_pinentry_confirm (struct roar_pinentry * pe, char * desc, char * yes, char * no); 60 66 61 67 #endif -
libroar/pinentry.c
r1233 r1234 36 36 37 37 int roar_pinentry_open (struct roar_pinentry * pe, int flags, char * display, char * tty, char * term) { 38 int in[2], out[2]; 39 38 40 if ( pe == NULL ) 39 41 return -1; … … 44 46 45 47 #ifdef ROAR_HAVE_BIN_PINENTRY 48 if ( display == NULL ) 49 display = getenv("DISPLAY"); 50 51 if ( display == NULL ) 52 display = "(NONE)"; 53 54 if ( tty == NULL ) 55 tty = ttyname(ROAR_STDIN); 56 57 if ( tty == NULL ) 58 tty = "/dev/tty"; // TODO: make compile time config parameter out of this 59 60 if ( term == NULL ) 61 term = getenv("TERM"); 62 63 if ( term == NULL ) 64 term = "dumb"; 65 66 // open some pipes... 67 if ( pipe(in) != 0 ) 68 return -1; 69 70 if ( pipe(out) != 0 ) { 71 close(in[0]); 72 close(in[1]); 73 return -1; 74 } 75 76 pe->pid = fork(); 77 78 switch (pe->pid) { 79 case -1: 80 close(in[0]); 81 close(in[1]); 82 close(out[0]); 83 close(out[1]); 84 return -1; 85 break; 86 case 0: 87 close(in[0]); 88 close(out[1]); 89 close(ROAR_STDIN); 90 close(ROAR_STDOUT); 91 92 if ( dup2(out[0], ROAR_STDIN) == -1 ) 93 _exit(1); 94 95 if ( dup2(in[1], ROAR_STDOUT) == -1 ) 96 _exit(1); 97 98 execlp(ROAR_HAVE_BIN_PINENTRY, "--display", display, "--ttytype", term, "--ttyname", tty, NULL); 99 100 _exit(1); 101 break; 102 } 103 104 close(in[1]); 105 close(out[0]); 106 107 pe->in = in[0]; 108 pe->out = out[1]; 109 110 pe->fin = fdopen(in[0], "r"); 111 46 112 return 0; 47 113 #else … … 64 130 close(pe->out); 65 131 132 if ( pe->fin != NULL ) 133 fclose(pe->fin); 134 66 135 if ( pe->in != -1 ) 67 136 close(pe->in); 68 137 138 memset(pe, 0, sizeof(struct roar_pinentry)); 139 69 140 return 0; 70 141 } … … 97 168 } 98 169 99 int roar_pinentry_recv (struct roar_pinentry * pe, char * line, char * opts) { 170 171 #define MAX_LINE_SIZE 2048 172 int roar_pinentry_recv (struct roar_pinentry * pe, char ** line, char ** opts) { 173 char realbuf[MAX_LINE_SIZE]; 174 char * tp; 175 176 if ( pe == NULL ) 177 return -1; 178 179 if ( pe->fin == NULL ) 180 return -1; 181 182 if ( fgets(realbuf, MAX_LINE_SIZE, pe->fin) == NULL ) 183 return -1; 184 185 tp = realbuf + strlen(realbuf) - 1; 186 187 for (; *tp != '\r' && *tp != '\n'; tp--) 188 *tp = 0; 189 190 if ( (tp = strstr(realbuf, " ")) == NULL ) { 191 if ( line != NULL ) 192 *line = strdup(realbuf); 193 194 if ( opts != NULL ) 195 *opts = NULL; 196 197 if ( !strcmp(realbuf, "OK") ) { 198 return 0; 199 } else if ( !strcmp(realbuf, "ERR") ) { 200 return 1; 201 } else { 202 return -1; 203 } 204 } else { 205 *tp = 0; 206 207 if ( !strcmp(realbuf, "D") ) { 208 if ( opts != NULL ) 209 *opts = strdup(tp+1); 210 211 return roar_pinentry_recv(pe, line, NULL); 212 } 213 214 if ( line != NULL ) 215 *line = strdup(realbuf); 216 217 if ( opts != NULL ) 218 *opts = NULL; 219 220 if ( !strcmp(realbuf, "OK") ) { 221 return 0; 222 } else if ( !strcmp(realbuf, "ERR") ) { 223 return 1; 224 } else { 225 return -1; 226 } 227 } 228 100 229 return -1; 101 230 } 102 231 103 int roar_pinentry_req (struct roar_pinentry * pe, char * cmd, char * args, char * line, char* opts) {232 int roar_pinentry_req (struct roar_pinentry * pe, char * cmd, char * args, char ** line, char ** opts) { 104 233 if ( pe == NULL ) 105 234 return -1; … … 115 244 } 116 245 246 int roar_pinentry_set_prompt(struct roar_pinentry * pe, char * prompt) { 247 return roar_pinentry_set(pe, "PROMPT", prompt); 248 } 249 250 int roar_pinentry_set_yes (struct roar_pinentry * pe, char * yes) { 251 return roar_pinentry_set(pe, "YES", yes); 252 } 253 254 int roar_pinentry_set_no (struct roar_pinentry * pe, char * no) { 255 return roar_pinentry_set(pe, "NO", no); 256 } 257 117 258 int roar_pinentry_set (struct roar_pinentry * pe, char * obj, char * text) { 118 259 char req[80] = "SET"; … … 133 274 } 134 275 276 int roar_pinentry_getpin (struct roar_pinentry * pe, char ** pw, char * desc, char * prompt) { 277 if ( pe == NULL ) 278 return -1; 279 280 if ( pw == NULL ) 281 return -1; 282 283 if ( desc != NULL ) 284 if ( roar_pinentry_set_desc(pe, desc) != 0 ) 285 return -1; 286 287 if ( prompt != NULL ) 288 if ( roar_pinentry_set_prompt(pe, prompt) != 0 ) 289 return -1; 290 291 return roar_pinentry_req(pe, "GETPIN", NULL, NULL, pw); 292 } 293 294 int roar_pinentry_confirm (struct roar_pinentry * pe, char * desc, char * yes, char * no) { 295 if ( pe == NULL ) 296 return -1; 297 298 if ( desc != NULL ) 299 if ( roar_pinentry_set_desc(pe, desc) != 0 ) 300 return -1; 301 302 if ( yes != NULL ) 303 if ( roar_pinentry_set_yes(pe, yes) != 0 ) 304 return -1; 305 306 if ( no != NULL ) 307 if ( roar_pinentry_set_no(pe, no) != 0 ) 308 return -1; 309 310 return roar_pinentry_req(pe, "CONFIRM", NULL, NULL, NULL); 311 } 312 135 313 //ll
Note: See TracChangeset
for help on using the changeset viewer.