/* * nwbpvalues.c * * List the contents of a SET property of a bindery object on a NetWare server * * Copyright (C) 1996 by Volker Lendecke * */ #include "ncplib.h" #include #include #include static char *progname; static void print_property(char *prop_name, __u8 * val, int segments); static void usage(void) { fprintf(stderr, "usage: %s [options]\n", progname); } static void help(void) { printf("\n"); printf("usage: %s [options]\n", progname); printf("\n" "-h Print this help text\n" "-S server Server name to be used\n" "-U username Username sent to server\n" "-P password Use this password\n" "-n Do not use any password\n" "-C Don't convert password to uppercase\n" "\n" "-o object_name Name of object\n" "-t type Object type (decimal value)\n" "-p property Name of property to be listed\n" "-v Verbose object listing\n" "-c Canonical output, for use with nwbpadd\n" "\n"); } int main(int argc, char *argv[]) { struct ncp_conn *conn; char *object_name = NULL; int object_type = -1; char *property_name = NULL; __u8 property_value[255 * 128]; int segno; int verbose = 0; int canonical = 0; struct nw_property segment; struct ncp_property_info info; long err; int result = 1; int opt; progname = argv[0]; if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL) { com_err(argv[0], err, "when initializing"); goto finished; } while ((opt = getopt(argc, argv, "h?o:t:p:vc")) != EOF) { switch (opt) { case 'o': object_name = optarg; str_upper(object_name); break; case 't': object_type = atoi(optarg); break; case 'p': property_name = optarg; if (strlen(property_name) > 15) { fprintf(stderr, "%s: Property Name too long\n", argv[0]); exit(1); } str_upper(property_name); break; case 'v': verbose = 1; break; case 'c': canonical = 1; break; case 'h': case '?': help(); goto finished; default: usage(); goto finished; } } if (object_type < 0) { fprintf(stderr, "%s: You must specify an object type\n", argv[0]); goto finished; } if (object_name == NULL) { fprintf(stderr, "%s: You must specify an object name\n", argv[0]); goto finished; } if (property_name == NULL) { fprintf(stderr, "%s: You must specify a property name\n", argv[0]); goto finished; } if (ncp_scan_property(conn, object_type, object_name, 0xffffffff, property_name, &info) != 0) { fprintf(stderr, "%s: Could not find property\n", argv[0]); goto finished; } segno = 1; while (ncp_read_property_value(conn, object_type, object_name, segno, property_name, &segment) == 0) { memcpy(&(property_value[(segno - 1) * 128]), segment.value, 128); if ((segment.more_flag == 0) || (segno == 255)) { break; } segno += 1; } if (canonical != 0) { printf("%-4.4x\n%s\n", object_type, object_name); printf("%s\n%d\n%x\n", info.property_name, info.property_flags, info.property_security); } if ((info.property_flags & 2) == 0) { /* ITEM property */ if (canonical != 0) { int i; for (i = 0; i < segno * 128; i++) { printf("%-2.2x\n", property_value[i]); } } else { print_property(property_name, property_value, segno); } } else { int objects = 32 * segno; __u32 *value = (__u32 *) property_value; int i = 0; while (i < objects) { struct ncp_bindery_object o; if ((value[i] == 0) || (value[i] == 0xffffffff)) { /* Continue with next segment */ i = ((i / 32) + 1) * 32; continue; } if (ncp_get_bindery_object_name(conn, ntohl(value[i]), &o) == 0) { if (canonical != 0) { printf("%-4.4x\n%s\n", (unsigned int) o.object_type, o.object_name); } else if (verbose != 0) { printf("%s %08X %04X\n", o.object_name, (unsigned int) o.object_id, (unsigned int) o.object_type); } else { printf("%s\n", o.object_name); } } i += 1; } } result = 0; finished: ncp_close(conn); return result; } static void print_unknown(__u8 * val) { int j = (128 / 16); while (1) { int i; for (i = 0; i < 16; i++) { printf("%02X ", val[i]); } printf(" ["); for (i = 0; i < 16; i++) { printf("%c", isprint(val[i]) ? val[i] : '.'); } j -= 1; if (j == 0) { printf("]\n"); return; } printf("]+\n"); val += 16; } } static void print_string(__u8 * val) { puts(val); } static char * print_station_addr(char *fmt, struct ncp_station_addr *addr, char *buff) { char *ret = buff; while (*fmt != 0) { switch (*fmt) { case '%': switch (*(++fmt)) { case 'N': /* node */ { int i; for (i = 0; i < 6; buff += 2, i++) { sprintf(buff, "%02X", addr->Node[i]); } } break; case 'S': /* Socket */ sprintf(buff, "%04X", htons(addr->Socket)); buff += 4; break; case 'L': /* Lan */ sprintf(buff, "%08lX", htonl(addr->NetWork)); buff += 8; break; case '%': *buff++ = '%'; default: break; } if (*fmt) { fmt++; } break; default: *buff++ = *fmt++; } } *buff = 0; return ret; } void print_login_control(__u8 * val) { int i, j, mask; char buff[32]; struct ncp_prop_login_control *a = (struct ncp_prop_login_control *) val; static char *days[] = {"Sun", "Mon", "Tue", "Wen", "Thu", "Fri", "Sat"}; if (a->LastLogin[2] || a->LastLogin[1] || a->LastLogin[0] || a->LastLogin[3] || a->LastLogin[4] || a->LastLogin[5]) { printf("Last Login: %d.%d.%02d at %2d:%02d:%02d\n", a->LastLogin[2], a->LastLogin[1], a->LastLogin[0], a->LastLogin[3], a->LastLogin[4], a->LastLogin[5]); } else { printf("Never logged in\n"); } if (a->Disabled != 0) { printf(" --- Account disabled ---\n"); } if (a->AccountExpireDate[2] || a->AccountExpireDate[1] || a->AccountExpireDate[0]) { printf("Account expires on: %d.%d.%d\n", a->AccountExpireDate[2], a->AccountExpireDate[1], a->AccountExpireDate[0]); } if (a->PasswordExpireDate[2] || a->PasswordExpireDate[1] || a->PasswordExpireDate[0]) { printf("Password expires on: %d.%d.%d\n", a->PasswordExpireDate[2], a->PasswordExpireDate[1], a->PasswordExpireDate[0]); printf("GraceLogins left: %d\nof max. : %d\n", a->GraceLogins, a->MaxGraceLogins); printf("PasswortChangeInterval : %d days\n", ntohs(a->PasswordExpireInterval)); } if ((a->RestrictionMask & 2) != 0) { printf("New password must be different when changing\n"); } if ((a->RestrictionMask & 1) != 0) { printf("User ist not allowed to change password\n"); } printf("Minimal password length : %d\n", a->MinPasswordLength); if (ntohs(a->MaxConnections) != 0) { printf("Maximum no of connections: %d\n", ntohs(a->MaxConnections)); } if (a->MaxDiskUsage != 0xFFFFFF7FL) { printf("Maximum DiskQuota : %8ld blocks\n", ntohl(a->MaxDiskUsage)); } printf("Failed Logins: %5d\n", ntohs(a->BadLoginCount)); if (a->BadLoginCountDown != 0L) { printf("Account disabled still %8ld seconds\n", ntohl(a->BadLoginCountDown)); } if (a->LastIntruder.NetWork != 0L) { printf("Last \'intruder\' address: %s\n", print_station_addr("(%L): %N[%S]", &(a->LastIntruder), buff)); } if (a->RestrictionMask & 0xFC) { printf("RestrictionMask : %02X\n", a->RestrictionMask); } for (i = 0; i < 42; i++) { if (a->ConnectionTimeMask[i] != 0xFF) { i = 101; } } if (i < 100) { return; } val = a->ConnectionTimeMask; printf("Time restrictions: 1 1 1 1 1 1 1 1 1 1 2 2 2 2 ]\n"); printf(" Day [0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 ]\n"); for (i = 0; i < 7; i++) { printf(" %s [", days[i]); for (j = 0; j < 6; j++) { for (mask = 1; mask < 0x100; mask <<= 1) { putchar((*val & mask) ? '*' : ' '); } val++; } printf("]\n"); } } void print_addr(__u8 * val) { char buff[50]; print_station_addr("(%L): %N[%S]", (struct ncp_station_addr *) val, buff); printf("%s\n", buff); } static struct { char *pname; void (*func) (__u8 *); } formats[] = { { "DESCRIPTION", print_string } , { "SURNAME", print_string } , { "OBJECT_CLASS", print_string } , { "DESCRIPTION", print_string } , { "IDENTIFICATION", print_string } , { "Q_DIRECTORY", print_string } , { "LOGIN_CONTROL", print_login_control } , { "NET_ADDRESS", print_addr } , { NULL, NULL } }; static void print_property(char *prop_name, __u8 * val, int segments) { int i; void (*f) (__u8 *); for (i = 0; formats[i].pname != NULL; i++) { if (strcasecmp(prop_name, formats[i].pname) == 0) { break; } } f = formats[i].func; if (f != NULL) { f(val); return; } for (i = 0; i < segments; i++) { printf("Segment: %03d\n", i + 1); print_unknown(&(val[i * 128])); printf("\n"); } }