[Linuxdcpp-team] [Bug 631913] Re: QP - Upload queue notification Support

2012-08-03 Thread Big Muscle
- yes, UploadManager.cpp, line 108 is not protected - although calling ClientManager functions from UploadManager's critical section should be safe, I do not recomment to do it, because it can bring problems in the future (and it is not only about line 293 but also 488 which is called inside lo

[Linuxdcpp-team] [Bug 689460] Re: Different share for different hubs

2012-08-02 Thread Big Muscle
** Changed in: strongdc Status: In Progress => Fix Committed -- You received this bug notification because you are a member of Dcplusplus-team, which is subscribed to DC++. https://bugs.launchpad.net/bugs/689460 Title: Different share for different hubs Status in DC++: Confirmed Stat

[Linuxdcpp-team] [Bug 1027484] Re: Search results and its source thats stored

2012-08-02 Thread Big Muscle
** Changed in: dcplusplus Status: New => Confirmed -- You received this bug notification because you are a member of Dcplusplus-team, which is subscribed to DC++. https://bugs.launchpad.net/bugs/1027484 Title: Search results and its source thats stored Status in DC++: Confirmed Statu

[Linuxdcpp-team] [Bug 631913] Re: QP - Upload queue notification Support

2012-07-26 Thread Big Muscle
Just thinking about purpose of the notifyQueuedUsers() function in that patch. What is this function intended to do? What's the purpose of "freeslots" variable in it? it looks weird and wrong to me, looks like the function is either not finished or just a conglutinate of random code. Will this patc

[Linuxdcpp-team] [Bug 1010996] Re: ADC searches are not handled correctly

2012-06-27 Thread Big Muscle
If it works correctly in NMDC, I did a quick code compare between ADC and NMDC method of ShareManager::Directory::search(...). The biggest difference I see is that nested directories are being compared against "cur" in NMDC but against "aStrings.include" in ADC. I think that "cur" can be modified b

[Linuxdcpp-team] [Bug 206778] Re: DC++ tries to connect/pm through wrong ADC hub

2012-06-21 Thread Big Muscle
** Changed in: strongdc Status: New => In Progress ** Changed in: strongdc Assignee: (unassigned) => Big Muscle (bigmuscle) -- You received this bug notification because you are a member of Dcplusplus-team, which is subscribed to DC++. https://bugs.launchpad.net/bugs/206778

[Linuxdcpp-team] [Bug 206778] Re: DC++ tries to connect/pm through wrong ADC hub

2012-06-11 Thread Big Muscle
I would insist on fixing this bug completely - introduce hubhint in search results (probably via token) + solve the situation when file with different hubhint is being requested but old connection is used (so connection is made via invalid hub). -- You received this bug notification because you a

[Linuxdcpp-team] [Bug 206778] Re: DC++ tries to connect/pm through wrong ADC hub

2012-06-11 Thread Big Muscle
** Also affects: strongdc Importance: Undecided Status: New ** Changed in: strongdc Importance: Undecided => Critical -- You received this bug notification because you are a member of Dcplusplus-team, which is subscribed to DC++. https://bugs.launchpad.net/bugs/206778 Title: DC++

[Linuxdcpp-team] [Bug 689460] Re: Different share for different hubs

2012-06-05 Thread Big Muscle
** Also affects: strongdc Importance: Undecided Status: New ** Changed in: strongdc Status: New => In Progress -- You received this bug notification because you are a member of Dcplusplus-team, which is subscribed to DC++. https://bugs.launchpad.net/bugs/689460 Title: Differe

[Linuxdcpp-team] [Bug 689460] Re: Different share for different hubs

2012-06-05 Thread Big Muscle
I think that your remark is connected with the bug #206778. I think that a) hub-specific userconnections b) disconnect userconnection and make a new one when connection in different hub is wanted should be the only correct solutions. Adding any hub/sid/etc. information into GET command would inc

[Linuxdcpp-team] [Bug 305811] Re: Grant extra slot hangs connection in ADC hubs

2012-06-04 Thread Big Muscle
I set missing token for incoming connections as well as huburl in wx- rev76. I hope this fixes the problem. ** Changed in: strongdc Status: New => Fix Committed -- You received this bug notification because you are a member of Dcplusplus-team, which is subscribed to DC++. https://bugs.lau

