Add ncplist program. That makes minimal set of ncp
utilities to use NetWare volumes. Other functionality (ncpsend, ncprint) will be added later.
This commit is contained in:
parent
17a6ff5abf
commit
e0812b5842
@ -213,6 +213,7 @@ SUBDIR+=ar \
|
||||
doscmd \
|
||||
gcore \
|
||||
gprof4 \
|
||||
ncplist \
|
||||
nm \
|
||||
ranlib \
|
||||
sasc \
|
||||
|
10
usr.bin/ncplist/Makefile
Normal file
10
usr.bin/ncplist/Makefile
Normal file
@ -0,0 +1,10 @@
|
||||
# $FreeBSD$
|
||||
|
||||
PROG= ncplist
|
||||
SRCS= ncplist.c
|
||||
MAN1= ncplist.1
|
||||
|
||||
DPADD+= ${LIBIPX} ${LIBNCP}
|
||||
LDADD+= -lipx -lncp
|
||||
|
||||
.include <bsd.prog.mk>
|
73
usr.bin/ncplist/ncplist.1
Normal file
73
usr.bin/ncplist/ncplist.1
Normal file
@ -0,0 +1,73 @@
|
||||
.\" $FreeBSD$
|
||||
.Dd Jun 24, 1999
|
||||
.Dt NCPLIST 1
|
||||
.Os FreeBSD 3.2
|
||||
.Sh NAME
|
||||
.Nm ncplist
|
||||
.Nd Displays various information about ncplib and NetWare servers
|
||||
.Sh SYNOPSIS
|
||||
.Nm ncplist
|
||||
.Ar command
|
||||
.Op Ar args
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Nm
|
||||
command used to display state of ncplib and NetWare servers. First argument
|
||||
are one letter
|
||||
.Ar command
|
||||
following by optional
|
||||
.Ar args
|
||||
.Pp
|
||||
The commands are:
|
||||
.Bl -tag -width indent
|
||||
.It b Ar server Ar type Op Ar pattern
|
||||
Lists bindery objects of
|
||||
.Ar type
|
||||
on a specified
|
||||
.Ar server.
|
||||
.Ar Type
|
||||
can be one of the following:
|
||||
.Bd -literal -offset indent
|
||||
Type Meaning
|
||||
user bindery users
|
||||
group bindery groups
|
||||
pserver bindery print servers
|
||||
tree tree name hosted by given server.
|
||||
.Ed
|
||||
.Pp
|
||||
Please note that if you are not logged in to the specified server list can be
|
||||
incomplete or empty.
|
||||
.It c
|
||||
List active NCP connections on local machine.
|
||||
.It s Op Ar server
|
||||
Displays NetWare servers known to given
|
||||
.Ar server .
|
||||
If no server is specified nearest server will be used.
|
||||
.It u Ar server
|
||||
Displays a list of users logged-in on given
|
||||
.Ar server .
|
||||
If you are not logged in to the specified server list will be empty.
|
||||
.It q Ar server Op Ar pattern
|
||||
Displays bindery queues on given
|
||||
.Ar server .
|
||||
.It v Ar server
|
||||
Displays mounted volumes on given
|
||||
.Ar server .
|
||||
.El
|
||||
.Sh FILES
|
||||
.Bl -tag -width /var/log/wtmp -compact
|
||||
.It Pa ~/.nwfsrc
|
||||
keeps description for each connection. See
|
||||
.Xr nwfsrc 8
|
||||
for details.
|
||||
|
||||
.Sh NOTES
|
||||
This utility provided mostly for educational purposes.
|
||||
|
||||
.Sh BUGS
|
||||
to number a few
|
||||
|
||||
.Sh AUTHOR
|
||||
.An Boris Popov Aq bp@butya.kz
|
||||
,
|
||||
.Aq rbp@chat.ru
|
463
usr.bin/ncplist/ncplist.c
Normal file
463
usr.bin/ncplist/ncplist.c
Normal file
@ -0,0 +1,463 @@
|
||||
/*
|
||||
* Copyright (c) 1999, Boris Popov
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by Boris Popov.
|
||||
* 4. Neither the name of the author nor the names of any co-contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
#include <sys/param.h>
|
||||
#include <sys/time.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <netncp/ncp_lib.h>
|
||||
|
||||
extern char *__progname;
|
||||
|
||||
static struct ncp_conn_stat conndesc;
|
||||
|
||||
static void help(void);
|
||||
static void show_connlist(void);
|
||||
static void show_serverlist(char *server);
|
||||
static void show_userlist(char *server);
|
||||
static void list_volumes(char *server);
|
||||
static void str_trim_right(char *s, char c);
|
||||
|
||||
|
||||
int
|
||||
ncp_get_connid(char *server, int justattach) {
|
||||
int connid, error;
|
||||
struct ncp_conn_loginfo li;
|
||||
|
||||
connid = ncp_conn_find(server, NULL);
|
||||
if (connid > 0) {
|
||||
ncp_conn_getinfo(connid, &conndesc);
|
||||
return connid;
|
||||
}
|
||||
if (!justattach) {
|
||||
if (connid == -1) {
|
||||
printf("You are not attached to server %s\n",server);
|
||||
return -1;
|
||||
}
|
||||
printf("You are not attached to any server\n");
|
||||
return -1;
|
||||
}
|
||||
ncp_li_init(&li, 0, NULL);
|
||||
if (server) {
|
||||
ncp_li_setserver(&li, server);
|
||||
error = ncp_find_fileserver(&li, AF_IPX, NULL);
|
||||
if (error) {
|
||||
printf("Could not find server %s\n", li.server);
|
||||
return -1;
|
||||
}
|
||||
} else {
|
||||
error = ncp_find_fileserver(&li, AF_IPX, NULL);
|
||||
if (error) {
|
||||
printf("Can't find any file server\n");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
error = ncp_connect(&li, &connid);
|
||||
if (error) {
|
||||
printf("Can't attach to a nearest server\n");
|
||||
return -1;
|
||||
}
|
||||
ncp_conn_getinfo(connid, &conndesc);
|
||||
return connid;
|
||||
}
|
||||
|
||||
static struct ncp_bitname conn_statenames [] = {
|
||||
{NCPFL_INVALID, "invalid"},
|
||||
{NCPFL_LOGGED, "active"},
|
||||
{NCPFL_PERMANENT, "permanent"},
|
||||
{NCPFL_PRIMARY, "primary"},
|
||||
{0, NULL}
|
||||
};
|
||||
|
||||
static void
|
||||
str_trim_right(char *s, char c) {
|
||||
int len;
|
||||
|
||||
for(len = strlen(s) - 1; len > 0 && s[len] == c; len--)
|
||||
s[len] = '\0';
|
||||
}
|
||||
|
||||
void
|
||||
show_connlist(void) {
|
||||
void *p;
|
||||
int cnt;
|
||||
char buf[200];
|
||||
struct ncp_conn_stat *ncsp;
|
||||
|
||||
printf("Active NCP connections:\n");
|
||||
p = ncp_conn_list();
|
||||
if (p == NULL) {
|
||||
printf("None\n");
|
||||
return;
|
||||
}
|
||||
printf(" refid server:user(connid), owner:group(mode), refs, <state>\n");
|
||||
cnt = *(int*)p;
|
||||
ncsp = (struct ncp_conn_stat*)(((int*)p)+1);
|
||||
while(cnt--) {
|
||||
printf("%6d %s:%s(%d), %s:%s(%o), %d, %s",
|
||||
ncsp->connRef, ncsp->li.server,ncsp->user,ncsp->connid,
|
||||
user_from_uid(ncsp->owner, 0),
|
||||
group_from_gid(ncsp->group, 0),
|
||||
ncsp->li.access_mode,
|
||||
ncsp->ref_cnt,
|
||||
ncp_printb(buf, ncsp->flags, conn_statenames));
|
||||
printf("\n");
|
||||
ncsp++;
|
||||
}
|
||||
free(p);
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
void
|
||||
show_serverlist(char *server) {
|
||||
int found = 0, connid;
|
||||
struct ncp_bindery_object obj;
|
||||
char *pattern = "*";
|
||||
|
||||
connid = ncp_get_connid(server, 1);
|
||||
if (connid < 0)
|
||||
return;
|
||||
printf("Visible servers (from %s):\n", conndesc.li.server);
|
||||
printf("Name Network Node Port\n");
|
||||
printf("----------------------------------------------- -------- ------------ ----\n");
|
||||
obj.object_id = 0xffffffff;
|
||||
|
||||
while (ncp_scan_bindery_object(connid, obj.object_id, NCP_BINDERY_FSERVER,
|
||||
pattern, &obj) == 0) {
|
||||
struct nw_property prop;
|
||||
struct ipx_addr *naddr = (struct ipx_addr *) ∝
|
||||
|
||||
found = 1;
|
||||
printf("%-48s", obj.object_name);
|
||||
|
||||
if (ncp_read_property_value(connid, NCP_BINDERY_FSERVER,
|
||||
obj.object_name, 1, "NET_ADDRESS",
|
||||
&prop) == 0) {
|
||||
ipx_print_addr(naddr);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
if (!found) {
|
||||
printf("No servers found\n");
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
show_userlist(char *server) {
|
||||
int connid, error, i;
|
||||
struct ncp_file_server_info info;
|
||||
struct ncp_bindery_object user;
|
||||
time_t login_time;
|
||||
struct ipx_addr addr;
|
||||
u_int8_t conn_type;
|
||||
|
||||
connid = ncp_get_connid(server, 0);
|
||||
if (connid < 0) return;
|
||||
if (ncp_get_file_server_information(connid, &info) != 0) {
|
||||
perror("Could not get server information");
|
||||
return;
|
||||
}
|
||||
printf("User information for server %s\n",info.ServerName);
|
||||
printf("\n%-6s%-21s%-27s%-12s\n"
|
||||
"---------------------------------------------"
|
||||
"---------------------------------\n",
|
||||
"Conn",
|
||||
"User name",
|
||||
"Station Address",
|
||||
"Login time");
|
||||
for (i = 1; i <= info.MaximumServiceConnections; i++) {
|
||||
char name[49];
|
||||
name[48] = '\0';
|
||||
error = ncp_get_stations_logged_info(connid, i, &user, &login_time);
|
||||
if (error) continue;
|
||||
memset(&addr, 0, sizeof(addr));
|
||||
error = ncp_get_internet_address(connid, i, &addr, &conn_type);
|
||||
if (error) continue;
|
||||
memcpy(name, user.object_name, 48);
|
||||
str_trim_right(name, ' ');
|
||||
printf("%4d: %-20s ", i, name);
|
||||
ipx_print_addr(&addr);
|
||||
printf(" ");
|
||||
printf("%s", ctime(&login_time));
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void
|
||||
show_queuelist(char *server, char *patt) {
|
||||
struct ncp_bindery_object q;
|
||||
int found = 0, connid;
|
||||
char default_pattern[] = "*";
|
||||
char *pattern = default_pattern;
|
||||
|
||||
connid = ncp_get_connid(server, 1);
|
||||
if (connid < 0) return;
|
||||
if (patt != NULL)
|
||||
pattern = patt;
|
||||
ncp_str_upper(pattern);
|
||||
|
||||
printf("\nServer: %s\n", server);
|
||||
printf("%-52s%-10s\n"
|
||||
"-----------------------------------------------"
|
||||
"-------------\n",
|
||||
"Print queue name",
|
||||
"Queue ID");
|
||||
q.object_id = 0xffffffff;
|
||||
|
||||
while (ncp_scan_bindery_object(connid, q.object_id,
|
||||
NCP_BINDERY_PQUEUE, pattern, &q) == 0)
|
||||
{
|
||||
found = 1;
|
||||
printf("%-52s", q.object_name);
|
||||
printf("%08X\n", (unsigned int) q.object_id);
|
||||
}
|
||||
|
||||
if (!found) {
|
||||
printf("No queues found\n");
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
void
|
||||
list_volumes(char *server) {
|
||||
int found = 0, connid, i, error;
|
||||
struct ncp_file_server_info si;
|
||||
char volname[NCP_VOLNAME_LEN+1];
|
||||
|
||||
connid = ncp_get_connid(server, 1);
|
||||
if (connid < 0) return;
|
||||
|
||||
error = ncp_get_file_server_information(connid, &si);
|
||||
if (error) {
|
||||
ncp_error("Can't get information for server %s", error, server);
|
||||
return;
|
||||
}
|
||||
|
||||
printf("\nMounted volumes on server %s:\n", server);
|
||||
printf("Number Name\n");
|
||||
printf("------ -----------------------------------------------\n");
|
||||
|
||||
for(i = 0; i < si.NumberMountedVolumes; i++) {
|
||||
if (NWGetVolumeName(connid, i, volname))
|
||||
continue;
|
||||
found = 1;
|
||||
printf("%6d %s\n", i, volname);
|
||||
}
|
||||
|
||||
if (!found)
|
||||
printf("No volumes found ?\n");
|
||||
return;
|
||||
}
|
||||
|
||||
struct ncp_bind_type {
|
||||
u_long type;
|
||||
char *name;
|
||||
};
|
||||
|
||||
static struct ncp_bind_type btypes[] = {
|
||||
{NCP_BINDERY_USER, "USER"},
|
||||
{NCP_BINDERY_UGROUP, "GROUP"},
|
||||
{NCP_BINDERY_PSERVER, "PSERVER"},
|
||||
{0x278, "TREE"},
|
||||
{0, NULL}
|
||||
};
|
||||
|
||||
void
|
||||
list_bindery(char *server, char *type, char *patt) {
|
||||
struct ncp_bindery_object q;
|
||||
int i, found = 0, connid;
|
||||
char default_pattern[] = "*";
|
||||
char *pattern = default_pattern;
|
||||
u_long objtype;
|
||||
|
||||
ncp_str_upper(type);
|
||||
objtype = 0;
|
||||
|
||||
for(i = 0; btypes[i].type; i++) {
|
||||
if (strcmp(btypes[i].name, type) == 0) {
|
||||
objtype = btypes[i].type;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!objtype) {
|
||||
printf("Bindery object of type %s is unknown\n", type);
|
||||
return;
|
||||
}
|
||||
if (patt != NULL)
|
||||
pattern = patt;
|
||||
ncp_str_upper(pattern);
|
||||
connid = ncp_get_connid(server, 1);
|
||||
if (connid < 0) return;
|
||||
|
||||
connid = ncp_get_connid(server, 1);
|
||||
if (connid < 0) return;
|
||||
|
||||
|
||||
printf("\nServer: %s\n", server);
|
||||
printf("%-52s%-10s\n"
|
||||
"-----------------------------------------------"
|
||||
"-------------\n",
|
||||
"Object name",
|
||||
"Object ID");
|
||||
|
||||
q.object_id = 0xffffffff;
|
||||
while (ncp_scan_bindery_object(connid, q.object_id,
|
||||
objtype, pattern, &q) == 0)
|
||||
{
|
||||
found = 1;
|
||||
printf("%-52s", q.object_name);
|
||||
printf("%08X\n", (unsigned int) q.object_id);
|
||||
}
|
||||
|
||||
if (!found) {
|
||||
printf("No bindery objects found\n");
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
enum listop {
|
||||
LO_NONE, LO_SERVERS, LO_QUEUES, LO_BINDERY, LO_USERS, LO_VOLUMES
|
||||
};
|
||||
|
||||
#define MAX_ARGS 10
|
||||
|
||||
int
|
||||
main(int argc, char *argv[]) {
|
||||
int opt, wdone = 0, nargs = 0, i;
|
||||
enum listop what;
|
||||
char *args[MAX_ARGS];
|
||||
|
||||
bzero(args, sizeof(args));
|
||||
|
||||
what = LO_NONE;
|
||||
while ((opt = getopt(argc, argv, "h")) != EOF) {
|
||||
switch (opt) {
|
||||
case 'h': case '?':
|
||||
help();
|
||||
/*NOTREACHED */
|
||||
default:
|
||||
help();
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
if (optind >= argc)
|
||||
help();
|
||||
|
||||
if(ncp_initlib())
|
||||
exit(1);
|
||||
|
||||
switch(argv[optind++][0]) {
|
||||
case 'b':
|
||||
what = LO_BINDERY;
|
||||
nargs = 2;
|
||||
break;
|
||||
case 'c':
|
||||
show_connlist();
|
||||
return 0;
|
||||
case 's':
|
||||
what = LO_SERVERS;
|
||||
break;
|
||||
case 'u':
|
||||
what = LO_USERS;
|
||||
nargs = 1;
|
||||
break;
|
||||
case 'q':
|
||||
what = LO_QUEUES;
|
||||
nargs = 1;
|
||||
break;
|
||||
case 'v':
|
||||
what = LO_VOLUMES;
|
||||
nargs = 1;
|
||||
break;
|
||||
default:
|
||||
printf("Unknown command %s\n", argv[optind-1]);
|
||||
help();
|
||||
}
|
||||
for (i = 0; i < MAX_ARGS; i++) {
|
||||
if (optind < argc) {
|
||||
args[i] = argv[optind++];
|
||||
} else if (i < nargs) {
|
||||
printf("Not enough arguments\n");
|
||||
help();
|
||||
return 1;
|
||||
} else
|
||||
break;
|
||||
}
|
||||
switch(what) {
|
||||
case LO_SERVERS:
|
||||
show_serverlist(args[0]);
|
||||
wdone = 1;
|
||||
break;
|
||||
case LO_USERS:
|
||||
show_userlist(args[0]);
|
||||
wdone = 1;
|
||||
break;
|
||||
case LO_QUEUES:
|
||||
show_queuelist(args[0], args[1]);
|
||||
wdone = 1;
|
||||
break;
|
||||
case LO_VOLUMES:
|
||||
list_volumes(args[0]);
|
||||
wdone = 1;
|
||||
break;
|
||||
case LO_BINDERY:
|
||||
list_bindery(args[0], args[1], args[2]);
|
||||
wdone = 1;
|
||||
break;
|
||||
default:
|
||||
help();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
help(void) {
|
||||
printf("\n");
|
||||
printf("usage: %s command [args]\n", __progname);
|
||||
printf("where commands are:\n"
|
||||
" b server user|group [pattern] list bindery objects on server\n"
|
||||
" c display opened connections\n"
|
||||
" s [server] display known servers\n"
|
||||
" u server list logged-in users on server\n"
|
||||
" q server [pattern] list print queues on server\n"
|
||||
" v server list mounted volumes on a specified server\n"
|
||||
"\n");
|
||||
exit(1);
|
||||
}
|
Loading…
Reference in New Issue
Block a user