Changeset 1234:a7b79e64107a in roaraudio


Ignore:
Timestamp:
02/25/09 21:36:04 (15 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

wrote the rest, hope it works *g*

Files:
2 edited

Legend:

Unmodified
Added
Removed
  • include/libroar/pinentry.h

    r1233 r1234  
    5252int roar_pinentry_close(struct roar_pinentry * pe); 
    5353 
    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); 
     54int roar_pinentry_send (struct roar_pinentry * pe, char *  cmd,  char * args); 
     55int roar_pinentry_recv (struct roar_pinentry * pe, char ** line, char ** opts); 
     56int roar_pinentry_req  (struct roar_pinentry * pe, char *  cmd,  char *  args, char ** line, char ** opts); 
    5757 
    5858int roar_pinentry_set_desc (struct roar_pinentry * pe, char * desc); 
     59int roar_pinentry_set_prompt(struct roar_pinentry * pe, char * prompt); 
     60int roar_pinentry_set_yes  (struct roar_pinentry * pe, char * yes); 
     61int roar_pinentry_set_no   (struct roar_pinentry * pe, char * no); 
    5962int roar_pinentry_set      (struct roar_pinentry * pe, char * obj, char * text); 
     63 
     64int roar_pinentry_getpin   (struct roar_pinentry * pe, char ** pw, char * desc, char * prompt); 
     65int roar_pinentry_confirm  (struct roar_pinentry * pe, char *  desc, char * yes, char * no); 
    6066 
    6167#endif 
  • libroar/pinentry.c

    r1233 r1234  
    3636 
    3737int roar_pinentry_open (struct roar_pinentry * pe, int flags, char * display, char * tty, char * term) { 
     38 int in[2], out[2]; 
     39 
    3840 if ( pe == NULL ) 
    3941  return -1; 
     
    4446 
    4547#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 
    46112 return 0; 
    47113#else 
     
    64130  close(pe->out); 
    65131 
     132 if ( pe->fin != NULL ) 
     133  fclose(pe->fin); 
     134 
    66135 if ( pe->in  != -1 ) 
    67136  close(pe->in); 
    68137 
     138 memset(pe, 0, sizeof(struct roar_pinentry)); 
     139 
    69140 return 0; 
    70141} 
     
    97168} 
    98169 
    99 int roar_pinentry_recv (struct roar_pinentry * pe, char * line, char * opts) { 
     170 
     171#define MAX_LINE_SIZE 2048 
     172int 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 
    100229 return -1; 
    101230} 
    102231 
    103 int roar_pinentry_req  (struct roar_pinentry * pe, char * cmd,  char * args, char * line, char * opts) { 
     232int roar_pinentry_req  (struct roar_pinentry * pe, char * cmd,  char * args, char ** line, char ** opts) { 
    104233 if ( pe == NULL ) 
    105234  return -1; 
     
    115244} 
    116245 
     246int roar_pinentry_set_prompt(struct roar_pinentry * pe, char * prompt) { 
     247 return roar_pinentry_set(pe, "PROMPT", prompt); 
     248} 
     249 
     250int roar_pinentry_set_yes  (struct roar_pinentry * pe, char * yes) { 
     251 return roar_pinentry_set(pe, "YES", yes); 
     252} 
     253 
     254int roar_pinentry_set_no   (struct roar_pinentry * pe, char * no) { 
     255 return roar_pinentry_set(pe, "NO", no); 
     256} 
     257 
    117258int roar_pinentry_set      (struct roar_pinentry * pe, char * obj, char * text) { 
    118259 char req[80] = "SET"; 
     
    133274} 
    134275 
     276int 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 
     294int 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 
    135313//ll 
Note: See TracChangeset for help on using the changeset viewer.