[Linuxdcpp-team] [Bug 901237] Re: Possible crash by remote client when downloading partial filelist

2011-12-18 Thread Big Muscle
Possible fix: http://strongdc.svn.sf.net/viewvc/strongdc?view=revision&revision=583 -- You received this bug notification because you are a member of Dcplusplus-team, which is subscribed to the bug report. https://bugs.launchpad.net/bugs/901237 Title: Possible crash by remote client when downl

[Linuxdcpp-team] [Bug 901237] Re: Possible crash by remote client when downloading partial filelist

2011-12-14 Thread Big Muscle
Same crash in similar situation: Remote user is in more hubs with different nicks. I ask for his partial filelist from one hub so it is added with 1st nick.CID into the queue. Before the list is finished, user leaves this hub so only 2nd nick remain valid. Although user is still online, partial fi

[Linuxdcpp-team] [Bug 901237] Re: Possible crash by remote client when downloading partial filelist

2011-12-07 Thread Big Muscle
** Attachment added: "CrashLog.txt" https://bugs.launchpad.net/dcplusplus/+bug/901237/+attachment/2623432/+files/CrashLog.txt -- You received this bug notification because you are a member of Dcplusplus-team, which is subscribed to the bug report. https://bugs.launchpad.net/bugs/901237 Title

[Linuxdcpp-team] [Bug 901237] [NEW] Possible crash by remote client when downloading partial filelist

2011-12-07 Thread Big Muscle
*** This bug is a security vulnerability *** Private security bug reported: This report is just about the bug we discussed in DCDev yesterday. * when client wants to download full/partial filelist, the list name is generated as . * when partial filelist is finished, it must be found in queue so

[Linuxdcpp-team] [Bug 309402] Re: ipv6 support

2011-09-21 Thread Big Muscle
So then the question - how hubs which are running on both version will handle this situation? Hub with 2000 users (1500 via IPv4, 500 via IPv6) - I guess 1500 users can connect only together and 500 the same? So that 500 users can't connect to the 1500 users and vice versa? -- You received this

[Linuxdcpp-team] [Bug 309402] Re: ipv6 support

2011-09-07 Thread Big Muscle
Implementations are different. (See above) -- You received this bug notification because you are a member of Dcplusplus-team, which is a bug assignee. https://bugs.launchpad.net/bugs/309402 Title: ipv6 support Status in ADCH++: In Progress Status in DC++: In Progress Status in Linux DC++:

[Linuxdcpp-team] [Bug 839412] Re: DHT

2011-09-03 Thread Big Muscle
I don't think it's good idea to implement DHT into DC++. Original DC++ should stay classic DC client only. Specialities as DHT should be implemented in its mods only... however, when plugin API is finished I'm planning to write DHT as a additional plugin (and not built-in part of StrongDC++) so if

[Linuxdcpp-team] [Bug 804559] Re: portable semaphore implementation

2011-08-26 Thread Big Muscle
Thanks for your information. I also suggest dropping Semaphore class completely and use boost semaphore directly (of course, when the bug is fixed). -- You received this bug notification because you are a member of Dcplusplus-team, which is subscribed to DC++. https://bugs.launchpad.net/bugs/8045

[Linuxdcpp-team] [Bug 804559] Re: portable semaphore implementation

2011-08-24 Thread Big Muscle
** Also affects: strongdc Importance: Undecided Status: New ** Changed in: strongdc Status: New => Confirmed -- You received this bug notification because you are a member of Dcplusplus-team, which is subscribed to DC++. https://bugs.launchpad.net/bugs/804559 Title: portable

[Linuxdcpp-team] [Bug 309402] Re: ipv6 support

2011-08-05 Thread Big Muscle
Yeah, since I touched Socket layer only, it should work everywhere - ADC, NMDC, DHT, HTTP etc. I just need to test behaviour under *nix systems. Also, I'm not sure about Util::getLocalIp() - but I know exactly that this function doesn't work under *nix correctly. Here, under Ubuntu, it returns alwa

[Linuxdcpp-team] [Bug 309402] Re: ipv6 support

2011-08-05 Thread Big Muscle
so my implementation is here: http://strongdc.svn.sf.net/viewvc/strongdc?view=revision&revision=573 ** Changed in: strongdc Status: In Progress => Fix Committed -- You received this bug notification because you are a member of Dcplusplus-team, which is a bug assignee. https://bugs.launchp

