static int process_response( LDAP *ld, int msgid, int op, const char *dn ) { LDAPMessage *res; int rc = LDAP_OTHER, msgtype; struct timeval tv = { 0, 0 }; int err; char *text = NULL, *matched = NULL, **refs = NULL; LDAPControl **ctrls = NULL; for ( ; ; ) { tv.tv_sec = 0; tv.tv_usec = 100000; rc = ldap_result( ld, msgid, LDAP_MSG_ALL, &tv, &res ); if ( tool_check_abandon( ld, msgid ) ) { return LDAP_CANCELLED; } if ( rc == -1 ) { ldap_get_option( ld, LDAP_OPT_RESULT_CODE, &rc ); tool_perror( "ldap_result", rc, NULL, NULL, NULL, NULL ); return rc; } if ( rc != 0 ) { break; } } msgtype = ldap_msgtype( res ); rc = ldap_parse_result( ld, res, &err, &matched, &text, &refs, &ctrls, 1 ); if ( rc == LDAP_SUCCESS ) rc = err; #ifdef LDAP_X_TXN if ( rc == LDAP_X_TXN_SPECIFY_OKAY ) { rc = LDAP_SUCCESS; } else #endif if ( rc != LDAP_SUCCESS ) { tool_perror( res2str( op ), rc, NULL, matched, text, refs ); } else if ( msgtype != op ) { fprintf( stderr, "%s: msgtype: expected %d got %d\n", res2str( op ), op, msgtype ); rc = LDAP_OTHER; } if ( text ) ldap_memfree( text ); if ( matched ) ldap_memfree( matched ); if ( text ) ber_memvfree( (void **)refs ); if ( ctrls ) { tool_print_ctrls( ld, ctrls ); ldap_controls_free( ctrls ); } return rc; }
static TermKeyResult peekkey(TermKey *tk, TermKeyKey *key, int force, size_t *nbytep) { int again = 0; if(!tk->is_started) { errno = EINVAL; return TERMKEY_RES_ERROR; } #ifdef DEBUG fprintf(stderr, "getkey(force=%d): buffer ", force); print_buffer(tk); fprintf(stderr, "\n"); #endif if(tk->hightide) { tk->buffstart += tk->hightide; tk->buffcount -= tk->hightide; tk->hightide = 0; } TermKeyResult ret; struct TermKeyDriverNode *p; for(p = tk->drivers; p; p = p->next) { ret = (p->driver->peekkey)(tk, p->info, key, force, nbytep); #ifdef DEBUG fprintf(stderr, "Driver %s yields %s\n", p->driver->name, res2str(ret)); #endif switch(ret) { case TERMKEY_RES_KEY: #ifdef DEBUG print_key(tk, key); fprintf(stderr, "\n"); #endif // Slide the data down to stop it running away { size_t halfsize = tk->buffsize / 2; if(tk->buffstart > halfsize) { memcpy(tk->buffer, tk->buffer + halfsize, halfsize); tk->buffstart -= halfsize; } } /* fallthrough */ case TERMKEY_RES_EOF: case TERMKEY_RES_ERROR: return ret; case TERMKEY_RES_AGAIN: if(!force) again = 1; /* fallthrough */ case TERMKEY_RES_NONE: break; } } if(again) return TERMKEY_RES_AGAIN; ret = peekkey_simple(tk, key, force, nbytep); #ifdef DEBUG fprintf(stderr, "getkey_simple(force=%d) yields %s\n", force, res2str(ret)); if(ret == TERMKEY_RES_KEY) { print_key(tk, key); fprintf(stderr, "\n"); } #endif return ret; }