+/* $OpenLDAP$ */
+/*
+ * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
+ * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
+ */
/*
* Copyright (c) 1994 Regents of the University of Michigan.
* All rights reserved.
* is provided ``as is'' without express or implied warranty.
*/
+#include "portable.h"
+
#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
+#include <sys/stat.h>
+
+#include <ac/stdlib.h>
+
+#include <ac/signal.h>
+#include <ac/string.h>
+#include <ac/ctype.h>
+#include <ac/time.h>
+#include <ac/wait.h>
+#include <ac/unistd.h>
+
+#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
-#include <sys/time.h>
+#endif
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+#ifdef HAVE_SYS_RESOURCE_H
#include <sys/resource.h>
-#include <sys/wait.h>
-#include <signal.h>
-#include <lber.h>
+#endif
+#ifdef HAVE_PROCESS_H
+#include <process.h>
+#endif
+
+#ifdef HAVE_IO_H
+#include <io.h>
+#endif
+
#include <ldap.h>
-#include <ldapconfig.h>
-#include "ud.h"
-extern struct entry Entry;
-extern int verbose;
-extern LDAP *ld;
+#include "ldap_defaults.h"
+#include "ud.h"
-extern LDAPMessage *find();
+static int load_editor( void );
+static int modifiable( char *s, short flag );
+static int print_attrs_and_values( FILE *fp, struct attribute *attrs, short flag );
+static int ovalues( char *attr );
+static void write_entry( void );
-static char *entry_temp_file;
+static char entry_temp_file[L_tmpnam];
-#ifdef DEBUG
-extern int debug;
-#endif
-edit(who)
-char *who;
+void
+edit( char *who )
{
LDAPMessage *mp; /* returned from find() */
char *dn, **rdns; /* distinguished name */
char name[MED_BUF_SIZE]; /* entry to modify */
- extern int bind_status;
- static int load_editor();
- static int write_entry();
#ifdef DEBUG
if (debug & D_TRACE)
}
dn = ldap_get_dn(ld, ldap_first_entry(ld, mp));
rdns = ldap_explode_dn(dn, TRUE);
- Free(dn);
+ ldap_memfree(dn);
if (verbose) {
printf("\n Editing directory entry \"%s\"...\n", *rdns);
}
(void) ldap_value_free(rdns);
if (load_editor() < 0)
return;
- (void) write_entry();
+ write_entry();
(void) unlink(entry_temp_file);
ldap_uncache_entry(ld, Entry.DN);
return;
}
-static load_editor()
+static int
+load_editor( void )
{
FILE *fp;
char *cp, *editor = UD_DEFAULT_EDITOR;
- static char template[MED_BUF_SIZE];
- extern char * mktemp();
- extern int isgroup(), fatal();
- static int print_attrs_and_values();
+ int tmpfd;
+#ifndef HAVE_SPAWNLP
int pid;
int status;
+#endif
int rc;
- void (*handler)();
#ifdef DEBUG
if (debug & D_TRACE)
printf("->load_editor()\n");
#endif
- /* write the entry into a temp file */
- (void) strcpy(template, "/tmp/udEdit.XXXXXX");
- if ((entry_temp_file = mktemp(template)) == NULL) {
- perror("mktemp");
+#ifdef HAVE_MKSTEMP
+ strcpy(entry_temp_file, LDAP_TMPDIR LDAP_DIRSEP "udXXXXXX");
+
+ tmpfd = mkstemp(entry_temp_file);
+
+ if( tmpfd < 0 ) {
+ perror("mkstemp");
+ return -1;
+ }
+
+ if ((fp = fdopen(tmpfd, "w")) == NULL) {
+ perror("fdopen");
return(-1);
}
- if ((fp = fopen(entry_temp_file, "w")) == NULL) {
- perror("fopen");
+
+#else
+ fp = tmpfile();
+ if ( fp == NULL ) {
+ perror("tmpfile");
return(-1);
}
+#endif
+
fprintf(fp, "## Directory entry of %s\n", Entry.name);
fprintf(fp, "##\n");
fprintf(fp, "## Syntax is:\n");
if (verbose) {
char *p;
- if (( p = strrchr( editor, '/' )) == NULL ) {
+ if (( p = strrchr( editor, *LDAP_DIRSEP )) == NULL ) {
p = editor;
} else {
++p;
}
printf(" Using %s as the editor...\n", p );
+#ifndef HAVE_SPAWNLP
sleep(2);
+#endif
+ }
+#ifdef HAVE_SPAWNLP
+ rc = _spawnlp( _P_WAIT, editor, editor, entry_temp_file, NULL );
+ if(rc != 0) {
+ fatal("spawnlp");
}
+#else
if ((pid = fork()) == 0) {
/* child - edit the Directory entry */
- (void) signal(SIGINT, SIG_IGN);
+ (void) SIGNAL(SIGINT, SIG_IGN);
(void) execlp(editor, editor, entry_temp_file, NULL);
/*NOTREACHED*/
(void) fatal(editor);
}
else if (pid > 0) {
/* parent - wait until the child proc is done editing */
- handler = signal(SIGINT, SIG_IGN);
+ RETSIGTYPE (*handler)();
+ handler = SIGNAL(SIGINT, SIG_IGN);
(void) wait(&status);
- (void) signal(SIGINT, handler);
+ (void) SIGNAL(SIGINT, handler);
}
else {
fatal("fork");
/*NOTREACHED*/
}
+#endif
return(0);
}
-static int print_attrs_and_values(fp, attrs, flag)
-FILE *fp;
-struct attribute attrs[];
-short flag;
+static int
+print_attrs_and_values( FILE *fp, struct attribute *attrs, short int flag )
{
- static int modifiable();
register int i, j;
for (i = 0; attrs[i].quipu_name != NULL; i++) {
- if (!modifiable(attrs[i].quipu_name, flag|ATTR_FLAG_MAY_EDIT))
+ if (!modifiable(attrs[i].quipu_name,
+ (short) (flag|ATTR_FLAG_MAY_EDIT)))
+ {
continue;
+ }
+
fprintf(fp, "%s\n", attrs[i].quipu_name);
if ( attrs[i].number_of_values > MAX_VALUES ) {
printf(" The %s attribute has more than %d values.\n",
return( 0 );
}
-static modifiable(s, flag)
-char *s;
-short flag;
+static int
+modifiable( char *s, short int flag )
{
register int i;
- extern struct attribute attrlist[];
for (i = 0; attrlist[i].quipu_name != NULL; i++) {
if (strcasecmp(s, attrlist[i].quipu_name))
return(FALSE);
}
-static write_entry()
+static void
+write_entry( void )
{
int i = 0, j, number_of_values = -1;
LDAPMod *mods[MAX_ATTRS + 1];
LDAPMod *modp = NULL;
- static int ovalues();
- extern char * code_to_str();
- extern void free_mod_struct();
-
/* parse the file and write the values to the Directory */
if ((fp = fopen(entry_temp_file, "r")) == NULL) {
perror("fopen");
cp = line;
if (*cp == '#')
continue;
- if (isspace(*cp)) { /* value */
- while (isspace(*cp))
+ if (isspace((unsigned char)*cp)) { /* value */
+ while (isspace((unsigned char)*cp))
cp++;
values[number_of_values++] = strdup(cp);
if ( number_of_values >= MAX_VALUES ) {
continue;
}
/* attribute */
- while (isspace(*cp))
+ while (isspace((unsigned char)*cp))
cp++;
/*
* If the number of values is greater than zero, then we
return;
}
-static ovalues(attr)
-char *attr;
+static int
+ovalues( char *attr )
{
struct attribute *ap;