[Linuxdcpp-team] [Bug 309402] Re: ipv6 support

2011-08-04 Thread Big Muscle
eMTee: I think that *nix systems shouldn't be any problem. But I will try it under Ubuntu to be 100% sure. Tehnick: yes, conversions are simple. There is also IN6ADDR_SETV4MAPPED function to simplify that. But I think that adding and removing ":::" prefix from IP addresses should be fine. arn

[Linuxdcpp-team] [Bug 309402] Re: ipv6 support

2011-08-04 Thread Big Muscle
IPv6 support in StrongDC++ is now almost ready - IPv4/IPv6 connections to hubs work, connections between users work correctly too. But there are two possible implementations and each one has its advantages and disadvantages. Now I have to choose one of them: a) hybrid dual-stack + just one IPv6 so

[Linuxdcpp-team] [Bug 309402] Re: ipv6 support

2011-07-31 Thread Big Muscle
I tried uhub version 0.2.0-3293 and IPv6 works there correctly. Now my client is able to connect to IPv4 hubs and IPv6 hubs according to given IP address format. -- You received this bug notification because you are a member of Dcplusplus-team, which is a bug assignee. https://bugs.launchpad.net/

[Linuxdcpp-team] [Bug 309402] Re: ipv6 support

2011-07-28 Thread Big Muscle
I'm on Win7 Pro x64. If I run uhub, it says that it's listening on 0.0.0.0 (which is IPv4 address), If I change config from "any" to ::1, the uhub closes immediately after startup. If I try to connect to hub (listening on 0.0.0.0) via ::1 or that long IPv6 address (which I found in Windows Network

[Linuxdcpp-team] [Bug 309402] Re: ipv6 support

2011-07-28 Thread Big Muscle
and is there any ADC hub able to run on IPv6? I tried that uhub but I was able to run it on IPv4 only. -- You received this bug notification because you are a member of Dcplusplus-team, which is a bug assignee. https://bugs.launchpad.net/bugs/309402 Title: ipv6 support Status in DC++: Confi

[Linuxdcpp-team] [Bug 309402] Re: ipv6 support

2011-07-27 Thread Big Muscle
ned) => Big Muscle (bigmuscle) -- You received this bug notification because you are a member of Dcplusplus-team, which is a bug assignee. https://bugs.launchpad.net/bugs/309402 Title: ipv6 support Status in DC++: Confirmed Status in Linux DC++: Confirmed Status in StrongDC++: In Progres

[Linuxdcpp-team] [Bug 713998] Re: cant use arabic anymore in vista

2011-02-06 Thread Big Muscle
(or you can use StrongDC++ where you can set hub encoding manually) :-P -- You received this bug notification because you are a member of Dcplusplus-team, which is subscribed to DC++. https://bugs.launchpad.net/bugs/713998 Title: cant use arabic anymore in vista Status in DC++: New Bug des

[Linuxdcpp-team] [Bug 713998] Re: cant use arabic anymore in vista

2011-02-06 Thread Big Muscle
I guess you are talking about NMDC hubs. If it's true then you must set up your system correctly, because such hubs use default system encoding. Check Windows control panel, Regional and language settings (are whatever it's called in your language), you must set arabic language there for applicatio

[Linuxdcpp-team] [Bug 713742] Re: TimerManager generate double tick per second on some situations

2011-02-06 Thread Big Muscle
I also think that this kind of bug doesn't cause any real problems in DC++. It just can generate TimerManager's ticks later when you e.g. break in debugger etc. -- You received this bug notification because you are a member of Dcplusplus-team, which is subscribed to DC++. https://bugs.launchpad.n

[Linuxdcpp-team] [Bug 706670] Re: UserCommand Crash in DC++

2011-01-24 Thread Big Muscle
It's not skipped in VS2010, because release version uses "#if (_MSC_VER >= 1400)". However, there was similar problem with invalid timestamp format in previous version and it has been fixed by this invalid parameter handler. But it's true that it still raises assertion hit in debug build. -- You

[Linuxdcpp-team] [Bug 706670] Re: UserCommand Crash in DC++

