]> git.sur5r.net Git - openldap/blob - servers/slapd/back-shell/config.c
Patch: Implement surrogate parent for back-shell (ITS#1815)
[openldap] / servers / slapd / back-shell / config.c
1 /* config.c - shell backend configuration file routine */
2 /* $OpenLDAP$ */
3 /*
4  * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved.
5  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
6  */
7
8 #include "portable.h"
9
10 #include <stdio.h>
11
12 #include <ac/string.h>
13 #include <ac/socket.h>
14
15 #include "slap.h"
16 #include "shell.h"
17
18 #ifdef SHELL_SURROGATE_PARENT
19
20 static struct berval make_cmd_info(
21         char **args
22 )
23 {
24         struct berval ret = { 0, 0 };
25         int i;
26         ber_len_t offset;
27         for( i = 0; args[i] != NULL; i++ )
28                 ret.bv_len += strlen( args[i] ) + 1;
29         ret.bv_val = ch_malloc( ret.bv_len );
30         offset = 0;
31         for( i = 0; args[i] != NULL; i++ ) {
32                 strcpy( ret.bv_val + offset, args[i] );
33                 offset += strlen( args[i] ) + 1;
34         }
35         return ret;
36 }
37
38 #endif /* SHELL_SURROGATE_PARENT */
39
40 int
41 shell_back_db_config(
42     BackendDB   *be,
43     const char  *fname,
44     int         lineno,
45     int         argc,
46     char        **argv
47 )
48 {
49         struct shellinfo        *si = (struct shellinfo *) be->be_private;
50
51         if ( si == NULL ) {
52                 fprintf( stderr, "%s: line %d: shell backend info is null!\n",
53                     fname, lineno );
54                 return( 1 );
55         }
56
57         /* command + args to exec for binds */
58         if ( strcasecmp( argv[0], "bind" ) == 0 ) {
59                 if ( argc < 2 ) {
60                         fprintf( stderr,
61         "%s: line %d: missing executable in \"bind <executable>\" line\n",
62                             fname, lineno );
63                         return( 1 );
64                 }
65                 si->si_bind = MAKE_CMD_INFO( &argv[1] );
66
67         /* command + args to exec for unbinds */
68         } else if ( strcasecmp( argv[0], "unbind" ) == 0 ) {
69                 if ( argc < 2 ) {
70                         fprintf( stderr,
71         "%s: line %d: missing executable in \"unbind <executable>\" line\n",
72                             fname, lineno );
73                         return( 1 );
74                 }
75                 si->si_unbind = MAKE_CMD_INFO( &argv[1] );
76
77         /* command + args to exec for searches */
78         } else if ( strcasecmp( argv[0], "search" ) == 0 ) {
79                 if ( argc < 2 ) {
80                         fprintf( stderr,
81         "%s: line %d: missing executable in \"search <executable>\" line\n",
82                             fname, lineno );
83                         return( 1 );
84                 }
85                 si->si_search = MAKE_CMD_INFO( &argv[1] );
86
87         /* command + args to exec for compares */
88         } else if ( strcasecmp( argv[0], "compare" ) == 0 ) {
89                 if ( argc < 2 ) {
90                         fprintf( stderr,
91         "%s: line %d: missing executable in \"compare <executable>\" line\n",
92                             fname, lineno );
93                         return( 1 );
94                 }
95                 si->si_compare = MAKE_CMD_INFO( &argv[1] );
96
97         /* command + args to exec for modifies */
98         } else if ( strcasecmp( argv[0], "modify" ) == 0 ) {
99                 if ( argc < 2 ) {
100                         fprintf( stderr,
101         "%s: line %d: missing executable in \"modify <executable>\" line\n",
102                             fname, lineno );
103                         return( 1 );
104                 }
105                 si->si_modify = MAKE_CMD_INFO( &argv[1] );
106
107         /* command + args to exec for modrdn */
108         } else if ( strcasecmp( argv[0], "modrdn" ) == 0 ) {
109                 if ( argc < 2 ) {
110                         fprintf( stderr,
111         "%s: line %d: missing executable in \"modrdn <executable>\" line\n",
112                             fname, lineno );
113                         return( 1 );
114                 }
115                 si->si_modrdn = MAKE_CMD_INFO( &argv[1] );
116
117         /* command + args to exec for add */
118         } else if ( strcasecmp( argv[0], "add" ) == 0 ) {
119                 if ( argc < 2 ) {
120                         fprintf( stderr,
121         "%s: line %d: missing executable in \"add <executable>\" line\n",
122                             fname, lineno );
123                         return( 1 );
124                 }
125                 si->si_add = MAKE_CMD_INFO( &argv[1] );
126
127         /* command + args to exec for delete */
128         } else if ( strcasecmp( argv[0], "delete" ) == 0 ) {
129                 if ( argc < 2 ) {
130                         fprintf( stderr,
131         "%s: line %d: missing executable in \"delete <executable>\" line\n",
132                             fname, lineno );
133                         return( 1 );
134                 }
135                 si->si_delete = MAKE_CMD_INFO( &argv[1] );
136
137         /* command + args to exec for abandon */
138         } else if ( strcasecmp( argv[0], "abandon" ) == 0 ) {
139                 if ( argc < 2 ) {
140                         fprintf( stderr,
141         "%s: line %d: missing executable in \"abandon <executable>\" line\n",
142                             fname, lineno );
143                         return( 1 );
144                 }
145                 si->si_abandon = MAKE_CMD_INFO( &argv[1] );
146
147         /* anything else */
148         } else {
149                 fprintf( stderr,
150 "%s: line %d: unknown directive \"%s\" in shell database definition (ignored)\n",
151                     fname, lineno, argv[0] );
152         }
153
154         return 0;
155 }