1 /* 2 * Copyright 2003 Sun Microsystems, Inc. All rights reserved. 3 * Use is subject to license terms. 4 */ 5 6 #pragma ident "%Z%%M% %I% %E% SMI" 7 8 /* 9 * The contents of this file are subject to the Netscape Public 10 * License Version 1.1 (the "License"); you may not use this file 11 * except in compliance with the License. You may obtain a copy of 12 * the License at http://www.mozilla.org/NPL/ 13 * 14 * Software distributed under the License is distributed on an "AS 15 * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or 16 * implied. See the License for the specific language governing 17 * rights and limitations under the License. 18 * 19 * The Original Code is Mozilla Communicator client code, released 20 * March 31, 1998. 21 * 22 * The Initial Developer of the Original Code is Netscape 23 * Communications Corporation. Portions created by Netscape are 24 * Copyright (C) 1998-1999 Netscape Communications Corporation. All 25 * Rights Reserved. 26 * 27 * Contributor(s): 28 */ 29 30 /* ldapdelete.c - simple program to delete an entry using LDAP */ 31 32 #include "ldaptool.h" 33 #ifdef SOLARIS_LDAP_CMD 34 #include <locale.h> 35 #endif /* SOLARIS_LDAP_CMD */ 36 37 static int contoper; 38 39 #ifdef later 40 static int delbypasscmd, yestodelete; 41 #endif 42 43 #ifndef SOLARIS_LDAP_CMD 44 #define gettext(s) s 45 #endif 46 47 48 static LDAP *ld; 49 50 LDAPMessage *result, *e; 51 char *my_filter = "(objectclass=*)"; 52 53 static int dodelete( LDAP *ld, char *dn, LDAPControl **serverctrls ); 54 static void options_callback( int option, char *optarg ); 55 56 static void 57 usage( void ) 58 { 59 fprintf( stderr, gettext("usage: %s [options] [dn...]\n"), ldaptool_progname ); 60 fprintf( stderr, gettext("options:\n") ); 61 ldaptool_common_usage( 0 ); 62 fprintf( stderr, gettext(" -a\t\tBy-pass confirmation question when deleting a branch\n") ); 63 fprintf( stderr, gettext( " -c\t\tcontinuous mode (do not stop on errors)\n") ); 64 fprintf( stderr, gettext( " -f file\tread DNs to delete from file (default: standard input)\n") ); 65 exit( LDAP_PARAM_ERROR ); 66 } 67 68 69 int 70 main( int argc, char **argv ) 71 { 72 char buf[ 4096 ]; 73 int rc, deref, optind; 74 LDAPControl *ldctrl; 75 76 #ifdef notdef 77 #ifdef HPUX11 78 #ifndef __LP64__ 79 _main( argc, argv); 80 #endif /* __LP64_ */ 81 #endif /* HPUX11 */ 82 #endif 83 84 #ifdef SOLARIS_LDAP_CMD 85 char *locale = setlocale(LC_ALL, ""); 86 textdomain(TEXT_DOMAIN); 87 #endif /* SOLARIS_LDAP_CMD */ 88 contoper = 0; 89 90 #ifdef later 91 delbypasscmd = 0; 92 #endif 93 94 optind = ldaptool_process_args( argc, argv, "c", 0, options_callback ); 95 96 if ( optind == -1 ) { 97 usage(); 98 } 99 100 if ( ldaptool_fp == NULL && optind >= argc ) { 101 ldaptool_fp = stdin; 102 } 103 104 ld = ldaptool_ldap_init( 0 ); 105 106 deref = LDAP_DEREF_NEVER; /* prudent, but probably unnecessary */ 107 ldap_set_option( ld, LDAP_OPT_DEREF, &deref ); 108 109 ldaptool_bind( ld ); 110 111 if (( ldctrl = ldaptool_create_manage_dsait_control()) != NULL ) { 112 ldaptool_add_control_to_array( ldctrl, ldaptool_request_ctrls); 113 } 114 115 if ((ldctrl = ldaptool_create_proxyauth_control(ld)) !=NULL) { 116 ldaptool_add_control_to_array( ldctrl, ldaptool_request_ctrls); 117 } 118 119 if ( ldaptool_fp == NULL ) { 120 for ( ; optind < argc; ++optind ) { 121 char *conv; 122 123 conv = ldaptool_local2UTF8( argv[ optind ] ); 124 rc = dodelete( ld, conv, ldaptool_request_ctrls ); 125 if( conv != NULL ) { 126 free( conv ); 127 } 128 } 129 } else { 130 rc = 0; 131 while ((rc == 0 || contoper) && 132 fgets(buf, sizeof(buf), ldaptool_fp) != NULL) { 133 buf[ strlen( buf ) - 1 ] = '\0'; /* remove trailing newline */ 134 if ( *buf != '\0' ) { 135 rc = dodelete( ld, buf, ldaptool_request_ctrls ); 136 } 137 } 138 } 139 140 ldaptool_reset_control_array( ldaptool_request_ctrls ); 141 ldaptool_cleanup( ld ); 142 return( rc ); 143 } 144 145 static void 146 options_callback( int option, char *optarg ) 147 { 148 switch( option ) { 149 case 'c': /* continuous operation mode */ 150 ++contoper; 151 break; 152 default: 153 usage(); 154 } 155 } 156 157 static int 158 dodelete( LDAP *ld, char *dn, LDAPControl **serverctrls ) 159 { 160 int rc; 161 162 if ( ldaptool_verbose ) { 163 printf( gettext("%sdeleting entry %s\n"), ldaptool_not ? "!" : "", dn ); 164 } 165 if ( ldaptool_not ) { 166 rc = LDAP_SUCCESS; 167 } else if (( rc = ldaptool_delete_ext_s( ld, dn, serverctrls, NULL, 168 "ldap_delete" )) == LDAP_SUCCESS && ldaptool_verbose ) { 169 printf( gettext("entry removed\n") ); 170 } 171 172 return( rc ); 173 } 174 175 #ifdef later 176 177 /* This code broke iDS.....it will have to be revisited */ 178 static int 179 dodelete( LDAP *ld, char *dn, LDAPControl **serverctrls ) 180 { 181 int rc; 182 Head HeadNode; 183 Element *datalist; 184 char ch; 185 186 if ( ldaptool_verbose ) { 187 printf( gettext("%sdeleting entry %s\n"), ldaptool_not ? "!" : "", dn ); 188 } 189 if ( ldaptool_not ) { 190 rc = LDAP_SUCCESS; 191 } 192 else { /* else 1 */ 193 L_Init(&HeadNode); 194 195 if ( (rc = ldap_search_s( ld, dn, LDAP_SCOPE_SUBTREE, my_filter, NULL, 0, &result )) != LDAP_SUCCESS ) { 196 ldaptool_print_lderror( ld, "ldap_search", LDAPTOOL_CHECK4SSL_IF_APPROP ); 197 } 198 else { /* else 2 */ 199 for ( e = ldap_first_entry( ld, result ); e != NULL; e = ldap_next_entry( ld, e ) ) { 200 if ( ( dn = ldap_get_dn( ld, e ) ) != NULL ) { 201 datalist = (Element *)malloc(sizeof(Element)); 202 datalist->data = dn; 203 L_Insert(datalist, &HeadNode); 204 } 205 } 206 if ( ((Head *)&HeadNode)->count > 1 ) { 207 yestodelete = 0; 208 if ( delbypasscmd == 0 ) { 209 printf( gettext("Are you sure you want to delete the entire branch rooted at %s? [no]\n"), (char *)((Element *)(((Head *)&HeadNode)->first))->data); 210 ch = getchar(); 211 if ( (ch == 'Y') || (ch == 'y')) { 212 yestodelete = 1; 213 } 214 } else { 215 yestodelete = 1; 216 } 217 } else { 218 yestodelete = 1; 219 } 220 if ( yestodelete == 1 ) { 221 for ( datalist = ((Head *)&HeadNode)->last; datalist; datalist = datalist->left ) { 222 if (datalist) { 223 if ((rc = ldaptool_delete_ext_s( ld, (char *)datalist->data, serverctrls, NULL, "ldap_delete" )) == LDAP_SUCCESS && ldaptool_verbose ) { 224 printf( gettext("%s entry removed\n"), (char *)datalist->data ); 225 } 226 L_Remove(datalist, (Head *)&HeadNode); 227 ldap_memfree(datalist->data); 228 free ( datalist ); 229 } 230 } 231 } /* end if (yestodelete) */ 232 } /* else 2 */ 233 } /* else 1 */ 234 return (rc); 235 } /* function end bracket */ 236 #endif 237