2011-01-23 Thread Big Muscle
I guess it is just this fix from StrongDC++ - http://strongdc.svn.sf.net/viewvc/strongdc/trunk/client/Util.cpp?r1=499&r2=551 It had been in DC++ too but it was removed. -- You received this bug notification because you are a member of Dcplusplus-team, which is a direct subscriber. https://bugs.l

[Linuxdcpp-team] [Bug 702498] Re: Adding Tray menu Upload/Download Limiter options

2011-01-14 Thread Big Muscle
What about making the speeds dependent on Line speed set in General settings dialog? -- You received this bug notification because you are a member of Dcplusplus-team, which is subscribed to DC++. https://bugs.launchpad.net/bugs/702498 Title: Adding Tray menu Upload/Download Limiter options S

[Linuxdcpp-team] [Bug 698143] Re: PluginAPI Settings Page

2011-01-09 Thread Big Muscle
I saw (in image on adcportal) that plugin page has "Configure" button to configure plugin properties/settings. Shouldn't be prefered that plugins can add their own settings page into dialog (for example like in Miranda)? -- You received this bug notification because you are a member of Dcplusplus

[Linuxdcpp-team] [Bug 678236] Re: Exception on invalid timestamp format

2010-12-12 Thread Big Muscle
I think this is what we need - http://msdn.microsoft.com/en- us/library/ksazx244(v=VS.90).aspx -- You received this bug notification because you are a member of Dcplusplus-team, which is subscribed to DC++. https://bugs.launchpad.net/bugs/678236 Title: Exception on invalid timestamp format St

[Linuxdcpp-team] [Bug 631913] Re: QP - Upload queue notification Support

2010-12-12 Thread Big Muscle
Toast, don't forget that UploadManager::notifyQueuedUsers() (which is needed for correct function) is originally copyrighted by cologic, because it comes from BCDC++. I will try to answer any questions if you have about the code. -- You received this bug notification because you are a member of D

[Linuxdcpp-team] [Bug 678236] Re: Exception on invalid timestamp format

2010-12-12 Thread Big Muscle
This reminds me that I always wanted to know how to avoid problems when formatting string for functions printf, strftime etc. can be set by users. This bug is one case of it. -- You received this bug notification because you are a member of Dcplusplus-team, which is subscribed to DC++. https://bu

[Linuxdcpp-team] [Bug 674816] Re: share rehashing system should be updated

2010-12-06 Thread Big Muscle
That patch seems to be very complicated for me. Especially those comments as "bad bad", "fixme: " or "FIX FIX FIX FIX FIX THIS. NEVER DEALLOCATED". I don't think it should be implemented in DC++ in such way. -- You received this bug notification because you are a member of Dcplusplus-team, which

[Linuxdcpp-team] [Bug 604983] Re: Limiter bug in DC++ 0.762 / 0.770

2010-10-31 Thread Big Muscle
If I remember correctly, I fixed it by simple adding "upLimit == 0" into condition at the beginning of write() function (and similary downLimit in read()), but it is "upTokens == -1" in DC++. StrongDC++'s upLimit and also DC++'s upTokens is set once a second. The difference is that I use upLimit a

[Linuxdcpp-team] [Bug 587597] Re: Plugins support

2010-10-29 Thread Big Muscle
I have one thing. What about putting Client abstract class as a part of plugin API? Then new procotol could be added by plugins (for example DHT could be a separate part). -- Plugins support https://bugs.launchpad.net/bugs/587597 You received this bug notification because you are a member of Dcpl

[Linuxdcpp-team] [Bug 604983] Re: Limiter bug in DC++ 0.762 / 0.770

2010-10-24 Thread Big Muscle
When I wrote new code of limiter, there was a bug with speed set to zero. I fixed it later and sent a patch for DC++ (I think to cologic if I remember correctly). But it was "fixed" there in different way, which cause the problem described here. -- Limiter bug in DC++ 0.762 / 0.770 https://bugs.

[Linuxdcpp-team] [Bug 665515] Re: Winamp Formatting Box

2010-10-24 Thread Big Muscle
Blah, I'm thinking about removing this stupidity from StrongDC++ and it is added into DC++.Strange! -- Winamp Formatting Box https://bugs.launchpad.net/bugs/665515 You received this bug notification because you are a member of Dcplusplus-team, which is subscribed to DC++. Status in DC++: New Bu

[Linuxdcpp-team] [Bug 305811] Re: Grant extra slot hangs connection in ADC hubs

