int main(int argc, char** argv) { romaji *object, *hira2kata, *han2zen, *zen2han; char *word = NULL; object = romaji_open(); hira2kata = romaji_open(); han2zen = romaji_open(); zen2han = romaji_open(); romaji_set_verbose(zen2han, 1); while (*++argv) { if (0) ; else if (argv[1] && (!strcmp("--word", *argv) || !strcmp("-w", *argv))) word = *++argv; } if (object && hira2kata && han2zen && zen2han) { int retval = 0; retval = romaji_load(object, DICT_ROMA2HIRA); printf("romaji_load(%s)=%d\n", DICT_ROMA2HIRA, retval); retval = romaji_load(hira2kata, DICT_HIRA2KATA); printf("romaji_load(%s)=%d\n", DICT_HIRA2KATA, retval); retval = romaji_load(han2zen, DICT_HAN2ZEN); printf("romaji_load(%s)=%d\n", DICT_HAN2ZEN, retval); retval = romaji_load(zen2han, DICT_ZEN2HAN); printf("romaji_load(%s)=%d\n", DICT_HAN2ZEN, retval); if (word) query_one(object, hira2kata, han2zen, zen2han, word); else query_loop(object, hira2kata, han2zen, zen2han); } if (han2zen) romaji_close(han2zen); if (hira2kata) romaji_close(hira2kata); if (object) romaji_close(object); return 0; }
void query_loop(romaji* object, romaji* hira2kata, romaji* han2zen, romaji* zen2han) { char buf[256], *ans; while (1) { printf("QUERY: "); if (!fgets(buf, sizeof(buf), stdin)) { printf("\n"); break; } /* 改行をNUL文字に置き換える */ if ((ans = strchr(buf, '\n')) != NULL) *ans = '\0'; query_one(object, hira2kata, han2zen, zen2han, buf); } }
/**************************************************************************** main program ****************************************************************************/ int main(int argc, const char *argv[]) { int opt; unsigned int lookup_type = 0x0; fstring lookup; static bool find_master=False; static bool lookup_by_ip = False; poptContext pc = NULL; TALLOC_CTX *frame = talloc_stackframe(); int rc = 0; struct poptOption long_options[] = { POPT_AUTOHELP { "broadcast", 'B', POPT_ARG_STRING, NULL, 'B', "Specify address to use for broadcasts", "BROADCAST-ADDRESS" }, { "flags", 'f', POPT_ARG_NONE, NULL, 'f', "List the NMB flags returned" }, { "unicast", 'U', POPT_ARG_STRING, NULL, 'U', "Specify address to use for unicast" }, { "master-browser", 'M', POPT_ARG_NONE, NULL, 'M', "Search for a master browser" }, { "recursion", 'R', POPT_ARG_NONE, NULL, 'R', "Set recursion desired in package" }, { "status", 'S', POPT_ARG_NONE, NULL, 'S', "Lookup node status as well" }, { "translate", 'T', POPT_ARG_NONE, NULL, 'T', "Translate IP addresses into names" }, { "root-port", 'r', POPT_ARG_NONE, NULL, 'r', "Use root port 137 (Win95 only replies to this)" }, { "lookup-by-ip", 'A', POPT_ARG_NONE, NULL, 'A', "Do a node status on <name> as an IP Address" }, POPT_COMMON_SAMBA POPT_COMMON_CONNECTION { 0, 0, 0, 0 } }; *lookup = 0; load_case_tables(); setup_logging(argv[0], DEBUG_STDOUT); pc = poptGetContext("nmblookup", argc, argv, long_options, POPT_CONTEXT_KEEP_FIRST); poptSetOtherOptionHelp(pc, "<NODE> ..."); while ((opt = poptGetNextOpt(pc)) != -1) { switch (opt) { case 'f': give_flags = true; break; case 'M': find_master = true; break; case 'R': recursion_desired = true; break; case 'S': find_status = true; break; case 'r': RootPort = true; break; case 'A': lookup_by_ip = true; break; case 'B': if (interpret_string_addr(&bcast_addr, poptGetOptArg(pc), NI_NUMERICHOST)) { got_bcast = True; use_bcast = True; } break; case 'U': if (interpret_string_addr(&bcast_addr, poptGetOptArg(pc), 0)) { got_bcast = True; use_bcast = False; } break; case 'T': translate_addresses = !translate_addresses; break; } } poptGetArg(pc); /* Remove argv[0] */ if(!poptPeekArg(pc)) { poptPrintUsage(pc, stderr, 0); rc = 1; goto out; } if (!lp_load_global(get_dyn_CONFIGFILE())) { fprintf(stderr, "Can't load %s - run testparm to debug it\n", get_dyn_CONFIGFILE()); } load_interfaces(); if (!open_sockets()) { rc = 1; goto out; } while(poptPeekArg(pc)) { char *p; struct in_addr ip; fstrcpy(lookup,poptGetArg(pc)); if(lookup_by_ip) { struct sockaddr_storage ss; ip = interpret_addr2(lookup); in_addr_to_sockaddr_storage(&ss, ip); fstrcpy(lookup,"*"); if (!do_node_status(lookup, lookup_type, &ss)) { rc = 1; } continue; } if (find_master) { if (*lookup == '-') { fstrcpy(lookup,"\01\02__MSBROWSE__\02"); lookup_type = 1; } else { lookup_type = 0x1d; } } p = strchr_m(lookup,'#'); if (p) { *p = '\0'; sscanf(++p,"%x",&lookup_type); } if (!query_one(lookup, lookup_type)) { rc = 1; d_printf( "name_query failed to find name %s", lookup ); if( 0 != lookup_type ) { d_printf( "#%02x", lookup_type ); } d_printf( "\n" ); } } out: poptFreeContext(pc); TALLOC_FREE(frame); return rc; }
void test_query_directory( void ) { WCHAR dirname[] = L"\\??\\c:\\filetest"; WCHAR filename[] = L"\\??\\c:\\filetest\\edb.chk"; WCHAR edb[] = L"edb<\"*"; UNICODE_STRING path, mask, empty; OBJECT_ATTRIBUTES oa; HANDLE dir, file; IO_STATUS_BLOCK iosb; BYTE buffer[0x100]; NTSTATUS r; iosb.Status = ~0; iosb.Information = ~0; empty.Buffer = 0; empty.Length = 0; empty.MaximumLength = 0; init_us(&mask, edb); oa.Length = sizeof oa; oa.RootDirectory = 0; oa.ObjectName = &path; oa.Attributes = OBJ_CASE_INSENSITIVE; oa.SecurityDescriptor = 0; oa.SecurityQualityOfService = 0; init_us(&path, filename); r = NtDeleteFile( &oa ); // delete the file to ensure preconditions init_us(&path, dirname); r = NtDeleteFile( &oa ); // create a test directory r = NtCreateFile( &dir, GENERIC_READ | GENERIC_WRITE | FILE_LIST_DIRECTORY, &oa, &iosb, 0, FILE_ATTRIBUTE_DIRECTORY, FILE_SHARE_READ, FILE_CREATE, FILE_DIRECTORY_FILE, 0, 0 ); ok( r == STATUS_SUCCESS, "failed to create dir %08lx\n", r); ok( iosb.Status == STATUS_SUCCESS, "status wrong %08lx\n", iosb.Status); ok( iosb.Information == FILE_CREATED, "information wrong %08lx\n", iosb.Information); // add a file to the directory init_us(&path, filename); r = NtCreateFile( &file, GENERIC_READ | GENERIC_WRITE, &oa, &iosb, 0, FILE_ATTRIBUTE_DIRECTORY, FILE_SHARE_READ, FILE_CREATE, 0, 0, 0 ); ok( r == STATUS_SUCCESS, "failed to create file %08lx\n", r); ok( iosb.Status == STATUS_SUCCESS, "status wrong %08lx\n", iosb.Status); ok( iosb.Information == FILE_CREATED, "information wrong %08lx\n", iosb.Information); r = NtClose( file ); ok( r == STATUS_SUCCESS, "status wrong %08lx\n", r); // query first file... should be "." r = NtQueryDirectoryFile( dir, 0, 0, 0, &iosb, buffer, sizeof buffer, FileBothDirectoryInformation, TRUE, 0, 0); ok( r == STATUS_SUCCESS, "failed to query directory %08lx\n", r); check_dot(&iosb, buffer); // query second file... should be ".." r = NtQueryDirectoryFile( dir, 0, 0, 0, &iosb, buffer, sizeof buffer, FileBothDirectoryInformation, TRUE, 0, 0); ok( r == STATUS_SUCCESS, "failed to query directory %08lx\n", r); check_dotdot(&iosb, buffer); // query third file... should be "edb.chk" r = NtQueryDirectoryFile( dir, 0, 0, 0, &iosb, buffer, sizeof buffer, FileBothDirectoryInformation, TRUE, 0, 0); ok( r == STATUS_SUCCESS, "failed to query directory %08lx\n", r); check_edb(&iosb, buffer); // no more files... r = NtQueryDirectoryFile( dir, 0, 0, 0, &iosb, buffer, sizeof buffer, FileBothDirectoryInformation, TRUE, 0, 0); ok( r == STATUS_NO_MORE_FILES, "failed to query directory %08lx\n", r); // try with a mask r = NtQueryDirectoryFile( dir, 0, 0, 0, &iosb, buffer, sizeof buffer, FileBothDirectoryInformation, TRUE, &mask, TRUE); ok( r == STATUS_SUCCESS, "failed to query directory %08lx\n", r); ok( iosb.Status == STATUS_SUCCESS, "status wrong %08lx\n", iosb.Status); check_dot(&iosb, buffer); r = NtClose( dir ); ok( r == STATUS_SUCCESS, "failed to close handle %08lx\n", r); // set oa to point the the directory again init_us(&path, dirname); // re-open the file and scan with a mask // looks like the mask is set on the first scan after opening the directory r = query_one(&oa, edb, buffer, sizeof buffer, &iosb); ok( r == STATUS_SUCCESS, "query failed %08lx\n", r); check_edb(&iosb, buffer); // what happens if the mask is present but empty? r = query_one(&oa, L"", buffer, sizeof buffer, &iosb); ok( r == STATUS_SUCCESS, "query failed %08lx\n", r); check_dot(&iosb, buffer); // how does * work? r = query_one(&oa, L"*", buffer, sizeof buffer, &iosb); ok( r == STATUS_SUCCESS, "query failed %08lx\n", r); check_dot(&iosb, buffer); // how does * work? r = query_one(&oa, L"*.*", buffer, sizeof buffer, &iosb); ok( r == STATUS_SUCCESS, "query failed %08lx\n", r); check_dot(&iosb, buffer); // what does *e return? r = query_one(&oa, L"e*", buffer, sizeof buffer, &iosb); ok( r == STATUS_SUCCESS, "query failed %08lx\n", r); check_edb(&iosb, buffer); // can we get back .. r = query_one(&oa, L"..", buffer, sizeof buffer, &iosb); ok( r == STATUS_NO_SUCH_FILE, "query failed %08lx\n", r); // what about ... ? r = query_one(&oa, L"...", buffer, sizeof buffer, &iosb); ok( r == STATUS_NO_SUCH_FILE, "query failed %08lx\n", r); // does ? work r = query_one(&oa, L"??", buffer, sizeof buffer, &iosb); ok( r == STATUS_NO_SUCH_FILE, "query failed %08lx\n", r); // does ? work r = query_one(&oa, L"?.", buffer, sizeof buffer, &iosb); ok( r == STATUS_NO_SUCH_FILE, "query failed %08lx\n", r); // exact match r = query_one(&oa, L"edb.chk", buffer, sizeof buffer, &iosb); ok( r == STATUS_SUCCESS, "query failed %08lx\n", r); check_edb(&iosb, buffer); // almost exact match r = query_one(&oa, L"edb.ch", buffer, sizeof buffer, &iosb); ok( r == STATUS_NO_SUCH_FILE, "query failed %08lx\n", r); // case insensitive match r = query_one(&oa, L"EDB.CHK", buffer, sizeof buffer, &iosb); ok( r == STATUS_SUCCESS, "query failed %08lx\n", r); check_edb(&iosb, buffer); // dot star? r = query_one(&oa, L"edb.*", buffer, sizeof buffer, &iosb); ok( r == STATUS_SUCCESS, "query failed %08lx\n", r); check_edb(&iosb, buffer); // bad masks r = query_one(&oa, L"|", buffer, sizeof buffer, &iosb); ok( r == STATUS_NO_SUCH_FILE, "query failed %08lx\n", r); r = query_one(&oa, L":", buffer, sizeof buffer, &iosb); ok( r == STATUS_NO_SUCH_FILE, "query failed %08lx\n", r); r = query_one(&oa, L"/", buffer, sizeof buffer, &iosb); ok( r == STATUS_NO_SUCH_FILE, "query failed %08lx\n", r); r = query_one(&oa, L"\\", buffer, sizeof buffer, &iosb); ok( r == STATUS_NO_SUCH_FILE, "query failed %08lx\n", r); // delete the file init_us(&path, filename); r = NtDeleteFile( &oa ); ok( r == STATUS_SUCCESS, "failed to delete directory %08lx\n", r); // delete the directory init_us(&path, dirname); r = NtDeleteFile( &oa ); ok( r == STATUS_SUCCESS, "failed to delete directory %08lx\n", r); }
int main(int argc, char **argv) { HANDLE handle = 0, event = 0; NTSTATUS r; UNICODE_STRING path, mask, *pmask; OBJECT_ATTRIBUTES oa; WCHAR dirname[0x100]; union { PCWSTR cp; PWSTR p; } u; WCHAR pathbuf[0x100]; BYTE unknown[0x100]; ULONG len; IO_STATUS_BLOCK iosb; if (argc != 2) { fprintf(stderr, "%s <dir>\\<mask>\n", argv[0]); return 1; } len = MultiByteToWideChar( CP_ACP, 0, argv[1], -1, dirname, sizeof dirname); path.Buffer = pathbuf; path.Length = 0; path.MaximumLength = sizeof pathbuf; if (!RtlDosPathNameToNtPathName_U( dirname, &path, &u.cp, &unknown )) { fprintf(stderr, "path conversion failed\n"); fprintf(stderr, "path %S\n", dirname); return 1; } if (u.p != &pathbuf[0]) { len = lstrlenW(u.p) + 1; path.Length -= len*2; path.Buffer[path.Length/2] = 0; } path.Buffer[path.Length/2] = 0; //fprintf(stderr, "path = "); //dump_string(path.Buffer, path.Length/2); //fprintf(stderr, "\n"); oa.Length = sizeof oa; oa.RootDirectory = 0; oa.ObjectName = &path; oa.Attributes = OBJ_CASE_INSENSITIVE; oa.SecurityDescriptor = 0; oa.SecurityQualityOfService = 0; r = NtOpenFile(&handle, GENERIC_READ, &oa, &iosb, FILE_SHARE_READ, 0 /*FILE_SYNCHRONOUS_IO_NONALERT*/); if (r != STATUS_SUCCESS) { fprintf(stderr, "openfile failed\n"); fprintf(stderr, "path %S\n", pathbuf); return 1; } len = lstrlenW(u.p); if (len) { mask.Buffer = u.p; mask.Length = len*2; mask.MaximumLength = 0; pmask = &mask; //fprintf(stderr, "mask = "); //dump_string(u.p, len); //fprintf(stderr, "\n"); } else pmask = 0; event = CreateEvent(0,0,0,0); if (!event) { fprintf(stderr, "createevent failed\n"); return 1; } do { r = query_one(handle, event, pmask); } while (r == STATUS_SUCCESS); NtClose(handle); return 0; }
/**************************************************************************** main program ****************************************************************************/ int main(int argc,char *argv[]) { int opt; unsigned int lookup_type = 0x0; pstring lookup; extern int optind; extern char *optarg; BOOL find_master=False; int i; static pstring servicesf = CONFIGFILE; BOOL lookup_by_ip = False; DEBUGLEVEL = 1; /* Prevent smb.conf setting from overridding */ AllowDebugChange = False; *lookup = 0; TimeInit(); setup_logging(argv[0],True); charset_initialise(); while ((opt = getopt(argc, argv, "d:fB:U:i:s:SMrhART")) != EOF) switch (opt) { case 'B': bcast_addr = *interpret_addr2(optarg); got_bcast = True; use_bcast = True; break; case 'f': give_flags = True; break; case 'U': bcast_addr = *interpret_addr2(optarg); got_bcast = True; use_bcast = False; break; case 'T': translate_addresses = !translate_addresses; break; case 'i': { extern pstring global_scope; pstrcpy(global_scope,optarg); strupper(global_scope); } break; case 'M': find_master = True; break; case 'S': find_status = True; break; case 'R': recursion_desired = True; break; case 'd': DEBUGLEVEL = atoi(optarg); break; case 's': pstrcpy(servicesf, optarg); break; case 'r': RootPort = True; break; case 'h': usage(); exit(0); break; case 'A': lookup_by_ip = True; break; default: usage(); exit(1); } if (argc < 2) { usage(); exit(1); } if (!lp_load(servicesf,True,False,False)) { fprintf(stderr, "Can't load %s - run testparm to debug it\n", servicesf); } load_interfaces(); if (!open_sockets()) return(1); for (i=optind;i<argc;i++) { char *p; struct in_addr ip; fstrcpy(lookup,argv[i]); if(lookup_by_ip) { fstrcpy(lookup,"*"); ip = *interpret_addr2(argv[i]); do_node_status(ServerFD, lookup, lookup_type, ip); continue; } if (find_master) { if (*lookup == '-') { fstrcpy(lookup,"\01\02__MSBROWSE__\02"); lookup_type = 1; } else { lookup_type = 0x1d; } } p = strchr(lookup,'#'); if (p) { *p = '\0'; sscanf(++p,"%x",&lookup_type); } if (!query_one(lookup, lookup_type)) { printf( "name_query failed to find name %s", lookup ); if( 0 != lookup_type ) printf( "#%02x", lookup_type ); printf( "\n" ); } } return(0); }