1 /* $OpenLDAP: pkg/ldap/libraries/libldap/turn.c,v 1.3.2.3 2008/02/11 23:26:41 kurt Exp $ */ 2 /* This work is part of OpenLDAP Software <http://www.openldap.org/>. 3 * 4 * Copyright 2005-2008 The OpenLDAP Foundation. 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted only as authorized by the OpenLDAP 9 * Public License. 10 * 11 * A copy of this license is available in the file LICENSE in the 12 * top-level directory of the distribution or, alternatively, at 13 * <http://www.OpenLDAP.org/license.html>. 14 */ 15 /* ACKNOWLEDGEMENTS: 16 * This program was orignally developed by Kurt D. Zeilenga for inclusion in 17 * OpenLDAP Software. 18 */ 19 20 /* 21 * LDAPv3 Turn Operation Request 22 */ 23 24 #include "portable.h" 25 26 #include <stdio.h> 27 #include <ac/stdlib.h> 28 29 #include <ac/socket.h> 30 #include <ac/string.h> 31 #include <ac/time.h> 32 33 #include "ldap-int.h" 34 #include "ldap_log.h" 35 36 int 37 ldap_turn( 38 LDAP *ld, 39 int mutual, 40 LDAP_CONST char* identifier, 41 LDAPControl **sctrls, 42 LDAPControl **cctrls, 43 int *msgidp ) 44 { 45 #ifdef LDAP_EXOP_X_TURN 46 BerElement *turnvalber = NULL; 47 struct berval *turnvalp = NULL; 48 int rc; 49 50 turnvalber = ber_alloc_t( LBER_USE_DER ); 51 if( mutual ) { 52 ber_printf( turnvalber, "{bs}", mutual, identifier ); 53 } else { 54 ber_printf( turnvalber, "{s}", identifier ); 55 } 56 ber_flatten( turnvalber, &turnvalp ); 57 58 rc = ldap_extended_operation( ld, LDAP_EXOP_X_TURN, 59 turnvalp, sctrls, cctrls, msgidp ); 60 ber_free( turnvalber, 1 ); 61 return rc; 62 #else 63 return LDAP_CONTROL_NOT_FOUND; 64 #endif 65 } 66 67 int 68 ldap_turn_s( 69 LDAP *ld, 70 int mutual, 71 LDAP_CONST char* identifier, 72 LDAPControl **sctrls, 73 LDAPControl **cctrls ) 74 { 75 #ifdef LDAP_EXOP_X_TURN 76 BerElement *turnvalber = NULL; 77 struct berval *turnvalp = NULL; 78 int rc; 79 80 turnvalber = ber_alloc_t( LBER_USE_DER ); 81 if( mutual ) { 82 ber_printf( turnvalber, "{bs}", 0xFF, identifier ); 83 } else { 84 ber_printf( turnvalber, "{s}", identifier ); 85 } 86 ber_flatten( turnvalber, &turnvalp ); 87 88 rc = ldap_extended_operation_s( ld, LDAP_EXOP_X_TURN, 89 turnvalp, sctrls, cctrls, NULL, NULL ); 90 ber_free( turnvalber, 1 ); 91 return rc; 92 #else 93 return LDAP_CONTROL_NOT_FOUND; 94 #endif 95 } 96 97