2010-10-24 Thread Big Muscle
I fixed it exactly in the way how I said in my previous post. When user is added to upload queue (waiting users list in DC++), the connection token is saved together with that user. When notifiying this user on "Reserve slot", the saved token is used instead of random one. Check UploadManager.cpp,

[Linuxdcpp-team] [Bug 617757] Re: portable FastCriticalSection implementation

2010-08-20 Thread Big Muscle
I completely removed CriticalSection stuff from StrongDC++ and use only following typedefs: typedef boost::recursive_mutex CriticalSection; typedef boost::detail::spinlock FastCriticalSection; typedef boost::lock_guard Lock; typedef boost::lock_guard FastLock; -- portable FastCriticalSection im

[Linuxdcpp-team] [Bug 596959] Re: win7 in getOsVersion

2010-06-21 Thread Big Muscle
I think this has no sense, because although the function Util::getOsVersion is defined it is never used, so it can be removed completely. -- win7 in getOsVersion https://bugs.launchpad.net/bugs/596959 You received this bug notification because you are a member of Dcplusplus-team, which is subscri

[Linuxdcpp-team] [Bug 189241] Re: Exception Info

2010-06-21 Thread Big Muscle
Although current exception call stack provides same information as old one, the old one was much more inspectional. -- Exception Info https://bugs.launchpad.net/bugs/189241 You received this bug notification because you are a member of Dcplusplus-team, which is subscribed to DC++. Status in DC++

[Linuxdcpp-team] [Bug 587597] Re: Plugins support

2010-06-07 Thread Big Muscle
Does this plugin mechanism support current DC++ listeners? I mean that if something in core will call fire(something,a,b,c), plugins will be able to execute its code for such event? -- Plugins support https://bugs.launchpad.net/bugs/587597 You received this bug notification because you are a memb

[Linuxdcpp-team] [Bug 326541] Re: Request for more filtering options on search

2010-06-07 Thread Big Muscle
To patch: file extensions are already defined in ShareManager, so I don't see any reason why to define them again in SearchManager. -- Request for more filtering options on search https://bugs.launchpad.net/bugs/326541 You received this bug notification because you are a member of Dcplusplus-team

[Linuxdcpp-team] [Bug 550300] Re: Possible file corruption

2010-05-25 Thread Big Muscle
Corruption can't happen with invalid resetPos. Only a crash by doing 5 steps that were described by eMTee. It seems that it is really difficult to reproduce, but this crash has already been reported 140× in StrongDC++ 2.41 (unless there is another bug which has nothing to do with this bug report, b

[Linuxdcpp-team] [Bug 550300] Re: Possible file corruption

2010-05-23 Thread Big Muscle
I finally found where the another problem was. It was caused by incorrect patch, because "getStartPos()" returns offset from the beginning of the file, but "pos" is offset form the beginning of the current segment. So there should be: void resetPos() { pos = 0; } I hope this is correct now and pr

[Linuxdcpp-team] [Bug 550300] Re: Possible file corruption

2010-05-17 Thread Big Muscle
The patch looks ok, I just can't test it now. And what about putting flush() function as a member of Download class? -- Possible file corruption https://bugs.launchpad.net/bugs/550300 You received this bug notification because you are a member of Dcplusplus-team, which is a direct subscriber. St

[Linuxdcpp-team] [Bug 550300] Re: Possible file corruption

