Using hard links instead of symlinks is reasonable based on server/slapd.main.c:
static struct {
char *name;
MainFunc *func;
} tools[] = {
{"slapadd", slapadd},
{"slapcat", slapcat},
{"slapdn", slapdn}, {"slapindex", slapindex}, {"slappasswd", slappasswd}, {"slaptest", slaptest}, {"slapauth", slapauth},
{"slapacl", slapacl},
/* NOTE: new tools must be added in chronological order,
* not in alphabetical order, because for backwards
* compatibility name[4] is used to identify the
* tools; so name[4]=='a' must refer to "slapadd" and
* not to "slapauth". Alphabetical order can be used
* for tools whose name[4] is not used yet */
{NULL, NULL}
};
...
serverName = lutil_progname( "slapd", argc, argv );
if ( strcmp( serverName, "slapd" ) ) {
for (i=0; tools[i].name; i++) { if ( !strcmp( serverName, tools[i].name ) ) { rc = tools[i].func(argc, argv); MAIN_RETURN(rc); }
}
}
...
lutil_progname() simply grabs argv[0] and returns it. Based on the above, slapd doesn't care if they are hardlinks or symlinks.
Using hard links instead of symlinks is reasonable based on server/ slapd.main. c:
static struct {
{"slapindex" , slapindex},
{"slappasswd" , slappasswd},
{"slaptest" , slaptest},
{"slapauth" , slapauth},
char *name;
MainFunc *func;
} tools[] = {
{"slapadd", slapadd},
{"slapcat", slapcat},
{"slapdn", slapdn},
{"slapacl", slapacl},
/* NOTE: new tools must be added in chronological order,
* not in alphabetical order, because for backwards
* compatibility name[4] is used to identify the
* tools; so name[4]=='a' must refer to "slapadd" and
* not to "slapauth". Alphabetical order can be used
* for tools whose name[4] is not used yet */
{NULL, NULL}
};
...
serverName = lutil_progname( "slapd", argc, argv );
if ( strcmp( serverName, "slapd" ) ) {
if ( !strcmp( serverName, tools[i].name ) ) {
rc = tools[i].func(argc, argv);
MAIN_ RETURN( rc);
}
for (i=0; tools[i].name; i++) {
}
}
...
lutil_progname() simply grabs argv[0] and returns it. Based on the above, slapd doesn't care if they are hardlinks or symlinks.