Files
ncpfs/sutil/nwsfind.c
ncpfs archive import f813517d69 Import ncpfs 2.0.12
2026-04-28 20:39:59 +02:00

129 lines
2.2 KiB
C

/*
* nwsfind.c
*
* Find a NetWare server and open a route to it.
* This tool can safely be setuid root, if normal users should be able to
* access any NetWare server.
*
* Copyright (C) 1996 by Volker Lendecke
*
*/
#include "ncplib.h"
#include <unistd.h>
#include <stdlib.h>
#include <stdarg.h>
#include <errno.h>
static char *progname;
static void
usage(void)
{
fprintf(stderr, "usage: %s [server]\n", progname);
}
static void
help(void)
{
printf("\n");
printf("usage: %s [server]\n", progname);
printf("\n"
"-t Server type, default: File server\n"
"-a server is in form <net>:<node>:<socket>\n"
"-h Print this help text\n"
"\n");
}
static void
swallow_error(const char *name, long code, const char *format, va_list arg)
{
printf("%s ", error_message(code));
vfprintf(stdout, format, arg);
putchar('\n');
return;
}
int
main(int argc, char *argv[])
{
char *server = NULL;
int object_type = NCP_BINDERY_FSERVER;
struct sockaddr_ipx *result;
struct sockaddr_ipx resultbuf;
struct ncp_conn *conn;
long err;
int is_address = 0;
int opt;
progname = argv[0];
set_com_err_hook(swallow_error);
while ((opt = getopt(argc, argv, "at:")) != EOF)
{
switch (opt)
{
case 't':
object_type = atoi(optarg);
break;
case 'a':
is_address = 1;
break;
case 'h':
case '?':
help();
exit(1);
default:
usage();
exit(1);
}
}
if (optind < argc - 1)
{
usage();
exit(1);
}
if (is_address)
{
if ((optind > argc - 1) ||
ipx_sscanf_saddr(argv[optind], &resultbuf))
{
usage();
exit(1);
}
if ((!(conn = ncp_open_addr(&resultbuf, &err))) ||
(err = ncp_close(conn)))
result = NULL;
else
{
result = &resultbuf;
server = argv[optind];
}
}
else
{
if (optind == argc - 1)
{
server = argv[optind];
if (strlen(server) >= NCP_BINDERY_NAME_LEN)
{
com_err(argv[0], ENAMETOOLONG, "server name too long");
exit(1);
}
}
result = ncp_find_server(&server, object_type, &err);
}
if (result == NULL)
{
com_err(argv[0], err, "when trying to find server");
exit(1);
}
ipx_print_saddr(result);
printf(" %s\n", server);
return 0;
}