2010-05-16 Thread Big Muscle
Attached patch is not complete: a) flush() in DownloadManager can throw also Exception class, but only FileException is handled b) looking at FilteredFile.h (line 105, function flush()), the "flushed" flag is set to true before flushing really occurs. When exception is thrown after that (it can h

[Linuxdcpp-team] [Bug 545264] Re: Shows hub as unregged even if it is offline

2010-05-16 Thread Big Muscle
** Changed in: strongdc Status: New => Fix Committed -- Shows hub as unregged even if it is offline https://bugs.launchpad.net/bugs/545264 You received this bug notification because you are a member of Dcplusplus-team, which is a direct subscriber. Status in DC++: Fix Committed Status in

[Linuxdcpp-team] [Bug 551184] Re: After filelist download DC++ tries to do a folder move operation in some cases

2010-05-16 Thread Big Muscle
** Changed in: strongdc Status: New => Fix Committed -- After filelist download DC++ tries to do a folder move operation in some cases https://bugs.launchpad.net/bugs/551184 You received this bug notification because you are a member of Dcplusplus-team, which is subscribed to DC++. Status

[Linuxdcpp-team] [Bug 580163] Re: partsharing dos n´t work with bloom.dll

2010-05-14 Thread Big Muscle
Is there some description of what bloom filter in ADC does? ADC specs says only how they transferred, but I'm curious in this exact case. Does it work in following way? - client searches for TTH - hubs has this TTH in blooms, so it doesn't have to redirect search request to users - hubs sends res

[Linuxdcpp-team] [Bug 550300] Re: Possible file corruption

2010-05-12 Thread Big Muscle
True, addPos in following line won't be processed when exception in write occurs: d->addPos(d->getFile()->write(aData, aLen), aLen); That's why I said you that this place is only my guess and I'm not sure where the problem exactly is. The only guarantee is that there's still the problem somewhere

[Linuxdcpp-team] [Bug 556853] Re: Its not possible to share a whole drive in random cases

2010-05-08 Thread Big Muscle
** Changed in: strongdc Status: New => Fix Committed -- Its not possible to share a whole drive in random cases https://bugs.launchpad.net/bugs/556853 You received this bug notification because you are a member of Dcplusplus-team, which is subscribed to DC++. Status in DC++: Confirmed Sta

[Linuxdcpp-team] [Bug 556853] Re: Its not possible to share a whole drive in random cases

2010-04-16 Thread Big Muscle
True, attribute of root folder can't be set. However, I still don't see attached patch correct. Since some variables are not initialized, their value can be completely random. And randomness can cause that the patch will work randomly. In other words, "ff != FileFindIter()" will work only if ff and

[Linuxdcpp-team] [Bug 556853] Re: Its not possible to share a whole drive in random cases

2010-04-09 Thread Big Muscle
Ah sorry, my bad. I didn't copy whole text and the last sentence was the most important: - To get the attributes of a root directory, use the GetFileAttributes function. And using this function looks to me much more logical than using FindFirstFile for it. Also, if DirData structure has been nul

[Linuxdcpp-team] [Bug 556853] Re: Its not possible to share a whole drive in random cases

2010-04-07 Thread Big Muscle
Check this in MSDN: As stated previously, you cannot use a trailing backslash (\) in the lpFileName input string for FindFirstFile, therefore it may not be obvious how to search root directories. If you want to see files or get the attributes of a root directory, the following options would app

[Linuxdcpp-team] [Bug 550300] Re: Possible file corruption

2010-04-06 Thread Big Muscle
I didn't open new bug, because both have similar cause - handled exception after last segment's bytes are transferred. -- Possible file corruption https://bugs.launchpad.net/bugs/550300 You received this bug notification because you are a member of Dcplusplus-team, which is a direct subscriber.

[Linuxdcpp-team] [Bug 550300] Re: Possible file corruption

2010-04-06 Thread Big Muscle
I found another possible source of file corruption. When file is being transferred with ZLIB compression, it can happen that decompression error or ""Garbage data after end of stream" exceptions occur after the last bytes of segment has been transferred. These exceptions will be caught in DownloadM

[Linuxdcpp-team] [Bug 550300] Re: Possible file corruption

2010-03-30 Thread Big Muscle
The another possible solution would be flushing in FilteredFile. But upper patch has been tested and it works and doesn't bring any other problems. And just for an order, copyright is given to arne to use in DC++. -- Possible file corruption https://bugs.launchpad.net/bugs/550300 You received thi

[Linuxdcpp-team] [Bug 550300] [NEW] Possible file corruption

2010-03-28 Thread Big Muscle
Public bug reported: This bug happens due to following source code: FilteredFile.h, line 141: flushed = true; Flushed flag is set to true although file is not flushed at this time. It causes that flushing in DownloadManager::endData() fails, because it thinks that file has already been flushed.

[Linuxdcpp-team] [Bug 375918] Re: [ADC] Search filter not work on hub

2010-01-31 Thread Big Muscle
If you check AdcHub::search function, you'll see that file type is used only for searching for TTH and directories. The rest is ignored. The simple solution would be to read all needed extensions (complete list for each type is in ShareManager) and add them as one EX param per one extension. I've b