Compare commits

...

242 Commits

Author SHA1 Message Date
fc20786a5e Bump version to 2.12.0 2016-03-12 03:04:42 -05:00
d48f31191f Updated location of GTK theme engines in 2.24.30. 2016-03-11 21:00:06 -08:00
7c078db879 Fix loading encoding from network list on connect
- Fix setting new encoding when switching networks
- Ignore ports when looking for network by hostname
- Only set UTF-8 when nothing explicitly set

Fixes #1628
2016-03-11 02:15:42 -05:00
ebb0fd6905 identd: Fix leak 2016-03-09 00:38:56 -05:00
ed029357d1 sysinfo: Clean up ifdefs and handle unsupported CPU
Mentioned in #1624
2016-03-06 23:10:04 -05:00
10fa3b1878 build: Keep macros newer than Ubuntu...
Mostly for travis
2016-03-06 19:09:23 -05:00
98b0186feb build: Don't store autoconf-archive macros in repo
The release tarballs will still have them
2016-03-06 18:54:07 -05:00
35254fa6eb win32: Update Python to 3.5 2016-03-06 18:27:59 -05:00
6706b23a0b build: Use more secure flags 2016-03-06 18:27:59 -05:00
df36f88e88 Update translations 2016-02-19 09:54:19 -05:00
94a7fbae02 Fix possible overflow 2016-02-19 09:41:24 -05:00
bae1ebce2f Update network list
- Remove dead ones
- Use SASL and TLS when possible
- Make note of self-signed ones
- Add LibraIRC

Closes #1039
Closes #1512
Closes #1473
2016-02-19 09:39:16 -05:00
50463ca832 Properly handle missing SSL certificate
According to OpenSSL document
(https://www.openssl.org/docs/manmaster/ssl/SSL_get_verify_result.html),
when using SSL_get_verify_result(), the existence of certificate
needs to be checked. However, in current code, it does not.
Therefore, certificate existence check is required for correctly
handling the exception.

Closes #1549
2016-02-19 07:26:50 -05:00
0826e7d353 python: Handle get_info('win_ptr') 2016-02-18 12:59:02 -05:00
aab881fda2 Fix strict prototype warnings 2016-02-18 08:57:22 -05:00
05385f2479 build: Enable more warnings/errors 2016-02-18 08:54:19 -05:00
650bddcfd1 Improve scrollback file handling
- Properly use filesystem encoding
- Validate utf8 when loading (hopefully fixing crashes)
- Use Gio
- Handle Windows line endings
- Remove dead code
- Fix respecting max length of scrollback files
2016-01-31 15:31:15 -05:00
089fe95a42 perl: Fixed warning about duplicate definition of bool. 2016-01-30 19:57:12 -08:00
4362085847 Remove DH-AES/DH-BLOWFISH mechanisms and misc cleanup
- AES and Blowfish mechanisms are deemed insecure and servers
  have removed support for them
- Remove attempts to retry since we only support one mech
- Handle SASL 3.2's new syntax for supported mechs
2016-01-29 17:41:08 -05:00
6b62c4738d Add support for twitch.tv/membership 2016-01-29 15:28:34 -05:00
8da205b0a8 Add support for chghost 2016-01-29 15:28:33 -05:00
981d55e84c Add support for CAP 3.2 2016-01-29 15:28:33 -05:00
35d238ad3a Properly handle a few args optionally starting with :
This is a pervasive problem that will likely show up in
other events also.

Closes #1460
2016-01-28 22:49:23 -05:00
2c8729becd Handle PING and AUTHENTICATE with a prefix
Not the ideal solution..

Closes #1566
2016-01-28 22:38:36 -05:00
35f97b65c1 Sanitize server name for log files
It could contain invalid chars or log to an arbitrary directory
2016-01-28 16:22:04 -05:00
a2c2abd60a Fix missed comma 2016-01-28 16:17:30 -05:00
7a85c9160d Add support for cap-notify 2016-01-28 16:02:04 -05:00
4e061a43b3 Clean up handling CAP LS 2016-01-28 15:18:15 -05:00
5c534ac344 Fix leaks 2016-01-25 23:36:06 -05:00
ea9e8d353b identd: Use GDataInputStream 2016-01-25 22:53:42 -05:00
f14ad5e9dd Add identd to preferences 2016-01-25 22:51:11 -05:00
2226363fd0 Add ctags files to gitignore 2016-01-25 20:39:36 -05:00
5dafa60433 Rename identd variable name 2016-01-25 20:37:53 -05:00
971e5cf4fe Emit word_click even as long as user is not selecting any text when releasing button
This fixes the need to do pixel-perfect clicks to open links in chat
2016-01-10 12:37:30 -08:00
edd57fdc86 .travis.yml: use container-based infrastructure 2015-12-07 18:24:58 -05:00
eab580408c installer: Fixed VS2015 CRT DLL name. 2015-11-26 00:05:38 -08:00
26d3461f46 Make tab completion prefer other people
If you are talking with someone else with the same prefix as your
own nickname, and attempt to tab complete theirs. It will complete
your own nickname before theirs if you talked more recently. Since
people rarely intend to highlight themselves, this improves the
logic to complete your own name only as a last resort.
2015-11-14 23:22:57 -05:00
295061f461 Fix incorrect const usage 2015-11-09 14:51:48 -05:00
0bd15d435a Fix freeing string from g_get_user_name()
Fixes #1540
2015-11-09 14:41:42 -05:00
c8539b93fe xtext: Fix overflow on long lines
xtext keeps a static buffer and uses it for various things
and asserts that every text entry is < 4096. It does
this check on gtk_xtext_append*() except it does the check only on
the right half of text when indent is enabled.

This overflow caused corruption in the xtext struct
changing the url check functions making hovering
with the mouse do 'undefined' things.

In the long term this should be removed for a dynamically
allocated buffer so no arbitrary size limit exists and
text gets cut off.

Fixes #1465
Fixes #1186
Fixes #1206
2015-10-30 01:22:13 -04:00
1e914347d7 configure: Default to generating xz-tarballs only 2015-10-17 09:43:49 +02:00
66eebea2c3 build: Don't dist resources.h resources.c 2015-10-17 09:26:23 +02:00
9e2d5dae5e build: Determine resources-files once instead of three times 2015-10-17 09:13:29 +02:00
b8e7dfa4ba build: Let 'make dist' do a better job 2015-10-16 17:25:01 +02:00
1d8dd50455 win32: Fix installer 2015-10-12 19:26:28 +02:00
7f1ee9dad0 common: Moved some functions over from plugins/sysinfo that are useful for the rest of HC.
OS name, CPU, GPU, HDD info and build arch are now all available within core HC. OS name and build arch are used in the About dialog.
2015-10-12 19:20:53 +02:00
be5e2b9566 win32: Update Visual Studio 2015 redist links in installer 2015-10-11 16:14:23 +02:00
e40fbee772 win32: Add Windows 10 ID to manifest 2015-10-11 16:13:15 +02:00
7247c24e98 readme.md: Update jenkins links 2015-10-11 16:12:37 +02:00
f7e3d3f32c Use VS 2015 2015-10-10 16:14:12 -07:00
671a838b52 fe-gtk: Use manual registration for resources. 2015-10-10 16:14:07 -07:00
6ca29b2eb4 Update logo .ico with new shadow and standard sizes
hexchat.ico now contains all the sizes Windows uses.
2015-10-09 12:52:15 +02:00
15efdd5f2b Update logo SVG to smaller, solid shadow 2015-10-09 12:51:33 +02:00
599f5c7b29 win32: Don't rely on CWD for portable-mode check
Also cache the result...

Fixes #1500
2015-10-05 15:06:57 -04:00
fad8f93ad8 configure: Clean up Python checking
This fixes requiring to add a version every time
a new release comes out...
2015-09-30 03:55:42 -04:00
78486b49d5 Merge pull request #1162 from obskyr/master
Optimized and improved logo SVGs and PNGs.
2015-09-21 12:50:06 -04:00
9c5f577002 Don't use SASL on an unknown network
https://bugzilla.redhat.com/show_bug.cgi?id=1262763
2015-09-14 09:33:06 -04:00
dbad9285b8 TLS: Set SNI hostname before connect 2015-09-11 01:48:29 -04:00
73636a00b5 Removed SeionIRC from the serverlist
I'm removing Seion from the serverlist because it's now mostly a defunct network. One of the servers is completely broken in regards to ipv6 connectivity and SSL, the webchat server hasn't worked for months, and I shut down my server (fox.seion.us) a few days ago.
2015-09-05 13:58:34 +01:00
e7003ef9c6 Improve /mode behavior
This fixes /mode using the name of invalid contexts
and also adds some documentation to what is happening.

In the end though it still must guess between modes
and nicks if ran in a valid context.

Fixes #1470
2015-09-03 02:35:13 -04:00
9664b1b7e3 Fix select regression.
Fix selection when part of the selected text is above/below a border.
Also, fix problems uncovered by static analysis.

Fixes #1261.
2015-08-20 00:23:17 +02:00
422cce6f70 Fix crash in DBus plugin
Closes #1438
2015-08-02 08:06:21 -04:00
afd2135393 Fix possible overflow
gtk_entry_get_text_length() returns len in utf8
chars not in bytes
2015-06-04 04:02:33 -04:00
94ef0fd294 Fix warning 2015-05-28 14:13:34 -04:00
ebe1f824a7 Fix mnemonic collision
Alt+a is used for mark away in the menus and also
highlight all in the search box, change the latter to
alt+h.

Fixes #1008
https://bugzilla.redhat.com/show_bug.cgi?id=1173082
2015-05-27 13:42:59 -04:00
f7bea16e37 xtext: Fix poor performance with nick indent enabled
This fixes xtext re-rendering multiple times when the
indent width is not sufficient

Fixes #1364
Closes #1367
2015-05-18 06:31:00 -04:00
ff9c0dbd5e Update alternative font list 2015-05-08 00:02:09 +02:00
29321c8660 Fixed pango attributes not being applied in some cases.
gtk_entry_get_text_length returns the number of utf-8 characters in the GtkEntry, not the number of bytes in its text.
2015-04-25 16:51:29 -07:00
0b40146b85 Disable pango attributes on sexy entry while it contains preedit text.
Fixes #1360
2015-04-24 19:20:48 -07:00
9b2c560519 Remove unused file 2015-04-23 01:07:31 -04:00
3675302930 travis: But it needs intltool 2015-04-22 23:28:51 -04:00
925570aab1 travis: No longer need gnome-common 2015-04-22 23:24:19 -04:00
498f53b96a travis: No longer need to run ./configure 2015-04-22 23:22:06 -04:00
5263887ac3 configure: Simplify perl tests 2015-04-22 23:14:42 -04:00
73d865b243 configure: Better handling of missing pkgconfig 2015-04-22 22:54:30 -04:00
a3c257bdb4 configure: Consistently use autoconf macros for conditionals 2015-04-22 22:10:52 -04:00
6ad9419693 configure: Target versions of Ubuntu 10.04
travis-ci uses it still...
2015-04-21 23:07:28 -04:00
c5aa91a836 configure: Replace --enable-minimial-flags with standard --disable-debug 2015-04-21 19:16:41 -04:00
b10f94d5f6 configure: Some modernization 2015-04-21 19:16:11 -04:00
9a98de1f65 Remove requirement on gnome-common
I'm sure that will make a few users happy..
2015-04-21 18:44:30 -04:00
7363bc03f2 Remove r from mode buttons
No network can agree on what mode r actually
means so we can't have nice things.

Closes #1287
2015-04-21 16:07:12 -04:00
78e51a4f3f Fix mode button text being cut off
This no longer restricts their width and uses
monospace fonts so they are still the same
width.

Closes #1356
Fixes #1354
2015-04-21 15:35:15 -04:00
174db0eb7f winamp: More code cleanup 2015-04-14 10:02:27 -04:00
f64b61a1b9 winamp: Fix project file
Broken by 72d7f64f8b
2015-04-14 05:41:02 -04:00
a8392c7f95 winamp: Clean up formatting 2015-04-13 16:25:37 -04:00
72d7f64f8b winamp: Fix utf8 song titles
Fixes #1350
2015-04-13 16:25:36 -04:00
c86389f99b Fix possible overflow in pluginpref
Closes #1265
2015-04-07 06:38:59 -04:00
66f2f3a84a Improve /AWAY help message
Closes #1343
2015-04-05 00:54:52 -04:00
f8c7ea3672 Fix some text event descriptions 2015-04-04 04:29:39 -04:00
e313a82ab4 sysinfo: Strip trailing space on video card 2015-03-20 05:38:22 -04:00
9024a5c71b Fix typo 2015-03-20 05:37:27 -04:00
f03b6314b4 Remove unused files 2015-03-20 05:36:51 -04:00
ae2e5ab092 Fix conflicting type in header
gsize and size_t are not the same thing
2015-03-20 04:58:00 -04:00
167eb11ea7 Fixup 455fa24d
-Wformat=2 includes format-nonliteral
2015-03-19 17:21:41 -04:00
1cc06f9301 Fixup dc69f24ae
It still has to be in hex...
2015-03-19 16:47:37 -04:00
455fa24d63 configure: Remove a warning
Used everywhere needs to be fixed
2015-03-19 16:36:43 -04:00
dc69f24ae5 Use correct type for colors 2015-03-19 16:30:03 -04:00
b4906f3d23 Fix warnings 2015-03-19 16:06:49 -04:00
4e338a2b70 configure: Clean up testing warnings and add more 2015-03-19 16:04:04 -04:00
98fefcd162 Switch from mozilla-build to msys2. 2015-03-15 19:06:29 -07:00
fb422732f2 libenchant_win8 needs to depend on common to be able to use config.h 2015-03-08 12:47:03 -07:00
36a8ba126c Fix incorrect timestamp in scrollback with server-time
Fixes #1148
2015-03-02 19:58:27 +01:00
658f30ec43 configure: Don't depend on gtk-2.0.m4
It doesn't really add much value and it
is possible to build fetext without gtk installed
2015-03-01 08:47:35 -05:00
749e5b20da Make use of g_path_is_absolute()
No reason to roll our own.. in multiple places
2015-02-28 07:24:49 -05:00
d78db5070a Consistently use g_fopen()
It handles the correct encoding on win32
2015-02-28 06:47:40 -05:00
a5584c6b57 Clean up some ifdefs
Thankfully somebody already made a define for this, they
just never used it...
2015-02-28 06:43:33 -05:00
97bf0de016 Make Preferences option in plugin tray menu available on all platforms. 2015-02-27 17:33:33 -08:00
b6c4cfa2a3 Fixed undefined behavior causing hover highlights on the plugin tray menu not working.
Fixes #602
2015-02-27 17:24:57 -08:00
ec12871e60 Write scrollback as binary on win32
Proper fix for b66edd3
This issue likely applies elsewhere in HexChat
2015-02-27 16:20:09 -05:00
0a29313fff Remove unused win32 files 2015-02-27 15:06:45 -05:00
b009084a52 Don't install spelling dicts if win8+ 2015-02-22 00:20:26 -05:00
7e7e87600e More type issues/warnings 2015-02-21 21:01:14 -05:00
c36d4859d7 Fix type mismatch 2015-02-21 20:52:43 -05:00
c1d06c7d63 Fixed cast warning, use of uninitialized buffer and whitespace. 2015-02-21 17:28:56 -08:00
5e3355a6c3 Unify sysinfo plugins and add osx support
This does remove the net* commands from the
Unix version that may return at a later date
with OSX and Windows support.

This commit also makes numerious other changes
such as code cleanup, reformatting, etc.

Closes #829
2015-02-21 20:09:15 -05:00
363321dc33 Fixed installer not actually bundling libenchant_win8.dll because it wasn't made to depend on the project. 2015-02-21 03:17:44 -08:00
4d44c17939 Removed unused variables left behind from bbb81af 2015-02-21 03:14:32 -08:00
5b24c60def Win8+ native spell checking requires compiling with Win8 target.
Win8-specific features are still loaded dynamically, so HC still works the same on W7.
2015-02-21 03:12:27 -08:00
96026b82c7 Add support for native win8+ spell checking 2015-02-21 05:54:58 -05:00
e42da22716 Revert "xtext: Unselect old selection on button press" - breaks clicking URLs to open them.
This reverts commit 8ca96d7ea3.
2015-02-20 02:54:41 -08:00
0a8248578f Remove compiled date from about
Distros like Debian depend on repeated builds
having the same results which this breaks.

Since this provides no real value just
remove it.
2015-02-19 21:00:24 -05:00
c87f559334 Fix distfiles 2015-02-15 15:20:38 -05:00
8ca96d7ea3 xtext: Unselect old selection on button press
Fixes #943
Closes #1293
2015-02-15 13:17:55 -05:00
bbb81af550 Removed unnecessary Windows-only code for seeding openssl's RNG.
openssl seeds itself with CryptGenRandom on Windows in the same manner as /dev/(u)random on other OSes.
2015-02-14 00:31:41 -08:00
a22816fbbd Don't try to disable compression if openssl hasn't been compiled with compression support.
The function is still defined in openssl/ssl.h but not in the actual library, so it cannot be linked to.
2015-02-14 00:30:00 -08:00
b6877ccf5c win32: Use WinSparkle for handling updates
Fixes #1282
2015-02-12 19:11:46 -05:00
7063406d6c Remove input_balloon_time setting
This setting doesn't work on most platforms
including some notification daemons on linux.

Where it does work I think it is bad behavior
to default overriding their defaults anyway.

It's most valuable use was likely win32
tray balloons which no longer exist.
2015-02-11 17:58:44 -05:00
9858784eb6 Better project files.
- Output directly to rel\ instead of to bin\ and then copying files over.
- Deduped Win32 vs x64 configs
- Moved some common properties to hexchat.props
- All build intermediates (except htm's intermediates) are no longer emitted in the source directory
2015-02-11 10:01:29 -08:00
7e4a585611 win32: Use https for installer downloads
Fixes #1268
2015-02-11 07:59:48 -05:00
5a87d814cf Call CoInitialize, CoInitializeSecurity and CoUninitialize from the main process, not from a DLL.
They're process-level functions and aren't meant to be called from DLLs. CoInitSecurity in particular fails with RPC_E_TOO_LATE even if no other call to CoCreateInstance has been made yet.

Fixes sysinfo's WMI calls on Windows 8.1 and above.
2015-02-10 22:14:22 -08:00
ac54a2ed45 Allow reordering some dialogs with dnd
This sadly can't work everywhere since they all
have entirely different ways of saving the data..

Related to #1288
2015-02-08 01:51:22 -05:00
296fbaf94f Fix automake error 2015-02-04 21:49:58 -05:00
75c022c49f Implement OSX notification backend 2015-02-04 21:41:10 -05:00
f4f27e438b Implement windows 8.1+ notifications
This splits notifications up into multiple backends
currently only libnotify on unix and win8 toasts.

The win8 backend was originally written by @leeter
though heavily modified.
2015-02-04 20:24:53 -05:00
a216ed1df9 Partial fix for Windows 10 detection 2015-02-04 04:48:44 -08:00
afee9fd42b Only send utf8 string in Key Press event
Fixes #869
2015-02-02 02:56:08 -05:00
60fa7efbc8 Fix logging hostname of queries
- Move query topic setting from frontend (where its too late)
- Respect chanopts for logging hostname
- Open query logfile *after* chanopts loaded
2015-02-01 01:47:50 -05:00
dc9a7d3a59 sysinfo: Fix braindead logic for stripping spaces from the end of the OS name. 2015-01-31 21:29:10 -08:00
1d83610341 Save iconv converters for input and output in the server.
These are then used with g_convert_with_iconv instead of making it create a new iconv converter every time for the given from-to-encoding pairs.
2015-01-31 00:52:31 -08:00
5dde0d7c6d Also verify encoding read from servlist.conf 2015-01-31 00:52:30 -08:00
9968bb31a4 sysinfo: Strip spaces from the end of the OS name, if any, and ensure a space between name and arch. 2015-01-31 00:52:30 -08:00
5fe2dda146 ssl: Remove unused server code 2015-01-30 21:25:41 -05:00
85fd6f525e Add default keybinding for shift+tab (Previous tab complete) 2015-01-26 17:53:33 -05:00
e5b65bbd69 servlist: Clean up specifying ssl for network 2015-01-20 03:03:45 -05:00
a838cd9c07 servlist: Various changes
- Remove IRCNode
- Replace Techmans with Techtronix
- Remove unecessary ports
- Consistently use round-robin over specific servers
- Don't use mixed-case hostnames

Closes #1244
2015-01-20 02:43:16 -05:00
02470dffa5 servlist: Add AthemeNet and remove its old networks
Closes #1272
2015-01-19 11:31:42 -05:00
c5bbf75f5e Removed one leftover check for server->encoding against NULL. 2015-01-18 02:55:32 -08:00
b783c827c8 Fixed incorrect comment on server->encoding. 2015-01-18 02:27:38 -08:00
d1897c1602 Remove "System default" encoding. The default for new servers is UTF-8. 2015-01-18 02:10:05 -08:00
6f8a6e66cc Detect unknown server encodings and set to UTF-8. 2015-01-18 02:10:05 -08:00
5749c53484 Server line text-encoding-related fixes.
- Handle server lines that contain sequences which are invalid in the server encoding. Previously, these would cause the whole line to be interpreted in ISO-8859-1, but now they're simply replaced with an appropriate replacement character.

- Removed prefs.utf8_locale.

- Change default server encoding from system locale to UTF-8.

- Always populate server->encoding with a non-null value - UTF-8.

Fixes #1198
2015-01-18 02:10:04 -08:00
5569205d15 Add CP1252 as an available server encoding for Windows-1252 and ISO-8859-1 networks. 2015-01-18 02:10:04 -08:00
2e76a4e477 Removed CP1255-specific handling of server lines.
GLib's API is good enough now.
2015-01-18 02:10:03 -08:00
ee17ec6b4f Removed legacy "IRC" encoding. 2015-01-18 02:10:03 -08:00
5a56f9ea01 Removed unimplemented, unused function. 2015-01-14 23:42:21 -08:00
e400ed2855 Fixed bad const-cast. 2015-01-14 21:38:19 -08:00
1d316710ed Don't crash if the log file can't be opened.
Found in #1269
2015-01-14 16:29:03 -08:00
aab243592f Workaround crash when timestamp format is blank
Somebody else can fix the numerous assumptions elsewhere
2015-01-13 04:14:32 -05:00
13db2011e3 Fix leak
From libressl-portable/openbsd@20de8a4923
2015-01-09 17:25:45 -05:00
7739c99f3f Update alternative font list 2015-01-07 22:46:37 +01:00
99f74e8d94 Also print the command that wasn't recognized. 2015-01-07 13:42:42 -08:00
5ca87b3c8d identd: Fix unknown command when service fails to start 2015-01-07 16:21:46 -05:00
62df565190 sysinfo: Also show HDD information. 2015-01-05 03:57:59 -08:00
4f08b0b386 sysinfo: Don't confuse build architecture with CPU architecture. 2015-01-04 16:54:15 -08:00
5b8cc683f3 sysinfo: Refactored out individual WMI parsing methods. 2015-01-04 15:08:45 -08:00
e758da5d28 Bring the sysinfo plugin to the 21st century.
- Support multiple CPUs and graphics adapters in the WMI responses.
- Query max CPU frequency from WMI instead of registry.
- Support uptimes longer than 50 days.
- Don't report using /ME in notice and server notice tabs.
- Convert to C
2015-01-03 15:26:05 -08:00
16d1fccf61 Fix disabling identd server 2015-01-03 18:00:37 -05:00
086d4e3962 python: Use Py_RETURN_NONE macro 2014-12-31 15:11:47 -05:00
9bd7405502 Remove last remnants of GtkClists
These were removed a while ago
2014-12-31 11:57:27 -05:00
2a28289314 Don't return 0 in place of NULL 2014-12-31 11:31:17 -05:00
112632bb4e Fix some possible null-deref warnings 2014-12-31 11:12:43 -05:00
c5016e390f Show correct number of channels/dialogs when closing server tab 2014-12-31 10:50:13 -05:00
63bb87fc93 Don't select join #hexchat by default in join dialog
Have to go even one step further removed so users don't
accidentally join
2014-12-31 10:44:36 -05:00
1fa4a000e7 Fix some unused warnings 2014-12-31 10:24:51 -05:00
448cc962cd Python: Fix overflow and code-cleanup 2014-12-31 09:50:03 -05:00
6ef7298870 Remove unnecessary use of void* 2014-12-31 03:56:36 -05:00
9f7444baa2 Move userlist sorting to frontend
This Fixes possible crashes when the two
usertrees get out of sync and a double free occurs.

Also now requires restart to change sort orders.

Fixes #1252
Fixes #818 (probably)
2014-12-31 03:56:36 -05:00
fef580ed7f Rewrite identd
- Use gio (which is cross platform)
- Properly support multiple users
- Allow configuring port
- Allow other plugins overriding
2014-12-30 06:35:42 -05:00
3bb717a3b5 Fix windows build
Introduced 1b2bee37e
2014-12-29 02:08:42 -05:00
5beaf15f21 Remove option to use socks5 library
This was always disabled by default and is not required
for the current socks support. I am not even sure this
library is packaged by any distro?
2014-12-28 22:29:06 -05:00
1b2bee37e4 Remove option to disable ipv6
It has been default for a while, is the only tested option,
and will only get more common.
2014-12-28 22:29:06 -05:00
9cb73f839f Remove MSProxy support
It's not enabled anywhere, certainly not maintained
2014-12-28 13:28:19 -05:00
330e31c70f Fix overflow 2014-12-28 12:43:53 -05:00
cbaa04905f Fix warning 2014-12-28 12:38:19 -05:00
14d3a03f41 Fix leak in make-te
This doesn't really matter but it shuts up AddressSanitizer
2014-12-28 08:14:05 -05:00
95febd978c Fix building as c89 2014-12-28 06:47:23 -05:00
3f855f07f5 Use glib for allocations in all plugins
Continuation of 83032b1aa
2014-12-28 06:47:07 -05:00
83032b1aa3 Use glib for all allocations
- Removes need to check for malloc failure
- Removes need for NULL checks on free
- Adds checks for integer overflows
- Removes some extra memset calls
- Removes chance of mixing libc and glib malloc/free
2014-12-28 06:44:44 -05:00
c4cb1b25ec Fixup: Detect urls with unicode symbols
missed one in 77ecaa6093
2014-12-28 00:40:51 -05:00
77ecaa6093 Detect urls with unicode symbols
Fixes #1250
2014-12-28 00:29:58 -05:00
664f6bf1e7 configure: Set glib min requirement to 2.32
and warn when using newer APIs
2014-12-17 18:21:10 -05:00
aeb5d15871 More consistently include config.h 2014-12-17 18:21:10 -05:00
76c2cfebc3 Don't require glib 2.40 2014-12-15 15:34:12 -05:00
addefa9ef1 fishlim: Handle server-time 2014-12-15 15:08:00 -05:00
7769bc99fe fishlim: Use proper filesystem encoding for files 2014-12-15 15:08:00 -05:00
ce396b3ddb fishlim: Use standard keyfile save function 2014-12-15 15:08:00 -05:00
ebe0ad4cd5 fishlim: Strip whitespace when deleting keys
This fixes a personal annoyance when you tab complete
a channel to delete
2014-12-15 15:07:43 -05:00
bdb5c3eb9d fishlim: Use hexchat_nickcmp() 2014-12-15 15:06:48 -05:00
c54a0c6db9 fishlim: Improve string handling 2014-12-15 15:06:48 -05:00
46061f4f3c Remove some unnecessary if statements 2014-12-15 14:51:07 -05:00
ec7a0d6e13 Fixed some more signed-unsigned-comparison warnings. 2014-12-15 10:25:28 -08:00
a86b03e939 Remove unused header 2014-12-15 11:07:47 -05:00
35fd47da55 Add patch from cygwin 2014-12-15 11:07:47 -05:00
2b1396add3 Update .gitignore 2014-12-15 11:07:47 -05:00
0e4164ad0c configure: Improve various build flags
- Store openssl flags in own vars
- Share some common flags for plugins
- Fix building plugins on win32
- Store all glib flags in one var
- Don't link against every lib for each plugin
- Don't hardcode ldflags for sysinfo
2014-12-15 11:07:46 -05:00
94568bc517 checksum: Use glib for io/checksum and misc fixes
- Fixes support for large files.
- Fixes filenames not being passed in the filename encoding.
- Drops openssl dependency.
- Code cleanup.
- Fix 'unknown command' warning.
2014-12-15 10:40:15 -05:00
226d54c90d Fix use after free 2014-12-14 19:35:27 -05:00
7e4c482737 travis: Build with static analysis 2014-12-14 18:20:50 -05:00
ac01ba9cb0 perl: Fixed warning about implicitly casting the time_t returned from hexchat_list_time() to an NV. 2014-12-14 13:31:19 -08:00
a537fa3ca7 sysinfo: Simplify remove_leading_whitespace()
Also fixes a possible overflow
2014-12-11 14:17:12 -05:00
f614a3c311 Fix possible overflow when using /menu 2014-12-11 13:49:37 -05:00
d6e3f740bc Fix some leaks 2014-12-11 12:13:57 -05:00
72f82d096c Fix some warnings in xsys
- Remove unused code
- Fix leak
2014-12-11 10:05:05 -05:00
74ff67acd3 Create configuration option to control middle click tab close.
Some might argue that this shouldn't be able to be configured as it is "common" behaviour
in other programs such as web browsers, but for me it is an annoyance because for 15
years this has not been the behaviour of X-Chat.
Quite simply, this creates a configuration option for 537fb856, as unobtrusively as
possible, under the channel switcher preferences tab.

Closes #1232
2014-12-10 15:09:04 -05:00
6aafc8e51d Fix chanopts not saving if /quit before exit
This is the C fix, unfortunately a proper fix, e.g.
 removing the dependency on session_name all together is a much vaster
 refactor outside the scope of this bugfix.

Closes #1111
2014-12-10 14:40:42 -05:00
10246f121a Fix unsafe string handling in configs
Also fixes 2 leaks
2014-12-10 09:32:16 -05:00
025152ee53 Fix unused warning 2014-12-10 09:00:29 -05:00
58e871696b Fix typo 2014-12-10 09:00:04 -05:00
0ba8b922a2 Fix tab completing with no completion char 2014-12-09 23:03:44 -05:00
b296839538 Respect servers chantypes and nickprefixes when tab completing
Closes #441
2014-12-09 05:45:50 -05:00
5fb21a04ad Use gboolean for bools 2014-12-09 05:45:01 -05:00
fda692d250 Fix various unsafe string handling in fkeys
Also removes the 2048 input byte limit
And fixes utf8 completion chars in some cases
2014-12-09 05:30:35 -05:00
99a1fff590 Removed unused hexchat_filename_*_utf8 macros. 2014-12-08 21:30:02 -08:00
65c8494698 Removed some unnecessary casts. 2014-12-08 21:25:00 -08:00
2b94011fdc Removed some commented-out code. 2014-12-08 21:25:00 -08:00
2da5308fd2 Fixed leak of filename string. 2014-12-08 21:25:00 -08:00
c1831cb19d Minor tidying up 2014-12-08 21:24:59 -08:00
65da34f19e Removed some unnecessary null-checks for calls to g_free and g_strfreev 2014-12-08 21:24:59 -08:00
b7afcc3632 Don't leak filename_fs on errors. 2014-12-08 21:24:58 -08:00
73cd6487d0 Update travis notification format 2014-12-06 17:28:41 -05:00
5152040c17 Always use 64-bit filesize and file offsets in DCC.
Based on LRN's commit for replacing stat with GFileInfo https://github.com/hexchat/hexchat/commit/32008bb

Fixes #382
2014-12-06 14:02:45 -08:00
985ea610e6 Store timer hook's timeout as milliseconds. 2014-12-04 04:06:38 -08:00
8062bce835 Fix some obvious type warnings. 2014-12-04 04:06:38 -08:00
3fbe5b876e Add missing dependencies for glib's g_spawn on windows 2014-12-02 22:12:48 +01:00
e38f00775f configure: Add option to run clang static analysis 2014-12-02 01:06:25 -05:00
05a6097dc6 Fix copying timestamp with server-time and indent nicks off 2014-11-30 22:33:30 -05:00
85557f2416 Fix duplicate timestamps on selection
Fixes #1226
2014-11-30 22:27:00 -05:00
0019af675a Fix compilation on Windows 2014-11-30 20:41:13 +01:00
f03023297b Fix handling --cfgdir
Fixes #1225
2014-11-29 08:31:35 -05:00
c92b247878 Fix building against openssl 0.9.8
Closes #1221
2014-11-26 08:15:34 -05:00
9e9ed54bfa Transparent tray icon background. 2014-10-01 12:26:11 +02:00
aece18dfd5 Optimized and improved logo SVGs and PNGs.
Optimized SVGs by hand, ~80% size reduction.
Optimized SVGs for browsers, can now be rendered properly by Gecko- and
Webkit-based browsers.
Resized SVG page, shadow is no longer cut off to the right.
Switched tray icons for ones without the cut-off shadow.
Optimized and switched icons for the new ones.
2014-09-30 15:24:05 +02:00
276 changed files with 82975 additions and 81068 deletions

7
.gitignore vendored
View File

@ -2,6 +2,7 @@
# Unix generated files
.deps/
.libs/
.dirstamp
Makefile
Makefile.in
aclocal.m4
@ -53,6 +54,8 @@ src/common/textenums.h
src/common/textevents.h
src/fe-gtk/hexchat
src/fe-gtk/hexchat.rc
src/fe-gtk/resources.c
src/fe-gtk/resources.h
src/fe-text/hexchat-text
src/htm/Main.resources
src/htm/thememan.exe
@ -69,10 +72,11 @@ stamp-h1
*.po~
*.pot
*.patch
tags
src/**/*.plist
# Win32 generated files
plugins/wmpa/wmpa_h.h
plugins/wmpa/wmpa_i.c
src/fe-gtk/resources.c
src/htm/obj/*
win32/ipch/*
win32/ext/perl/perl-x86-cache
@ -85,6 +89,7 @@ resource.h
*.sdf
*.suo
*.user
*.exe
#OSX
osx/HexChat.app
osx/.HexChat.app

View File

@ -1,19 +1,34 @@
sudo: false
language: c
compiler:
- gcc
- clang
before_script:
- sudo apt-get update
- sudo apt-get build-dep -qq xchat
- sudo apt-get install -qq libnotify-dev libproxy-dev libpci-dev libcanberra-dev monodevelop gnome-common
script:
- ./autogen.sh
- ./configure --enable-textfe --with-theme-manager
cache: apt
compiler: clang
script:
- ./autogen.sh --enable-textfe --with-theme-manager --enable-static-analysis
- make V=1 -j$(nproc)
notifications:
irc:
channels: "chat.freenode.net#hexchat-devel"
template: "Build #%{build_number} (%{commit}) by %{author}: %{message}"
template: "Build %{build_url} (%{commit} in %{branch}) by %{author}: %{message}"
on_success: change
matrix:
fast_finish: true
addons:
apt:
packages:
- automake
- autoconf-archive
- imagemagick
- intltool
- libcanberra-dev
- libdbus-glib-1-dev
- libglib2.0-dev
- libgtk2.0-dev
- libnotify-dev
- libpci-dev
- libperl-dev
- libproxy-dev
- libssl-dev
- libtool
- monodevelop
- mono-devel
- python-dev

View File

@ -4,5 +4,4 @@ ACLOCAL_AMFLAGS = -I m4
SUBDIRS = po src plugins data
EXTRA_DIST = autogen.sh data
EXTRA_DIST = autogen.sh Doxyfile readme.md

View File

@ -4,19 +4,24 @@
srcdir=`dirname $0`
test -z "$srcdir" && srcdir=.
NOCONFIGURE=1
PKG_NAME="hexchat"
(test -f $srcdir/src/common/hexchat.c) || {
echo -n "**Error**: Directory "\`$srcdir\'" does not look like the"
echo " top-level $PKG_NAME directory"
echo -n "**Error**: Directory "\`$srcdir\'" does not look like the top-level directory"
exit 1
}
which gnome-autogen.sh || {
echo "You need to install gnome-common"
exit 1
}
aclocal --install -I m4 || exit 1
glib-gettextize --force --copy || exit 1
intltoolize --force --copy --automake || exit 1
autoreconf --force --install -Wno-portability || exit 1
. gnome-autogen.sh
if [ "$NOCONFIGURE" = "" ]; then
$srcdir/configure "$@" || exit 1
if [ "$1" = "--help" ]; then exit 0 else
echo "Now type \`make\' to compile" || exit 1
fi
else
echo "Skipping configure process."
fi
set +x

View File

@ -1,8 +1,8 @@
dnl Process this file with autoconf to produce a configure script.
AC_INIT([HexChat],[2.11.0])
AC_INIT([HexChat],[2.12.0])
AC_PREREQ([2.60])
AC_PREREQ([2.64])
AC_COPYRIGHT([Copyright (C) 1998-2010 Peter Zelezny])
AC_CONFIG_HEADERS([config.h])
@ -10,19 +10,29 @@ AC_CONFIG_SRCDIR([configure.ac])
AC_CONFIG_MACRO_DIR([m4])
AM_INIT_AUTOMAKE([1.11 dist-bzip2 subdir-objects no-define foreign])
AM_INIT_AUTOMAKE([1.11.1 dist-xz no-dist-gzip subdir-objects no-define foreign])
AM_SILENT_RULES([yes])
AC_DEFUN([HEX_CHECK_MACRO], [m4_ifndef([$1], [m4_fatal([macro ]$1[ is not defined. Is ]$2[ installed?])])])
HEX_CHECK_MACRO([AX_APPEND_COMPILE_FLAGS], [autoconf-archive])
HEX_CHECK_MACRO([PKG_PROG_PKG_CONFIG], [pkg-config])
AX_IS_RELEASE([minor-version])
AX_CHECK_ENABLE_DEBUG([yes])
AC_USE_SYSTEM_EXTENSIONS
AM_MAINTAINER_MODE
AM_MAINTAINER_MODE([enable])
AC_PROG_CC
AM_PROG_CC_C_O
AC_PROG_CPP
AC_PROG_OBJC
AM_PROG_AS
AM_PROG_AR
AM_DISABLE_STATIC
AC_PROG_LIBTOOL
LT_PREREQ([2.2.6])
LT_INIT([disable-static])
AC_PATH_PROG(MDTOOL, mdtool, no)
PKG_PROG_PKG_CONFIG
dnl -----------------------------------------------------------
dnl Language Support
@ -38,14 +48,12 @@ AH_VERBATIM([OLD_PERL],[#undef OLD_PERL])
AH_VERBATIM([PREFIX],[#undef PREFIX])
AH_VERBATIM([HEXCHATLIBDIR],[#undef HEXCHATLIBDIR])
AH_VERBATIM([HEXCHATSHAREDIR],[#undef HEXCHATSHAREDIR])
AH_VERBATIM([SOCKS],[#undef SOCKS])
AH_VERBATIM([USE_MSPROXY],[#undef USE_MSPROXY])
AH_VERBATIM([USE_LIBPROXY],[#undef USE_LIBPROXY])
AH_VERBATIM([HAVE_LIBPCI],[#undef HAVE_LIBPCI])
AH_VERBATIM([HAVE_ISO_CODES],[#undef HAVE_ISO_CODES])
AH_VERBATIM([HAVE_GTK_MAC],[#undef HAVE_GTK_MAC])
AH_VERBATIM([USE_LIBNOTIFY],[#undef USE_LIBNOTIFY])
AH_VERBATIM([USE_LIBCANBERRA],[#undef USE_LIBCANBERRA])
AH_VERBATIM([USE_IPV6],[#undef USE_IPV6])
AH_VERBATIM([USE_OPENSSL],[#undef USE_OPENSSL])
AH_VERBATIM([USE_PLUGIN],[#undef USE_PLUGIN])
AH_VERBATIM([USE_SIGACTION],[#undef USE_SIGACTION])
@ -55,37 +63,39 @@ AH_VERBATIM([socklen_t],[#undef socklen_t])
AH_VERBATIM([USE_DBUS],[#undef USE_DBUS])
AC_PATH_PROG(sedpath, sed)
if test "_$sedpath" = _; then
AS_IF([test "_$sedpath" = _], [
AC_MSG_ERROR(Cannot find sed: I need it!)
fi
])
AC_PATH_PROG(unamepath, uname)
if test "_$unamepath" = _; then
AS_IF([test "_$unamepath" = _], [
system="unknown"
else
], [
AC_MSG_CHECKING(system type)
system=`$unamepath -s`
AC_MSG_RESULT($system)
if test "$system" = "Linux"; then
AS_IF([test "$system" = "Linux"], [
AC_DEFINE(USING_LINUX)
fi
if test "$system" = "FreeBSD"; then
], [test "$system" = "FreeBSD"], [
AC_DEFINE(USING_FREEBSD)
fi
fi
])
])
platform_win32=no
platform_osx=no
AS_CASE([$host_os],
[*mingw*|*cygwin*|*msys*], [
platform_win32=yes
],
[darwin*], [
platform_osx=yes
]
)
dnl *********************************************************************
dnl ** configure switches ***********************************************
dnl *********************************************************************
AC_ARG_ENABLE(socks,
[AS_HELP_STRING([--enable-socks],[link with SOCKS5 library (default: no)])],
socks=$enableval, socks=no)
AC_ARG_ENABLE(ipv6,
[AS_HELP_STRING([--disable-ipv6],[disable IPv6])],
ipv6=$enableval, ipv6=yes)
AC_ARG_ENABLE(openssl,
[AS_HELP_STRING([--enable-openssl[=PATH]],[enable use of openSSL])],
openssl=$enableval, openssl=yes)
@ -143,10 +153,6 @@ AC_ARG_ENABLE(libcanberra,
[AS_HELP_STRING([--disable-libcanberra],[disable libcanberra support])],
libcanberra=$enableval, libcanberra=yes)
AC_ARG_ENABLE(ntlm,
[AS_HELP_STRING([--enable-ntlm],[enable Microsoft\'s NTLM auth (libntlm) library support (default: no)])],
ntlm=$enableval, ntlm=no)
AC_ARG_ENABLE(libproxy,
[AS_HELP_STRING([--disable-libproxy],[disable libproxy support (default: auto)])],
libproxy=$enableval, libproxy=auto)
@ -155,9 +161,9 @@ AC_ARG_ENABLE(isocodes,
[AS_HELP_STRING([--disable-isocodes],[disable iso-codes with spell-check])],
isocodes=$enableval, isocodes=yes)
AC_ARG_ENABLE(minimal-flags,
[AS_HELP_STRING([--enable-minimal-flags],[only add those CFLAGS that are really needed or not intrusive (default: no)])],
minimalflags=$enableval, minimalflags=no)
AC_ARG_ENABLE(static-analysis,
[AS_HELP_STRING([--enable-static-analysis],[if using clang run static analysis during build (default: no)])],
analyze=$enableval, analyze=no)
AC_ARG_WITH(theme-manager,
[AS_HELP_STRING([--with-theme-manager],[compile theme manager (needs monodevelop, default: off)])],
@ -168,177 +174,133 @@ AC_ARG_WITH(theme-manager,
dnl *********************************************************************
dnl ** THEME-MANAGER ****************************************************
dnl *********************************************************************
if test "x$theme_manager" != "xno" ; then
if test "x$MDTOOL" = "xno"; then
AS_IF([test "x$theme_manager" != "xno"], [
AS_IF([test "x$MDTOOL" = "xno"], [
AC_MSG_ERROR([No "mdtool" found, you need to install monodevelop!])
fi
fi
])
])
dnl *********************************************************************
dnl ** GLIB *************************************************************
dnl *********************************************************************
AM_PATH_GLIB_2_0(2.28.0, glib=yes, glib=no)
if test "$glib" = no; then
AC_MSG_ERROR(Cannot find GLib!)
fi
PKG_CHECK_MODULES([GOBJECT], [gobject-2.0], [], [AC_MSG_ERROR(Cannot find gobject-2.0!)])
PKG_CHECK_MODULES([GIO], [gio-2.0], [], [AC_MSG_ERROR(Cannot find gio-2.0!)])
PKG_CHECK_MODULES([GMODULE], [gmodule-2.0], [], [AC_MSG_ERROR(Cannot find gmodule-2.0!)])
COMMON_CFLAGS="$GLIB_CFLAGS $GIO_CFLAGS $GOBJECT_CFLAGS $GMODULE_CFLAGS -DG_DISABLE_SINGLE_INCLUDES"
COMMON_LIBS="$GLIB_LIBS $GIO_LIBS $GOBJECT_LIBS $GMODULE_LIBS"
AM_PATH_GLIB_2_0([2.32.0], [], [AC_MSG_ERROR([Glib not found!])], [gmodule gobject gio])
COMMON_CFLAGS="$GLIB_CFLAGS -DG_DISABLE_SINGLE_INCLUDES"
COMMON_LIBS="$GLIB_LIBS"
AC_DEFINE([GLIB_VERSION_MIN_REQUIRED], [GLIB_VERSION_2_32], [Dont warn using older APIs])
AC_DEFINE([GLIB_VERSION_MAX_ALLOWED], [GLIB_VERSION_2_32], [Prevents using newer APIs])
dnl *********************************************************************
dnl ** GTK **************************************************************
dnl *********************************************************************
# we might get undefined macro without this test
if test "$gtkfe" = yes ; then
AM_PATH_GTK_2_0(2.24.0, havegtk=yes, havegtk=no)
if test "$havegtk" = no; then
AS_IF([test "$gtkfe" = yes], [
PKG_CHECK_MODULES(GTK, [gtk+-2.0 >= 2.24.0], [
GUI_LIBS="$GUI_LIBS $GTK_LIBS"
GUI_CFLAGS="$GUI_CFLAGS $GTK_CFLAGS -DGDK_PIXBUF_DISABLE_SINGLE_INCLUDES -DGTK_DISABLE_SINGLE_INCLUDES -DGTK_DISABLE_DEPRECATED"
], [
gtkfe=no
echo
echo Cannot find GTK\! Not building GTK FrontEnd.
echo
fi
fi
GUI_LIBS="$GUI_LIBS $GTK_LIBS"
GUI_CFLAGS="$GUI_CFLAGS $GTK_CFLAGS -DG_DISABLE_SINGLE_INCLUDES -DGDK_PIXBUF_DISABLE_SINGLE_INCLUDES -DGTK_DISABLE_SINGLE_INCLUDES -DGTK_DISABLE_DEPRECATED"
])
])
dnl *********************************************************************
dnl ** MAC_INTEGRATION **************************************************
dnl *********************************************************************
_gdk_tgt=`$PKG_CONFIG --variable=target gdk-2.0`
if test "x$_gdk_tgt" = xquartz; then
PKG_CHECK_MODULES(GTK_MAC, gtk-mac-integration-gtk2, [
GUI_LIBS="$GUI_LIBS $GTK_MAC_LIBS"
GUI_CFLAGS="$GUI_CFLAGS $GTK_MAC_CFLAGS"
AC_DEFINE(HAVE_GTK_MAC)
])
fi
AS_IF([test "x$_gdk_tgt" = xquartz], [
PKG_CHECK_MODULES(GTK_MAC, gtk-mac-integration-gtk2, [
GUI_LIBS="$GUI_LIBS $GTK_MAC_LIBS"
GUI_CFLAGS="$GUI_CFLAGS $GTK_MAC_CFLAGS"
AC_DEFINE(HAVE_GTK_MAC)
])
])
dnl *********************************************************************
dnl ** PERL *************************************************************
dnl *********************************************************************
if test "$perl" = yes; then
AS_IF([test "$perl" = yes], [
AC_MSG_CHECKING(for plugin interface used by Perl)
if test "$plugin" = yes; then
AS_IF([test "$plugin" = yes], [
AC_MSG_RESULT([yes])
AC_PATH_PROG(perlpath, perl)
AC_MSG_CHECKING(for Perl compile flags)
PERL_CFLAGS=`$perlpath -MExtUtils::Embed -e ccopts 2>/dev/null`
if test "_$PERL_CFLAGS" = _ ; then
AC_MSG_RESULT([not found, building without perl.])
perl=no
else
PERL_LDFLAGS=`$perlpath -MExtUtils::Embed -e ldopts |$sedpath 's/-lgdbm //'`
PERL_LDFLAGS=`echo $PERL_LDFLAGS |$sedpath 's/-ldb //'`
PERL_LDFLAGS=`echo $PERL_LDFLAGS |$sedpath 's/-lndbm //'`
if test "$system" = "Linux"; then
PERL_LDFLAGS=`echo $PERL_LDFLAGS |$sedpath 's/-lnsl //'`
PERL_LDFLAGS=`echo $PERL_LDFLAGS |$sedpath 's/-lposix //'`
fi
PERL_LDFLAGS=`echo $PERL_LDFLAGS |$sedpath 's/-lc //'`
AC_MSG_RESULT(ok)
AC_MSG_CHECKING(for perl >= 5.8.0)
PERL_VER=`$perlpath -e 'print $]>= 5.008?"yes":"no"'`
if test "$PERL_VER" = "yes"; then
original_cflags="$CFLAGS"
original_ldflags="$LDFLAGS"
CFLAGS="$PERL_CFLAGS"
LDFLAGS="$PERL_LDFLAGS"
AC_TRY_LINK([
#define PERL_NO_INLINE_FUNCTIONS
#include <EXTERN.h>
#include <perl.h>
], [], perl_is_usable=yes, perl_is_usable=no)
CFLAGS="$original_cflags"
LDFLAGS="$original_ldflags"
if test x$perl_is_usable = xno ; then
AC_MSG_RESULT(no)
perl=no
else
AC_MSG_RESULT(yes)
AC_MSG_CHECKING(if perl plugin will be backward compatible)
if test "$perl_old" = "yes"; then
AC_MSG_RESULT(yes)
AC_DEFINE(OLD_PERL)
else
AC_MSG_RESULT(no)
fi
fi
else
AC_MSG_RESULT(no)
echo "perl version too old, building without perl."
perl=no
fi
fi
else
AX_PERL_EXT_FLAGS([PERL_CFLAGS], [PERL_LDFLAGS])
original_cflags="$CFLAGS"
original_ldflags="$LDFLAGS"
CFLAGS="$PERL_CFLAGS"
LDFLAGS="$PERL_LDFLAGS"
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
#define PERL_NO_INLINE_FUNCTIONS
#include <EXTERN.h>
#include <perl.h>
]], [[]])],[perl_is_usable=yes],[perl_is_usable=no])
CFLAGS="$original_cflags"
LDFLAGS="$original_ldflags"
AS_IF([test "$perl_is_usable" = "no"], [
AC_MSG_WARN([perl test failed to compile, disabling])
perl=no
], [
AC_MSG_CHECKING([if perl plugin will be backward compatible])
AS_IF([test "$perl_old" = "yes"], [
AC_MSG_RESULT([yes])
AC_DEFINE(OLD_PERL)
], [
AC_MSG_RESULT([no])
])
])
], [
AC_MSG_RESULT([plugins are disabled, use the --enable-plugin option for Perl])
perl=no
fi
fi
])
])
dnl *********************************************************************
dnl ** PYTHON ***********************************************************
dnl *********************************************************************
if test "x$python" != xno ; then
AS_IF([test "x$python" != xno], [
AC_MSG_CHECKING(for plugin interface used by Python)
if test "$plugin" = yes; then
AS_IF([test "$plugin" = yes], [
AC_MSG_RESULT([yes])
case $python in
AS_CASE([$python],
dnl set python2 default here
python2)
PKG_CHECK_MODULES([PY], [python-2.7],
[PY_VER="`$PKG_CONFIG --modversion python-2.7`"],
[true])
;;
[python2], [
PYTHON_VERSION=2
AX_PYTHON_DEVEL([>= '2.7'])
],
dnl set python3 default here
python3)
PKG_CHECK_MODULES([PY], [python-3.4],
[PY_VER="`$PKG_CONFIG --modversion python-3.4`"],
[true])
if test "$PY_VER" = "" ; then
PKG_CHECK_MODULES([PY], [python-3.3],
[PY_VER="`$PKG_CONFIG --modversion python-3.3`"],
[true])
fi
;;
[python3], [
PYTHON_VERSION=3
AX_PYTHON_DEVEL([>= '3.3'])
],
dnl add broken versions here
python2.5|python2.6|python3.1|python3.2)
AC_MSG_WARN(Unsupported Python version ${python}!);;
python*)
python="python-${python#python}" # stay posix compliant
PKG_CHECK_MODULES([PY], [${python}],
[PY_VER="`$PKG_CONFIG --modversion ${python}`"],
[AC_MSG_WARN(Cannot find "${python}.pc"!)])
;;
*)
[python2.5|python2.6|python3.1|python3.2], [
AC_MSG_WARN(Unsupported Python version ${python}!)
],
dnl user supplied version
[python*], [
PYTHON_VERSION="${python#python}"
AX_PYTHON_DEVEL()
],[
AC_MSG_WARN(Unsupported Python ${python}!)
esac
]
)
AC_MSG_CHECKING(Python version)
if test "$PY_VER"; then
AC_MSG_RESULT($PY_VER)
python="python-${PY_VER}"
else
AS_IF([test "$ac_python_version" != ""], [
AC_MSG_RESULT($ac_python_version)
python="python-${ac_python_version}"
], [
AC_MSG_RESULT(Not found)
python=no
fi
else
])
], [
AC_MSG_RESULT([plugins are disabled, use the --enable-plugin option for Python])
python=no
fi
fi
])
])
dnl *********************************************************************
dnl ** IPv6 *************************************************************
@ -354,182 +316,175 @@ AC_CHECK_FUNC(select, ,
AC_MSG_WARN(i can not find select. you might need to help me)))))))
AC_CHECK_LIB(socket, select)
if test "$ipv6" = yes; then
AC_CHECK_FUNCS(getaddrinfo, have_getaddrinfo=yes)
AC_MSG_CHECKING(whether to enable IPv6 support)
if test "$have_getaddrinfo" = yes; then
AC_MSG_RESULT(yes)
AC_DEFINE(USE_IPV6)
else
ipv6=no
AC_MSG_RESULT(no)
fi
fi
AC_CHECK_FUNCS(getaddrinfo, have_getaddrinfo=yes)
AC_MSG_CHECKING(whether IPv6 is supported)
AS_IF([test "$have_getaddrinfo" = yes], [
AC_MSG_RESULT(yes)
], [
AC_MSG_RESULT(no)
AC_MSG_ERROR(ipv6 support not found!)
])
dnl *********************************************************************
dnl ** OPENSSL **********************************************************
dnl *********************************************************************
retry=no
if test "$openssl" != no; then
AC_MSG_CHECKING(for openssl through pkg-config)
if $PKG_CONFIG openssl --exists; then
CPPFLAGS="$CPPFLAGS `$PKG_CONFIG openssl --cflags`"
LIBS="$LIBS `$PKG_CONFIG openssl --libs`"
AC_DEFINE(USE_OPENSSL)
AC_MSG_RESULT(yes)
openssl=yes
else
AC_MSG_RESULT(no)
retry=yes
fi
fi
if test "$retry" = "yes"; then
unset openssl_path ac_cv_lib_ssl_SSL_new ac_cv_header_openssl_ssl_h
if test "$openssl" != yes; then
openssl_path=$openssl
fi
openssl=no
SAVED_LIBS=$LIBS
LIBS="$LIBS -lcrypto"
if test -n "$openssl_path"; then
LIBS="-L$openssl_path/lib $LIBS"
fi
AC_CHECK_LIB(ssl, SSL_new, have_openssl=yes)
LIBS=$SAVED_LIBS
if test "$have_openssl" = yes; then
SAVED_CPPFLAGS=$CPPFLAGS
if test -n "$openssl_path"; then
CPPFLAGS="-I$openssl_path/include $CPPFLAGS"
fi
AC_CHECK_HEADERS(openssl/ssl.h, have_openssl_h=yes)
if test "$have_openssl_h" = yes; then
openssl=yes
AC_DEFINE(USE_OPENSSL)
LIBS="$LIBS -lssl -lcrypto"
if test -n "$openssl_path"; then
LIBS="-L$openssl_path/lib $LIBS"
fi
else
CPPFLAGS=$SAVED_CPPFLAGS
fi
fi
fi
AS_IF([test "$openssl" != no], [
PKG_CHECK_MODULES(OPENSSL, [openssl], [
AC_DEFINE(USE_OPENSSL)
openssl=yes
COMMON_LIBS="$COMMON_LIBS $OPENSSL_LIBS"
COMMON_CFLAGS="$COMMON_CFLAGS $OPENSSL_CFLAGS"
], [
unset openssl_path ac_cv_lib_ssl_SSL_new ac_cv_header_openssl_ssl_h
AS_IF([test "$openssl" != yes], [
openssl_path=$openssl
])
openssl=no
OPENSSL_LIBS="-lcrypto"
AS_IF([test -n "$openssl_path"], [
OPENSSL_LIBS="-L$openssl_path/lib $OPENSSL_LIBS"
])
SAVED_LIBS=$LIBS
LIBS="$LIBS $OPENSSL_LIBS"
AC_CHECK_LIB(ssl, SSL_new, [
AS_IF([test -n "$openssl_path"], [
OPENSSL_CFLAGS="-I$openssl_path/include"
])
SAVED_CFLAGS=$CFLAGS
CFLAGS="$CFLAGS $OPENSSL_CFLAGS"
AC_CHECK_HEADERS(openssl/ssl.h, [
openssl=yes
AC_DEFINE(USE_OPENSSL)
OPENSSL_LIBS="$OPENSSL_LIBS -lssl"
COMMON_LIBS="$COMMON_LIBS $OPENSSL_LIBS"
COMMON_CFLAGS="$COMMON_CFLAGS $OPENSSL_CFLAGS"
])
CFLAGS=$SAVED_CFLAGS
])
LIBS=$SAVED_LIBS
])
])
dnl *********************************************************************
dnl ** LIBPROXY *********************************************************
dnl *********************************************************************
if test "x$libproxy" = "xyes" -o "x$libproxy" = "xauto" ; then
AS_IF([test "x$libproxy" = "xyes" -o "x$libproxy" = "xauto"], [
PKG_CHECK_MODULES([LIBPROXY], [libproxy-1.0], [
COMMON_LIBS="$COMMON_LIBS $LIBPROXY_LIBS"
COMMON_CFLAGS="$COMMON_CFLAGS $LIBPROXY_CFLAGS"
AC_DEFINE(USE_LIBPROXY)
libproxy=yes
], [
if test "x$libproxy" = "xyes" ; then
AS_IF([test "x$libproxy" = "xyes"], [
AC_MSG_ERROR(Cannot find libproxy!)
fi
])
libproxy=no
])
else
], [
libproxy=no
fi
])
dnl *********************************************************************
dnl ** PLUGIN ***********************************************************
dnl *********************************************************************
if test "$plugin" = yes; then
AS_IF([test "$plugin" = yes], [
AC_DEFINE(USE_PLUGIN)
fi
PLUGIN_LDFLAGS="-avoid-version"
AS_IF([test "$platform_win32" = yes], [
PLUGIN_LDFLAGS="$PLUGIN_LDFLAGS -no-undefined"
])
])
dnl *********************************************************************
dnl ** Checksum *********************************************************
dnl *********************************************************************
if test "$checksum" != "no"; then
AS_IF([test "$checksum" != "no"], [
checksum=no
AC_MSG_CHECKING(for plugin interface used by Checksum)
if test "$plugin" = yes; then
AS_IF([test "$plugin" = yes], [
checksum=yes
AC_MSG_RESULT([yes])
AC_MSG_CHECKING(for OpenSSL used by Checksum)
if test "$openssl" = yes; then
checksum=yes
AC_MSG_RESULT([yes])
else
AC_MSG_RESULT([OpenSSL cannot be found, use the --enable-openssl option])
fi
else
], [
AC_MSG_RESULT([plugins are disabled, use the --enable-plugin option])
fi
fi
])
])
dnl *********************************************************************
dnl ** DO AT ************************************************************
dnl *********************************************************************
if test "$doat" != "no"; then
AS_IF([test "$doat" != "no"], [
AC_MSG_CHECKING(for plugin interface used by Do At)
doat=no
if test "$plugin" = yes; then
AS_IF([test "$plugin" = yes], [
doat=yes
AC_MSG_RESULT([yes])
else
], [
AC_MSG_RESULT([plugins are disabled, use the --enable-plugin option for Do At])
fi
fi
])
])
dnl *********************************************************************
dnl ** FiSHLiM **********************************************************
dnl *********************************************************************
if test "$fishlim" != "no"; then
AS_IF([test "$fishlim" != "no"], [
fishlim=no
AC_MSG_CHECKING(for plugin interface used by FiSHLiM)
if test "$plugin" = yes; then
AS_IF([test "$plugin" = yes], [
AC_MSG_RESULT([yes])
AC_MSG_CHECKING(for OpenSSL used by FiSHLiM)
if test "$openssl" = yes; then
AS_IF([test "$openssl" = yes], [
fishlim=yes
AC_MSG_RESULT([yes])
else
], [
AC_MSG_RESULT([OpenSSL cannot be found, use the --enable-openssl option])
fi
else
])
], [
AC_MSG_RESULT([plugins are disabled, use the --enable-plugin option])
fi
fi
])
])
dnl *********************************************************************
dnl ** SYSINFO **********************************************************
dnl *********************************************************************
if test "$sysinfo" != "no"; then
AS_IF([test "$sysinfo" != "no"], [
AC_MSG_CHECKING(for plugin interface used by SysInfo)
if test "$plugin" = yes; then
AS_IF([test "$plugin" = yes], [
AC_MSG_RESULT([yes])
PKG_CHECK_MODULES(LIBPCI, libpci >= 3.0.0, [sysinfo=yes], [sysinfo=no])
else
AS_IF([test "$platform_osx" = yes], [
sysinfo=yes
], [
PKG_CHECK_MODULES(LIBPCI, libpci >= 3.0.0, [
sysinfo=yes
AC_DEFINE(HAVE_LIBPCI)
], [sysinfo=no])
])
], [
AC_MSG_RESULT([plugins are disabled, use the --enable-plugin option for SysInfo])
sysinfo=no
fi
fi
])
])
dnl #######################################################################
dnl # Check for DBUS libraries
dnl #######################################################################
if test "x$dbus" = "xyes" ; then
AS_IF([test "x$dbus" = "xyes"], [
PKG_CHECK_MODULES(DBUS, [dbus-1 >= 0.60 dbus-glib-1 >= 0.60 gthread-2.0], dbus=yes, [
dbus=no
])
AC_PATH_PROG(DBUS_BINDING_TOOL, dbus-binding-tool, no)
AC_PATH_PROG(GLIB_GENMARSHAL, glib-genmarshal, no)
if test "x$DBUS_BINDING_TOOL" = "xno" || test "x$GLIB_GENMARSHAL" = "xno" || test "x$dbus" = "xno" ; then
AS_IF([test "x$DBUS_BINDING_TOOL" = "xno" || test "x$dbus" = "xno"], [
dbus="no"
else
], [
COMMON_LIBS="$COMMON_LIBS $DBUS_LIBS"
COMMON_CFLAGS="$COMMON_CFLAGS $DBUS_CFLAGS"
AC_DEFINE(USE_DBUS)
@ -537,44 +492,44 @@ if test "x$dbus" = "xyes" ; then
AS_AC_EXPAND(DBUS_SERVICES_DIR, "$datadir/dbus-1/services")
AC_SUBST(DBUS_SERVICES_DIR)
AC_DEFINE_UNQUOTED(DBUS_SERVICES_DIR, "$DBUS_SERVICES_DIR", [Where services dir for DBUS is])
fi
fi
])
])
dnl *********************************************************************
dnl ** LIBNOTIFY ********************************************************
dnl *********************************************************************
if test "x$libnotify" = "xyes" ; then
AS_IF([test "x$libnotify" = "xyes"], [
PKG_CHECK_MODULES(LIBNOTIFY, libnotify >= 0.4, [], [
libnotify=no
])
if test "$libnotify" != "no" ; then
AS_IF([test "$libnotify" != "no"], [
GUI_LIBS="$GUI_LIBS $LIBNOTIFY_LIBS"
GUI_CFLAGS="$GUI_CFLAGS $LIBNOTIFY_CFLAGS"
AC_DEFINE(USE_LIBNOTIFY)
fi
fi
])
])
dnl *********************************************************************
dnl ** LIBCANBERRA ******************************************************
dnl *********************************************************************
if test "x$libcanberra" = "xyes" ; then
AS_IF([test "x$libcanberra" = "xyes"], [
PKG_CHECK_MODULES(LIBCANBERRA, libcanberra >= 0.22, [], [
libcanberra=no
])
if test "$libcanberra" != "no" ; then
AS_IF([test "$libcanberra" != "no"], [
COMMON_LIBS="$COMMON_LIBS $LIBCANBERRA_LIBS"
COMMON_CFLAGS="$COMMON_CFLAGS $LIBCANBERRA_CFLAGS"
AC_DEFINE(USE_LIBCANBERRA)
fi
fi
])
])
dnl *********************************************************************
dnl ** SPELL ************************************************************
dnl *********************************************************************
if test "x$isocodes" = "xyes" ; then
AS_IF([test "x$isocodes" = "xyes"], [
PKG_CHECK_MODULES(ISOCODES, "iso-codes", [
iso_codes_prefix=`$PKG_CONFIG --variable=prefix iso-codes 2>/dev/null || echo /usr`
AC_MSG_NOTICE([iso-codes prefix: $iso_codes_prefix])
@ -585,7 +540,18 @@ if test "x$isocodes" = "xyes" ; then
isocodes=no
AC_MSG_WARN(iso-codes not found!)
])
fi
])
dnl *********************************************************************
dnl ** Static Analysis **************************************************
dnl *********************************************************************
AS_IF([test "x$analyze" = "xyes"], [
AS_IF([test "$CC" != "clang"], [
AC_MSG_WARN(CC is not clang for static analysis)
analyze=no
])
])
dnl *********************************************************************
dnl ** CONDITIONALS *****************************************************
@ -594,7 +560,6 @@ dnl *********************************************************************
AM_CONDITIONAL(USE_OPENSSL, test "x$openssl" = "xyes")
AM_CONDITIONAL(USE_LIBNOTIFY, test "x$libnotify" = "xyes")
AM_CONDITIONAL(USE_LIBCANBERRA, test "x$libcanberra" = "xyes")
AM_CONDITIONAL(USE_MSPROXY, test "x$ntlm" = "xyes")
AM_CONDITIONAL(DO_TEXT, test "x$textfe" = "xyes")
AM_CONDITIONAL(DO_GTK, test "x$gtkfe" = "xyes")
AM_CONDITIONAL(DO_PERL, test "x$perl" = "xyes")
@ -604,128 +569,45 @@ AM_CONDITIONAL(DO_CHECKSUM, test "x$checksum" = "xyes")
AM_CONDITIONAL(DO_DOAT, test "x$doat" = "xyes")
AM_CONDITIONAL(DO_FISHLIM, test "x$fishlim" = "xyes")
AM_CONDITIONAL(DO_SYSINFO, test "x$sysinfo" = "xyes")
AM_CONDITIONAL(DO_STATIC_ANALYSIS, test "x$analyze" = "xyes")
AM_CONDITIONAL(USE_DBUS, test "x$dbus" = "xyes")
AM_CONDITIONAL(HAVE_ISO_CODES, test "x$isocodes" = "xyes")
AM_CONDITIONAL(HAVE_GTK_MAC, test "x$_gdk_tgt" = xquartz)
AM_CONDITIONAL(WITH_TM, test "x$theme_manager" != "xno")
AM_CONDITIONAL(PLATFORM_OSX, test "x$platform_osx" == "xyes")
dnl *********************************************************************
dnl ** SOCKS5 ***********************************************************
dnl ** CFLAGS ***********************************************************
dnl *********************************************************************
if test "$socks" = yes; then
socks=no
AC_CHECK_LIB(socks5, SOCKSconnect, have_socks=yes)
if test "$have_socks" = yes; then
AC_CHECK_HEADERS(socks.h, have_socks_h=yes)
if test "$have_socks_h" = yes; then
socks=yes
AC_DEFINE(SOCKS)
LIBS="$LIBS -lsocks5"
fi
fi
fi
dnl *********************************************************************
dnl ** MS PROXY *********************************************************
dnl *********************************************************************
have_ntlm="no"
if test "x$ntlm" = "xyes" ; then
have_ntlm="no"
AC_CHECK_LIB(ntlm, ntlm_smb_encrypt, have_ntlm=yes)
if test "$have_ntlm" = yes; then
LIBS="$LIBS -lntlm"
AC_DEFINE(USE_MSPROXY)
fi
fi
dnl *********************************************************************
dnl ** GCC FLAGS ********************************************************
dnl *********************************************************************
dnl Only use -Wall and -pipe if we have gcc
if test "x$GCC" = "xyes"; then
if test -z "`echo "$CFLAGS" | grep "\-Wall" 2> /dev/null`" ; then
CFLAGS="$CFLAGS -Wall"
fi
dnl these flags might be unwanted
if test x$minimalflags != xyes; then
if test "$system" = "Linux" -o "$system" = "FreeBSD"; then
if test -z "`echo "$CFLAGS" | grep "\-pipe" 2> /dev/null`" ; then
CFLAGS="$CFLAGS -pipe"
fi
fi
if test -z "`echo "$CFLAGS" | grep "\-g " 2> /dev/null`" ; then
CFLAGS="$CFLAGS -g"
fi
fi
fi
dnl does this compiler support -Wno-pointer-sign ?
AC_MSG_CHECKING([if $CC accepts -Wno-pointer-sign ])
safe_CFLAGS=$CFLAGS
CFLAGS="-Wno-pointer-sign"
AC_TRY_COMPILE(, [
return 0;
],
[
no_pointer_sign=yes
AC_MSG_RESULT([yes])
], [
no_pointer_sign=no
AC_MSG_RESULT([no])
AX_APPEND_COMPILE_FLAGS([\
-pipe \
-funsigned-char \
-fstack-protector-strong \
-fPIE \
-fPIC \
-Wall \
-Wextra \
-Wstrict-prototypes \
-Wno-unused-parameter \
-Wno-sign-compare \
-Wno-pointer-sign \
-Wno-missing-field-initializers \
-Wno-unused-result \
-Werror=format-security \
-Werror=init-self \
-Werror=declaration-after-statement \
-Werror=missing-include-dirs \
-Werror=date-time \
-Werror=implicit-function-declaration \
-Werror=pointer-arith \
])
CFLAGS=$safe_CFLAGS
if test x$no_pointer_sign = xyes; then
CFLAGS="$CFLAGS -Wno-pointer-sign"
fi
dnl does this compiler support -funsigned-char ?
AC_MSG_CHECKING([if $CC accepts -funsigned-char ])
safe_CFLAGS=$CFLAGS
CFLAGS="-funsigned-char"
AC_TRY_COMPILE(, [
return 0;
],
[
unsigned_char=yes
AC_MSG_RESULT([yes])
], [
unsigned_char=no
AC_MSG_RESULT([no])
AX_APPEND_LINK_FLAGS([ \
-pie \
-Wl,-z,relro \
-Wl,-z,now \
])
CFLAGS=$safe_CFLAGS
if test x$unsigned_char = xyes; then
CFLAGS="$CFLAGS -funsigned-char"
fi
dnl does this compiler support -Wno-unused-result ?
AC_MSG_CHECKING([if $CC accepts -Wno-unused-result ])
safe_CFLAGS=$CFLAGS
CFLAGS="-Wno-unused-result"
AC_TRY_COMPILE(, [
return 0;
],
[
no_unused_result=yes
AC_MSG_RESULT([yes])
], [
no_unused_result=no
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS
if test x$no_unused_result = xyes; then
CFLAGS="$CFLAGS -Wno-unused-result"
fi
dnl *********************************************************************
dnl ** FUNCTIONS/LIBS/CFLAGS ********************************************
@ -734,19 +616,14 @@ dnl *********************************************************************
AC_MSG_CHECKING(for modern sigaction)
dnl libc5 on linux and FreeBSD 3.x doesn\'t have siginfo_t
dnl and the sa_sigation field.
AC_TRY_COMPILE(
[#include <signal.h>],
[struct sigaction act;
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <signal.h>]], [[struct sigaction act;
siginfo_t *si;
act.sa_sigaction = 0;],
[
act.sa_sigaction = 0;]])],[
AC_MSG_RESULT(yes)
AC_DEFINE(USE_SIGACTION)
],
AC_MSG_RESULT(no))
],[AC_MSG_RESULT(no)])
dnl if we don\'t have this, use g_snprintf instead
AC_CHECK_FUNCS(snprintf vsnprintf memrchr strtoull)
AC_CHECK_FUNCS(memrchr)
AC_CHECK_FUNC(gethostbyname, ,
AC_CHECK_LIB(resolv, gethostbyname, ,
@ -768,9 +645,9 @@ AC_EGREP_CPP([socklen_t[^a-zA-Z_0-9]], [#include <sys/types.h>
ac_cv_type_socklen_t=yes,
ac_cv_type_socklen_t=no)
])
if test $ac_cv_type_socklen_t = no; then
AS_IF([test $ac_cv_type_socklen_t = no], [
AC_DEFINE(socklen_t, int)
fi
])
dnl Mac OS X and Darwin use lookupd, which caches DNS queries by default
AC_EGREP_CPP(lookupd, dnl
@ -780,7 +657,6 @@ AC_EGREP_CPP(lookupd, dnl
dnl freebsd needs this
LIBS="$LIBS $INTLLIBS"
CFLAGS="$CFLAGS $CPPFLAGS"
GUI_LIBS="$GUI_LIBS $COMMON_LIBS"
@ -791,19 +667,23 @@ AC_SUBST(COMMON_LIBS)
AC_SUBST(COMMON_CFLAGS)
AC_SUBST(PERL_CFLAGS)
AC_SUBST(PERL_LDFLAGS)
AC_SUBST(PY_CFLAGS)
AC_SUBST(PY_LIBS)
AC_SUBST(PYTHON_CPPFLAGS)
AC_SUBST(PYTHON_LIBS)
AC_SUBST(DBUS_CFLAGS)
AC_SUBST(DBUS_LIBS)
AC_SUBST(OPENSSL_LIBS)
AC_SUBST(OPENSSL_CFLAGS)
AC_SUBST(PLUGIN_LDFLAGS)
m4_ifdef([PKG_INSTALLDIR], [PKG_INSTALLDIR], AC_SUBST([pkgconfigdir], ${libdir}/pkgconfig))
PLUGIN_INCLUDES='-I$(top_srcdir)/plugins'
AC_SUBST(PLUGIN_INCLUDES)
dnl for plugin.c and pixmaps.c
test "x$prefix" = xNONE && prefix="$ac_default_prefix"
test "x$exec_prefix" = xNONE && exec_prefix="$prefix"
AS_IF([test "x$prefix" = xNONE], [
prefix="$ac_default_prefix"
])
AS_IF([test "x$exec_prefix" = xNONE], [
exec_prefix="$prefix"
])
AC_DEFINE_UNQUOTED(PREFIX, "${prefix}")
@ -858,8 +738,6 @@ echo D-Bus support ......... : $dbus
echo libnotify support ..... : $libnotify
echo libcanberra support ... : $libcanberra
echo Plugin interface ...... : $plugin
echo IPv6 support .......... : $ipv6
echo MS Proxy NTLM \(ISA\) ... : $have_ntlm
echo libproxy support ...... : $libproxy
echo
echo Perl .................. : $perl
@ -870,6 +748,8 @@ echo Do At ................. : $doat
echo FiSHLiM ............... : $fishlim
echo SysInfo ............... : $sysinfo
echo
echo Debug mode ............ : $enable_debug
echo
echo The binary will be installed in $prefix/bin
echo

View File

@ -3,3 +3,6 @@ SUBDIRS = pkgconfig man
if DO_GTK
SUBDIRS += icons misc
endif
EXTRA_DIST = \
hexchat.gresource.xml

View File

@ -11,3 +11,5 @@ install-data-hook:
uninstall-hook:
$(UPDATE_ICON_CACHE);
EXTRA_DIST = $(icon_DATA) $(hicolor_DATA)

View File

@ -1,745 +1,63 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
sodipodi:docname="hexchat.svg"
version="1.0"
inkscape:version="0.48.4 r9939"
sodipodi:version="0.32"
id="svg2"
height="64"
width="64">
<defs
id="defs4">
<linearGradient
id="linearGradient2289">
<stop
style="stop-color:#ff2600;stop-opacity:1;"
offset="0"
id="stop2291" />
<stop
style="stop-color:#ffd600;stop-opacity:1;"
offset="1"
id="stop2293" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2289"
id="linearGradient1335"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.545166,0,0,0.544959,0.186963,35.29511)"
x1="16.88862"
y1="77.796608"
x2="72.348671"
y2="20.59322" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2289"
id="linearGradient1337"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.545166,0,0,0.544959,0.186963,35.29511)"
x1="16.88862"
y1="77.796608"
x2="16.88862"
y2="19.001091" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2289"
id="linearGradient1317"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.735969,0,0,0.735801,-2.052758,-16.66733)"
x1="16.88862"
y1="77.796608"
x2="72.348671"
y2="20.59322" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2289"
id="linearGradient1319"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.735969,0,0,0.735801,-2.052758,-16.66733)"
x1="16.88862"
y1="77.796608"
x2="16.88862"
y2="19.001091" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2289"
id="linearGradient1320"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.735969,0,0,0.735801,-2.172329,-1.111016)"
x1="16.88862"
y1="77.796608"
x2="72.348671"
y2="20.59322" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2289"
id="linearGradient1322"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.735969,0,0,0.735801,-2.172329,-1.111016)"
x1="16.88862"
y1="77.796608"
x2="16.88862"
y2="19.001091" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2289"
id="linearGradient2997"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.735969,0,0,0.735801,-160.10656,-7.1914058)"
x1="130.2673"
y1="78.743134"
x2="129.2081"
y2="25.771122" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2289"
id="linearGradient3011"
x1="34.62241"
y1="53.508884"
x2="34.466503"
y2="5.4893961"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2289"
id="linearGradient3030"
gradientUnits="userSpaceOnUse"
x1="34.62241"
y1="53.508884"
x2="34.466503"
y2="5.4893961" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2289"
id="linearGradient3070"
gradientUnits="userSpaceOnUse"
x1="34.62241"
y1="53.508884"
x2="34.466503"
y2="5.4893961"
gradientTransform="matrix(0.99894925,0,0,0.97549134,-3.1829063,4.465557)" />
<filter
id="filter3281"
style="color-interpolation-filters:sRGB;"
inkscape:label="Drop Shadow">
<feFlood
id="feFlood3283"
flood-opacity="0.33"
flood-color="rgb(0,0,0)"
result="flood" />
<feComposite
id="feComposite3285"
in2="SourceGraphic"
in="flood"
operator="in"
result="composite1" />
<feGaussianBlur
id="feGaussianBlur3287"
in="composite"
stdDeviation="2"
result="blur" />
<feOffset
id="feOffset3289"
dx="4"
dy="1"
result="offset" />
<feComposite
id="feComposite3291"
in2="offset"
in="SourceGraphic"
operator="over"
result="composite2" />
</filter>
<filter
id="filter3293"
style="color-interpolation-filters:sRGB;"
inkscape:label="Drop Shadow">
<feFlood
id="feFlood3295"
flood-opacity="0.33"
flood-color="rgb(0,0,0)"
result="flood" />
<feComposite
id="feComposite3297"
in2="SourceGraphic"
in="flood"
operator="in"
result="composite1" />
<feGaussianBlur
id="feGaussianBlur3299"
in="composite"
stdDeviation="2"
result="blur" />
<feOffset
id="feOffset3301"
dx="4"
dy="1"
result="offset" />
<feComposite
id="feComposite3303"
in2="offset"
in="SourceGraphic"
operator="over"
result="composite2" />
</filter>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2289"
id="linearGradient4089"
x1="99.348503"
y1="59.934135"
x2="100.40916"
y2="10.613438"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2289"
id="linearGradient4093"
gradientUnits="userSpaceOnUse"
x1="99.348503"
y1="59.934135"
x2="100.40916"
y2="10.613438" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2289"
id="linearGradient4096"
gradientUnits="userSpaceOnUse"
x1="99.348503"
y1="59.934135"
x2="100.40916"
y2="10.613438" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2289"
id="linearGradient4098"
gradientUnits="userSpaceOnUse"
x1="99.348503"
y1="59.934135"
x2="100.40916"
y2="10.613438"
gradientTransform="translate(-70.003571,-2.298097)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2289-4"
id="linearGradient4101"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.94969205,0,0,0.89326813,1.6716955,2.7025635)"
x1="31.372862"
y1="60.111893"
x2="31.559002"
y2="5.6897221" />
<filter
id="filter4111"
style="color-interpolation-filters:sRGB;"
inkscape:label="Drop Shadow">
<feFlood
id="feFlood4113"
flood-opacity="0.33"
flood-color="rgb(0,0,0)"
result="flood" />
<feComposite
id="feComposite4115"
in2="SourceGraphic"
in="flood"
operator="in"
result="composite1" />
<feGaussianBlur
id="feGaussianBlur4117"
in="composite"
stdDeviation="2"
result="blur" />
<feOffset
id="feOffset4119"
dx="4"
dy="1"
result="offset" />
<feComposite
id="feComposite4121"
in2="offset"
in="SourceGraphic"
operator="over"
result="composite2" />
</filter>
<filter
id="filter4123"
style="color-interpolation-filters:sRGB;"
inkscape:label="Drop Shadow">
<feFlood
id="feFlood4125"
flood-opacity="0.33"
flood-color="rgb(0,0,0)"
result="flood" />
<feComposite
id="feComposite4127"
in2="SourceGraphic"
in="flood"
operator="in"
result="composite1" />
<feGaussianBlur
id="feGaussianBlur4129"
in="composite"
stdDeviation="2"
result="blur" />
<feOffset
id="feOffset4131"
dx="4"
dy="1"
result="offset" />
<feComposite
id="feComposite4133"
in2="offset"
in="SourceGraphic"
operator="over"
result="composite2" />
</filter>
<linearGradient
y2="19.001091"
x2="16.88862"
y1="77.796608"
x1="16.88862"
gradientTransform="matrix(0.735969,0,0,0.735801,-2.172329,-1.111016)"
gradientUnits="userSpaceOnUse"
id="linearGradient1330"
xlink:href="#linearGradient2289-4"
inkscape:collect="always" />
<linearGradient
y2="20.59322"
x2="72.348671"
y1="77.796608"
x1="16.88862"
gradientTransform="matrix(0.735969,0,0,0.735801,-2.172329,-1.111016)"
gradientUnits="userSpaceOnUse"
id="linearGradient1328"
xlink:href="#linearGradient2289-4"
inkscape:collect="always" />
<linearGradient
y2="19.001091"
x2="16.88862"
y1="77.796608"
x1="16.88862"
gradientTransform="matrix(0.735969,0,0,0.735801,-2.172329,-1.111016)"
gradientUnits="userSpaceOnUse"
id="linearGradient1322-5"
xlink:href="#linearGradient2289-4"
inkscape:collect="always" />
<linearGradient
y2="20.59322"
x2="72.348671"
y1="77.796608"
x1="16.88862"
gradientTransform="matrix(0.735969,0,0,0.735801,-2.172329,-1.111016)"
gradientUnits="userSpaceOnUse"
id="linearGradient1320-4"
xlink:href="#linearGradient2289-4"
inkscape:collect="always" />
<linearGradient
y2="19.001091"
x2="16.88862"
y1="77.796608"
x1="16.88862"
gradientTransform="matrix(0.735969,0,0,0.735801,-2.052758,-16.66733)"
gradientUnits="userSpaceOnUse"
id="linearGradient1319-2"
xlink:href="#linearGradient2289-4"
inkscape:collect="always" />
<linearGradient
y2="20.59322"
x2="72.348671"
y1="77.796608"
x1="16.88862"
gradientTransform="matrix(0.735969,0,0,0.735801,-2.052758,-16.66733)"
gradientUnits="userSpaceOnUse"
id="linearGradient1317-8"
xlink:href="#linearGradient2289-4"
inkscape:collect="always" />
<linearGradient
y2="19.001091"
x2="16.88862"
y1="77.796608"
x1="16.88862"
gradientTransform="matrix(0.545166,0,0,0.544959,0.186963,35.29511)"
gradientUnits="userSpaceOnUse"
id="linearGradient1337-8"
xlink:href="#linearGradient2289-4"
inkscape:collect="always" />
<linearGradient
y2="20.59322"
x2="72.348671"
y1="77.796608"
x1="16.88862"
gradientTransform="matrix(0.545166,0,0,0.544959,0.186963,35.29511)"
gradientUnits="userSpaceOnUse"
id="linearGradient1335-4"
xlink:href="#linearGradient2289-4"
inkscape:collect="always" />
<linearGradient
id="linearGradient2289-4">
<stop
id="stop2291-0"
offset="0"
style="stop-color:#ff2600;stop-opacity:1;" />
<stop
id="stop2293-9"
offset="1"
style="stop-color:#ffd600;stop-opacity:1;" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2289-4"
id="linearGradient3133"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.51445624,0,0,0.53856587,7.3477348,6.9450134)"
x1="46.881573"
y1="91.824585"
x2="47.225189"
y2="1.5596932" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2289-4"
id="linearGradient3136"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.51445624,0,0,0.53856587,-120.3871,-29.360443)"
x1="16.88862"
y1="77.796608"
x2="72.348671"
y2="20.59322" />
<filter
id="filter3138"
style="color-interpolation-filters:sRGB;"
inkscape:label="Drop Shadow">
<feFlood
id="feFlood3140"
flood-opacity="0.33"
flood-color="rgb(0,0,0)"
result="flood" />
<feComposite
id="feComposite3142"
in2="SourceGraphic"
in="flood"
operator="in"
result="composite1" />
<feGaussianBlur
id="feGaussianBlur3144"
in="composite"
stdDeviation="2"
result="blur" />
<feOffset
id="feOffset3146"
dx="4"
dy="1"
result="offset" />
<feComposite
id="feComposite3148"
in2="offset"
in="SourceGraphic"
operator="over"
result="composite2" />
</filter>
<filter
id="filter3670"
style="color-interpolation-filters:sRGB;"
inkscape:label="Drop Shadow">
<feFlood
id="feFlood3672"
flood-opacity="0.2"
flood-color="rgb(0,0,0)"
result="flood" />
<feComposite
id="feComposite3674"
in2="SourceGraphic"
in="flood"
operator="in"
result="composite1" />
<feGaussianBlur
id="feGaussianBlur3676"
in="composite"
stdDeviation="1.5"
result="blur" />
<feOffset
id="feOffset3678"
dx="0"
dy="4"
result="offset" />
<feComposite
id="feComposite3680"
in2="offset"
in="SourceGraphic"
operator="over"
result="fbSourceGraphic" />
<feColorMatrix
result="fbSourceGraphicAlpha"
in="fbSourceGraphic"
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
id="feColorMatrix3682" />
<feFlood
id="feFlood3684"
flood-opacity="0.2"
flood-color="rgb(0,0,0)"
result="flood"
in="fbSourceGraphic" />
<feComposite
id="feComposite3686"
in2="fbSourceGraphic"
in="flood"
operator="in"
result="composite1" />
<feGaussianBlur
id="feGaussianBlur3688"
in="composite"
stdDeviation="1.5"
result="blur" />
<feOffset
id="feOffset3690"
dx="0"
dy="2"
result="offset" />
<feComposite
id="feComposite3692"
in2="offset"
in="fbSourceGraphic"
operator="over"
result="fbSourceGraphic" />
<feColorMatrix
result="fbSourceGraphicAlpha"
in="fbSourceGraphic"
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
id="feColorMatrix3706" />
<feFlood
id="feFlood3708"
flood-opacity="0.2"
flood-color="rgb(255,255,255)"
result="flood"
in="fbSourceGraphic" />
<feComposite
id="feComposite3710"
in2="fbSourceGraphic"
in="flood"
operator="in"
result="composite1" />
<feGaussianBlur
id="feGaussianBlur3712"
in="composite"
stdDeviation="1"
result="blur" />
<feOffset
id="feOffset3714"
dx="0"
dy="1"
result="offset" />
<feComposite
id="feComposite3716"
in2="offset"
in="fbSourceGraphic"
operator="over"
result="fbSourceGraphic" />
<feColorMatrix
result="fbSourceGraphicAlpha"
in="fbSourceGraphic"
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
id="feColorMatrix3123" />
<feFlood
id="feFlood3125"
flood-opacity="0.2"
flood-color="rgb(0,0,0)"
result="flood"
in="fbSourceGraphic" />
<feComposite
id="feComposite3127"
in2="fbSourceGraphic"
in="flood"
operator="in"
result="composite1" />
<feGaussianBlur
id="feGaussianBlur3129"
in="composite"
stdDeviation="1"
result="blur" />
<feOffset
id="feOffset3131"
dx="0"
dy="2"
result="offset" />
<feComposite
id="feComposite3133"
in2="offset"
in="fbSourceGraphic"
operator="over"
result="composite2" />
</filter>
<filter
id="filter3135"
style="color-interpolation-filters:sRGB;"
inkscape:label="Drop Shadow">
<feFlood
id="feFlood3137"
flood-opacity="0.2"
flood-color="rgb(0,0,0)"
result="flood" />
<feComposite
id="feComposite3139"
in2="SourceGraphic"
in="flood"
operator="in"
result="composite1" />
<feGaussianBlur
id="feGaussianBlur3141"
in="composite"
stdDeviation="1"
result="blur" />
<feOffset
id="feOffset3143"
dx="0"
dy="1"
result="offset" />
<feComposite
id="feComposite3145"
in2="offset"
in="SourceGraphic"
operator="over"
result="composite2" />
</filter>
<filter
id="filter3183"
style="color-interpolation-filters:sRGB;"
inkscape:label="Drop Shadow">
<feFlood
id="feFlood3185"
flood-opacity="0.3"
flood-color="rgb(0,0,0)"
result="flood" />
<feComposite
id="feComposite3187"
in2="SourceGraphic"
in="flood"
operator="in"
result="composite1" />
<feGaussianBlur
id="feGaussianBlur3189"
in="composite"
stdDeviation="2"
result="blur" />
<feOffset
id="feOffset3191"
dx="0"
dy="2"
result="offset" />
<feComposite
id="feComposite3193"
in2="offset"
in="SourceGraphic"
operator="over"
result="composite2" />
</filter>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="7.9999999"
inkscape:cx="61.011203"
inkscape:cy="36.086679"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1270"
inkscape:window-height="837"
inkscape:window-x="287"
inkscape:window-y="27"
showguides="true"
inkscape:guide-bbox="true"
inkscape:window-maximized="0">
<inkscape:grid
type="xygrid"
id="grid3001" />
</sodipodi:namedview>
<metadata
id="metadata7">
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
height="64"
width="64">
<metadata>
<rdf:RDF>
<cc:Work
rdf:about="">
<cc:Work>
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:creator>
<cc:Agent>
<dc:title>Guglielmi David</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/GPL/2.0/" />
<cc:license rdf:resource="http://creativecommons.org/licenses/GPL/2.0/" />
<dc:rights>
<cc:Agent>
<dc:title>Peter Zelezny</dc:title>
</cc:Agent>
</dc:rights>
<dc:contributor>
<cc:Agent>
<dc:title>Samuel Messner</dc:title>
</cc:Agent>
</dc:contributor>
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/GPL/2.0/">
<cc:permits
rdf:resource="http://web.resource.org/cc/Reproduction" />
<cc:permits
rdf:resource="http://web.resource.org/cc/Distribution" />
<cc:requires
rdf:resource="http://web.resource.org/cc/Notice" />
<cc:permits
rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
<cc:requires
rdf:resource="http://web.resource.org/cc/ShareAlike" />
<cc:requires
rdf:resource="http://web.resource.org/cc/SourceCode" />
<cc:License rdf:about="http://creativecommons.org/licenses/GPL/2.0/">
<cc:requires rdf:resource="http://web.resource.org/cc/Notice" />
<cc:requires rdf:resource="http://web.resource.org/cc/ShareAlike" />
<cc:requires rdf:resource="http://web.resource.org/cc/SourceCode" />
<cc:permits rdf:resource="http://web.resource.org/cc/Reproduction" />
<cc:permits rdf:resource="http://web.resource.org/cc/Distribution" />
<cc:permits rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Calque 1"
inkscape:groupmode="layer"
id="layer1">
<g
id="g3663">
<path
style="fill:#000000;fill-opacity:1;"
d="m 31.404792,8.7464684 c -6.271873,0.05843 -12.553,0.431777 -13.735377,1.075609 C 15.304661,11.109737 4.1505773,29.32852 4.1783444,31.859522 c 0.02777,2.531005 11.5871596,20.543967 13.9796816,21.787309 2.392519,1.243342 25.106,1.037521 27.470753,-0.250141 C 47.993531,52.109028 59.147618,33.890246 59.119851,31.359242 59.092081,28.828238 47.532689,10.790262 45.140167,9.5469214 43.943907,8.9252504 37.676665,8.6880384 31.404792,8.7464684 z m 0.05429,4.5275596 c 4.90437,-0.047 9.786849,0.175368 10.722281,0.67538 1.870861,1.000021 10.917726,15.499216 10.939439,17.534904 C 53.142512,33.52 44.410541,48.158649 42.561393,49.194315 40.712245,50.229983 22.960549,50.419464 21.089689,49.419444 19.218826,48.419423 10.199106,33.920226 10.177392,31.884537 10.155682,29.84885 18.860508,15.185189 20.709656,14.14952 c 0.924575,-0.517833 5.845056,-0.828498 10.749425,-0.875492 z"
id="path4107"
inkscape:connector-curvature="0" />
<path
transform="matrix(0.97890109,0,0,0.98965389,0.52623659,-1.3159842)"
style="fill:#000000;fill-opacity:1;"
d="M 31.801142,5.3887159 C 24.358829,5.4607629 16.905535,5.9211193 15.502506,6.7149966 12.696449,8.3027513 -0.53918189,30.767467 -0.50623228,33.888328 -0.47328049,37.00919 13.243292,59.220118 16.0823,60.753225 18.921305,62.286332 45.873514,62.032541 48.67957,60.444787 51.485627,58.857032 64.721258,36.392315 64.688309,33.271454 64.655357,30.150593 50.938784,7.9088218 48.099776,6.3757155 46.680274,5.6091623 39.243454,5.3166688 31.801142,5.3887159 z m 0.06442,5.5827171 c 5.81961,-0.05795 11.613244,0.216241 12.723243,0.83278 2.219996,1.233079 12.955163,19.111349 12.980929,21.621461 0.02577,2.51011 -10.335747,20.560333 -12.529979,21.837366 -2.19423,1.277031 -23.2587,1.510671 -25.478697,0.277592 C 17.341063,54.307554 6.638107,36.429283 6.6123418,33.919173 6.5865755,31.409062 16.915878,13.327995 19.110109,12.050964 20.207224,11.412447 26.045952,11.02938 31.865563,10.971433 z"
id="path4103"
inkscape:connector-curvature="0" />
<path
inkscape:transform-center-y="2.25"
inkscape:transform-center-x="2.25"
style="fill:url(#linearGradient3133);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.31593215000000008;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;"
d="m 10.723737,18.285684 7.623916,-7.935243 13.238019,13.886676 12.492701,-13.886676 8.576909,7.935243 -14.294847,14.878584 13.341856,11.902864 -6.670928,6.94334 L 31.585672,39.351071 18.573785,52.010472 11.676724,45.086347 24.065591,33.164268 10.723737,18.285684 z"
id="path2297"
sodipodi:nodetypes="ccccccccccccc"
inkscape:connector-curvature="0" />
<path
inkscape:connector-curvature="0"
id="path3305"
d="M 31.293607,6.0952825 C 24.436514,6.1604875 17.569304,6.5771256 16.276601,7.2956116 13.691196,8.7325834 1.4963386,29.063913 1.5266972,31.888398 1.5570579,34.712884 14.195039,54.814527 16.810803,56.20204 19.426566,57.589553 44.25941,57.359866 46.844814,55.922894 49.430219,54.485922 61.625078,34.154591 61.594719,31.330106 61.564358,28.505621 48.926376,8.3760634 46.310612,6.9885506 45.002731,6.294794 38.150699,6.0300774 31.293607,6.0952825 z m 0.05936,5.0525485 c 5.36199,-0.05245 10.700046,0.195704 11.722761,0.753694 2.045429,1.115978 11.936445,17.296419 11.960184,19.568154 0.02374,2.271736 -9.523004,18.6078 -11.544693,19.763557 -2.02169,1.155758 -21.429773,1.36721 -23.475201,0.251232 C 17.970585,50.368491 8.1092472,34.188049 8.085508,31.916313 8.061768,29.644577 17.578834,13.2806 19.600523,12.124842 c 1.010846,-0.577879 6.39045,-0.924567 11.75244,-0.977011 z"
style="fill:url(#linearGradient4101);fill-opacity:1;" />
<path
inkscape:connector-curvature="0"
id="path3077"
d="M 14.640198,55.682743 C 9.6971439,47.360612 2.8950957,35.733851 2.9419881,35.686959 c 0.031272,-0.03127 0.5023581,0.289334 1.0468575,0.712459 0.5444994,0.423125 1.0414462,0.769317 1.1043264,0.769317 0.06288,0 2.6329414,4.276521 5.711247,9.50338 l 5.59692,9.503379 2.159128,0.007 2.159126,0.007 -0.34365,-0.584653 C 20.186937,55.28323 17.303514,50.518786 13.968339,45.017137 10.633164,39.515488 7.9043842,34.929294 7.9043842,34.825595 c 0,-0.103699 0.2455542,-0.59277 0.545676,-1.086823 0.3001218,-0.494053 0.545676,-0.941721 0.545676,-0.994816 0,-0.05309 -0.2788317,-0.09654 -0.619626,-0.09654 -0.8505388,0 -1.0953557,-0.488405 -1.0953557,-2.185211 0,-1.90734 -0.048411,-1.868066 2.30512,-1.870072 l 1.9823345,-0.0017 1.052375,-1.721616 c 0.578806,-0.94689 1.052375,-1.785869 1.052375,-1.8644 0,-0.07853 -0.829918,-0.162484 -1.844262,-0.186561 l -1.8442631,-0.04378 4.4809551,-7.327649 4.480953,-7.32765 12.466741,-0.0399 12.466738,-0.0399 0.517892,0.854518 0.517892,0.854518 2.335995,0.04287 2.335994,0.04287 2.742626,4.521316 c 1.508447,2.486723 4.136212,6.819001 5.839482,9.627283 1.703268,2.808283 3.157599,5.105969 3.231846,5.105969 0.256907,0 0.13186,-0.393635 -0.411085,-1.294044 -0.299901,-0.497351 -0.545275,-0.935841 -0.545275,-0.974422 0,-0.03858 0.310833,-0.07015 0.69074,-0.07015 0.575204,0 0.699074,-0.05324 0.740561,-0.318272 0.03599,-0.229934 0.273254,0.06215 0.854835,1.052375 0.702767,1.196557 0.780303,1.410253 0.610448,1.682462 -0.107012,0.171499 -0.377881,0.627528 -0.601929,1.013399 l -0.407361,0.701583 0.533953,0.857491 c 0.293674,0.47162 0.535536,0.950306 0.537472,1.063747 0.0019,0.113441 -3.098537,5.322698 -6.889942,11.576127 l -6.893462,11.36987 -16.876654,0 -16.876655,0 -1.226996,-2.065773 z"
style="fill:none;" />
</g>
</g>
<defs>
<linearGradient id="hexchatGradient" x1="0" y1="1" x2="0" y2="0">
<stop id="hgRedStop" offset="0" style="stop-color: #FF2600; stop-opacity: 1;" />
<stop id="hgYellowStop" offset="1" style="stop-color: #FFD600; stop-opacity: 1;" />
</linearGradient>
<filter inkscape:collect="always" id="dropshadow">
<feGaussianBlur inkscape:collect="always" stdDeviation="1.9736701" id="dropshadowGaussian" />
</filter>
</defs>
<path
style="fill: #000000; fill-opacity: 1;"
d="m 31.62506,4.4248023 c -7.285288,0.0713 -14.595323,0.526836 -15.96875,1.3125 C 12.909458,7.3086297 -0.0321942,29.523731 6.0185229e-5,32.612303 0.0323162,35.700876 13.470952,57.688808 16.25006,59.206053 c 2.779105,1.517245 29.159399,1.258827 31.90625,-0.3125 2.746852,-1.571328 15.688504,-23.786428 15.65625,-26.875 C 63.7803,28.929981 50.372918,6.9107967 47.59381,5.3935523 46.204258,4.6349293 38.910347,4.3535003 31.62506,4.4248023 z m -0.1875,9.2500007 c 3.386631,-0.03246 6.676687,0.05409 8.75,0.28125 l -8.71875,9.71875 -9.0625,-9.5 c 2.055746,-0.283043 5.521157,-0.466366 9.03125,-0.5 z m 17.34375,9.84375 c 2.298293,3.744897 4.302354,7.392556 4.3125,8.34375 0.01126,1.055883 -2.358157,5.507241 -4.875,9.6875 l -9.03125,-8.03125 z m -34.46875,0.25 8.75,9.75 -8.1875,7.875 c -2.482342,-3.992634 -4.707927,-8.110307 -4.71875,-9.125 -0.01021,-0.95736 1.927117,-4.687748 4.15625,-8.5 z m 17.15625,16.90625 9.8125,9.21875 c -4.111037,0.67314 -16.108253,0.781873 -19.46875,0.125 z"
id="outline"
sodipodi:nodetypes="ssssssssscccscsccccccsccccc" />
<path
style="fill: url(#hexchatGradient); fill-opacity: 1;"
d="m 31.25006,6.4873027 c -6.857093,0.06521 -13.707297,0.469014 -15,1.1875 -2.585405,1.4369712 -14.780358,21.7692653 -14.75,24.5937503 0.03036,2.824486 12.665486,22.924987 15.28125,24.3125 2.615763,1.387513 27.445846,1.186972 30.03125,-0.25 2.585405,-1.436972 14.780359,-21.769265 14.75,-24.59375 C 61.5322,28.912818 48.897074,8.7810649 46.28131,7.3935527 44.973429,6.6997957 38.107152,6.4220967 31.25006,6.4873027 z m 0.0625,5.0625003 c 5.36199,-0.05245 10.696035,0.19201 11.71875,0.75 0.06132,0.03346 0.143803,0.127745 0.21875,0.1875 l -11.28125,12.59375 -0.5,0.53125 -0.46875,-0.53125 -11.75,-12.3125 c 0.10903,-0.09884 0.228263,-0.201843 0.3125,-0.25 1.010846,-0.577879 6.38801,-0.916306 11.75,-0.96875 z m 18.0625,9.46875 c 2.883844,4.661341 5.612556,9.652893 5.625,10.84375 0.01348,1.290331 -3.064699,7.087557 -6.09375,12.09375 l -11.09375,-9.90625 -0.53125,-0.46875 0.5,-0.46875 11.59375,-12.09375 z m -35.78125,0.03125 10.84375,12.0625 0.4375,0.46875 -0.46875,0.4375 -10.28125,9.90625 c -3.04689,-4.86606 -6.049362,-10.36778 -6.0625,-11.625 -0.01271,-1.216102 2.689239,-6.451996 5.53125,-11.25 z m 17.875,17.78125 0.4375,0.4375 12.34375,11.59375 c -0.318014,0.365376 -0.587006,0.638955 -0.78125,0.75 -2.02169,1.155758 -21.423322,1.397228 -23.46875,0.28125 -0.228202,-0.124506 -0.601742,-0.47821 -1,-0.9375 l 12,-11.6875 0.46875,-0.4375 z"
id="coloredX" />
</svg>

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@ -1,746 +1,58 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
sodipodi:docname="hexchat.svg"
version="1.0"
inkscape:version="0.48.4 r9939"
sodipodi:version="0.32"
id="svg2"
height="64"
width="64">
<defs
id="defs4">
<linearGradient
id="linearGradient2289">
<stop
style="stop-color:#ff2600;stop-opacity:1;"
offset="0"
id="stop2291" />
<stop
style="stop-color:#ffd600;stop-opacity:1;"
offset="1"
id="stop2293" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2289"
id="linearGradient1335"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.545166,0,0,0.544959,0.186963,35.29511)"
x1="16.88862"
y1="77.796608"
x2="72.348671"
y2="20.59322" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2289"
id="linearGradient1337"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.545166,0,0,0.544959,0.186963,35.29511)"
x1="16.88862"
y1="77.796608"
x2="16.88862"
y2="19.001091" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2289"
id="linearGradient1317"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.735969,0,0,0.735801,-2.052758,-16.66733)"
x1="16.88862"
y1="77.796608"
x2="72.348671"
y2="20.59322" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2289"
id="linearGradient1319"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.735969,0,0,0.735801,-2.052758,-16.66733)"
x1="16.88862"
y1="77.796608"
x2="16.88862"
y2="19.001091" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2289"
id="linearGradient1320"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.735969,0,0,0.735801,-2.172329,-1.111016)"
x1="16.88862"
y1="77.796608"
x2="72.348671"
y2="20.59322" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2289"
id="linearGradient1322"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.735969,0,0,0.735801,-2.172329,-1.111016)"
x1="16.88862"
y1="77.796608"
x2="16.88862"
y2="19.001091" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2289"
id="linearGradient2997"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.735969,0,0,0.735801,-160.10656,-7.1914058)"
x1="130.2673"
y1="78.743134"
x2="129.2081"
y2="25.771122" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2289"
id="linearGradient3011"
x1="34.62241"
y1="53.508884"
x2="34.466503"
y2="5.4893961"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2289"
id="linearGradient3030"
gradientUnits="userSpaceOnUse"
x1="34.62241"
y1="53.508884"
x2="34.466503"
y2="5.4893961" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2289"
id="linearGradient3070"
gradientUnits="userSpaceOnUse"
x1="34.62241"
y1="53.508884"
x2="34.466503"
y2="5.4893961"
gradientTransform="matrix(0.99894925,0,0,0.97549134,-3.1829063,4.465557)" />
<filter
id="filter3281"
style="color-interpolation-filters:sRGB;"
inkscape:label="Drop Shadow">
<feFlood
id="feFlood3283"
flood-opacity="0.33"
flood-color="rgb(0,0,0)"
result="flood" />
<feComposite
id="feComposite3285"
in2="SourceGraphic"
in="flood"
operator="in"
result="composite1" />
<feGaussianBlur
id="feGaussianBlur3287"
in="composite"
stdDeviation="2"
result="blur" />
<feOffset
id="feOffset3289"
dx="4"
dy="1"
result="offset" />
<feComposite
id="feComposite3291"
in2="offset"
in="SourceGraphic"
operator="over"
result="composite2" />
</filter>
<filter
id="filter3293"
style="color-interpolation-filters:sRGB;"
inkscape:label="Drop Shadow">
<feFlood
id="feFlood3295"
flood-opacity="0.33"
flood-color="rgb(0,0,0)"
result="flood" />
<feComposite
id="feComposite3297"
in2="SourceGraphic"
in="flood"
operator="in"
result="composite1" />
<feGaussianBlur
id="feGaussianBlur3299"
in="composite"
stdDeviation="2"
result="blur" />
<feOffset
id="feOffset3301"
dx="4"
dy="1"
result="offset" />
<feComposite
id="feComposite3303"
in2="offset"
in="SourceGraphic"
operator="over"
result="composite2" />
</filter>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2289"
id="linearGradient4089"
x1="99.348503"
y1="59.934135"
x2="100.40916"
y2="10.613438"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2289"
id="linearGradient4093"
gradientUnits="userSpaceOnUse"
x1="99.348503"
y1="59.934135"
x2="100.40916"
y2="10.613438" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2289"
id="linearGradient4096"
gradientUnits="userSpaceOnUse"
x1="99.348503"
y1="59.934135"
x2="100.40916"
y2="10.613438" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2289"
id="linearGradient4098"
gradientUnits="userSpaceOnUse"
x1="99.348503"
y1="59.934135"
x2="100.40916"
y2="10.613438"
gradientTransform="translate(-70.003571,-2.298097)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2289-4"
id="linearGradient4101"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.94969205,0,0,0.89326813,1.6716955,2.7025635)"
x1="31.372862"
y1="60.111893"
x2="31.559002"
y2="5.6897221" />
<filter
id="filter4111"
style="color-interpolation-filters:sRGB;"
inkscape:label="Drop Shadow">
<feFlood
id="feFlood4113"
flood-opacity="0.33"
flood-color="rgb(0,0,0)"
result="flood" />
<feComposite
id="feComposite4115"
in2="SourceGraphic"
in="flood"
operator="in"
result="composite1" />
<feGaussianBlur
id="feGaussianBlur4117"
in="composite"
stdDeviation="2"
result="blur" />
<feOffset
id="feOffset4119"
dx="4"
dy="1"
result="offset" />
<feComposite
id="feComposite4121"
in2="offset"
in="SourceGraphic"
operator="over"
result="composite2" />
</filter>
<filter
id="filter4123"
style="color-interpolation-filters:sRGB;"
inkscape:label="Drop Shadow">
<feFlood
id="feFlood4125"
flood-opacity="0.33"
flood-color="rgb(0,0,0)"
result="flood" />
<feComposite
id="feComposite4127"
in2="SourceGraphic"
in="flood"
operator="in"
result="composite1" />
<feGaussianBlur
id="feGaussianBlur4129"
in="composite"
stdDeviation="2"
result="blur" />
<feOffset
id="feOffset4131"
dx="4"
dy="1"
result="offset" />
<feComposite
id="feComposite4133"
in2="offset"
in="SourceGraphic"
operator="over"
result="composite2" />
</filter>
<linearGradient
y2="19.001091"
x2="16.88862"
y1="77.796608"
x1="16.88862"
gradientTransform="matrix(0.735969,0,0,0.735801,-2.172329,-1.111016)"
gradientUnits="userSpaceOnUse"
id="linearGradient1330"
xlink:href="#linearGradient2289-4"
inkscape:collect="always" />
<linearGradient
y2="20.59322"
x2="72.348671"
y1="77.796608"
x1="16.88862"
gradientTransform="matrix(0.735969,0,0,0.735801,-2.172329,-1.111016)"
gradientUnits="userSpaceOnUse"
id="linearGradient1328"
xlink:href="#linearGradient2289-4"
inkscape:collect="always" />
<linearGradient
y2="19.001091"
x2="16.88862"
y1="77.796608"
x1="16.88862"
gradientTransform="matrix(0.735969,0,0,0.735801,-2.172329,-1.111016)"
gradientUnits="userSpaceOnUse"
id="linearGradient1322-5"
xlink:href="#linearGradient2289-4"
inkscape:collect="always" />
<linearGradient
y2="20.59322"
x2="72.348671"
y1="77.796608"
x1="16.88862"
gradientTransform="matrix(0.735969,0,0,0.735801,-2.172329,-1.111016)"
gradientUnits="userSpaceOnUse"
id="linearGradient1320-4"
xlink:href="#linearGradient2289-4"
inkscape:collect="always" />
<linearGradient
y2="19.001091"
x2="16.88862"
y1="77.796608"
x1="16.88862"
gradientTransform="matrix(0.735969,0,0,0.735801,-2.052758,-16.66733)"
gradientUnits="userSpaceOnUse"
id="linearGradient1319-2"
xlink:href="#linearGradient2289-4"
inkscape:collect="always" />
<linearGradient
y2="20.59322"
x2="72.348671"
y1="77.796608"
x1="16.88862"
gradientTransform="matrix(0.735969,0,0,0.735801,-2.052758,-16.66733)"
gradientUnits="userSpaceOnUse"
id="linearGradient1317-8"
xlink:href="#linearGradient2289-4"
inkscape:collect="always" />
<linearGradient
y2="19.001091"
x2="16.88862"
y1="77.796608"
x1="16.88862"
gradientTransform="matrix(0.545166,0,0,0.544959,0.186963,35.29511)"
gradientUnits="userSpaceOnUse"
id="linearGradient1337-8"
xlink:href="#linearGradient2289-4"
inkscape:collect="always" />
<linearGradient
y2="20.59322"
x2="72.348671"
y1="77.796608"
x1="16.88862"
gradientTransform="matrix(0.545166,0,0,0.544959,0.186963,35.29511)"
gradientUnits="userSpaceOnUse"
id="linearGradient1335-4"
xlink:href="#linearGradient2289-4"
inkscape:collect="always" />
<linearGradient
id="linearGradient2289-4">
<stop
id="stop2291-0"
offset="0"
style="stop-color:#ff2600;stop-opacity:1;" />
<stop
id="stop2293-9"
offset="1"
style="stop-color:#ffd600;stop-opacity:1;" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2289-4"
id="linearGradient3133"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.51445624,0,0,0.53856587,7.3477348,6.9450134)"
x1="46.881573"
y1="91.824585"
x2="47.225189"
y2="1.5596932" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2289-4"
id="linearGradient3136"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.51445624,0,0,0.53856587,-120.3871,-29.360443)"
x1="16.88862"
y1="77.796608"
x2="72.348671"
y2="20.59322" />
<filter
id="filter3138"
style="color-interpolation-filters:sRGB;"
inkscape:label="Drop Shadow">
<feFlood
id="feFlood3140"
flood-opacity="0.33"
flood-color="rgb(0,0,0)"
result="flood" />
<feComposite
id="feComposite3142"
in2="SourceGraphic"
in="flood"
operator="in"
result="composite1" />
<feGaussianBlur
id="feGaussianBlur3144"
in="composite"
stdDeviation="2"
result="blur" />
<feOffset
id="feOffset3146"
dx="4"
dy="1"
result="offset" />
<feComposite
id="feComposite3148"
in2="offset"
in="SourceGraphic"
operator="over"
result="composite2" />
</filter>
<filter
id="filter3670"
style="color-interpolation-filters:sRGB;"
inkscape:label="Drop Shadow">
<feFlood
id="feFlood3672"
flood-opacity="0.2"
flood-color="rgb(0,0,0)"
result="flood" />
<feComposite
id="feComposite3674"
in2="SourceGraphic"
in="flood"
operator="in"
result="composite1" />
<feGaussianBlur
id="feGaussianBlur3676"
in="composite"
stdDeviation="1.5"
result="blur" />
<feOffset
id="feOffset3678"
dx="0"
dy="4"
result="offset" />
<feComposite
id="feComposite3680"
in2="offset"
in="SourceGraphic"
operator="over"
result="fbSourceGraphic" />
<feColorMatrix
result="fbSourceGraphicAlpha"
in="fbSourceGraphic"
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
id="feColorMatrix3682" />
<feFlood
id="feFlood3684"
flood-opacity="0.2"
flood-color="rgb(0,0,0)"
result="flood"
in="fbSourceGraphic" />
<feComposite
id="feComposite3686"
in2="fbSourceGraphic"
in="flood"
operator="in"
result="composite1" />
<feGaussianBlur
id="feGaussianBlur3688"
in="composite"
stdDeviation="1.5"
result="blur" />
<feOffset
id="feOffset3690"
dx="0"
dy="2"
result="offset" />
<feComposite
id="feComposite3692"
in2="offset"
in="fbSourceGraphic"
operator="over"
result="fbSourceGraphic" />
<feColorMatrix
result="fbSourceGraphicAlpha"
in="fbSourceGraphic"
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
id="feColorMatrix3706" />
<feFlood
id="feFlood3708"
flood-opacity="0.2"
flood-color="rgb(255,255,255)"
result="flood"
in="fbSourceGraphic" />
<feComposite
id="feComposite3710"
in2="fbSourceGraphic"
in="flood"
operator="in"
result="composite1" />
<feGaussianBlur
id="feGaussianBlur3712"
in="composite"
stdDeviation="1"
result="blur" />
<feOffset
id="feOffset3714"
dx="0"
dy="1"
result="offset" />
<feComposite
id="feComposite3716"
in2="offset"
in="fbSourceGraphic"
operator="over"
result="fbSourceGraphic" />
<feColorMatrix
result="fbSourceGraphicAlpha"
in="fbSourceGraphic"
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
id="feColorMatrix3123" />
<feFlood
id="feFlood3125"
flood-opacity="0.2"
flood-color="rgb(0,0,0)"
result="flood"
in="fbSourceGraphic" />
<feComposite
id="feComposite3127"
in2="fbSourceGraphic"
in="flood"
operator="in"
result="composite1" />
<feGaussianBlur
id="feGaussianBlur3129"
in="composite"
stdDeviation="1"
result="blur" />
<feOffset
id="feOffset3131"
dx="0"
dy="2"
result="offset" />
<feComposite
id="feComposite3133"
in2="offset"
in="fbSourceGraphic"
operator="over"
result="composite2" />
</filter>
<filter
id="filter3135"
style="color-interpolation-filters:sRGB;"
inkscape:label="Drop Shadow">
<feFlood
id="feFlood3137"
flood-opacity="0.2"
flood-color="rgb(0,0,0)"
result="flood" />
<feComposite
id="feComposite3139"
in2="SourceGraphic"
in="flood"
operator="in"
result="composite1" />
<feGaussianBlur
id="feGaussianBlur3141"
in="composite"
stdDeviation="1"
result="blur" />
<feOffset
id="feOffset3143"
dx="0"
dy="1"
result="offset" />
<feComposite
id="feComposite3145"
in2="offset"
in="SourceGraphic"
operator="over"
result="composite2" />
</filter>
<filter
id="filter3183"
style="color-interpolation-filters:sRGB;"
inkscape:label="Drop Shadow">
<feFlood
id="feFlood3185"
flood-opacity="0.3"
flood-color="rgb(0,0,0)"
result="flood" />
<feComposite
id="feComposite3187"
in2="SourceGraphic"
in="flood"
operator="in"
result="composite1" />
<feGaussianBlur
id="feGaussianBlur3189"
in="composite"
stdDeviation="2"
result="blur" />
<feOffset
id="feOffset3191"
dx="0"
dy="2"
result="offset" />
<feComposite
id="feComposite3193"
in2="offset"
in="SourceGraphic"
operator="over"
result="composite2" />
</filter>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="7.9999999"
inkscape:cx="60.761203"
inkscape:cy="36.086679"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1270"
inkscape:window-height="837"
inkscape:window-x="287"
inkscape:window-y="27"
showguides="true"
inkscape:guide-bbox="true"
inkscape:window-maximized="0">
<inkscape:grid
type="xygrid"
id="grid3001" />
</sodipodi:namedview>
<metadata
id="metadata7">
xmlns="http://www.w3.org/2000/svg"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:xlink="http://www.w3.org/1999/xlink"
height="64"
width="64">
<metadata>
<rdf:RDF>
<cc:Work
rdf:about="">
<cc:Work>
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:creator>
<cc:Agent>
<dc:title>Guglielmi David</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/GPL/2.0/" />
<cc:license rdf:resource="http://creativecommons.org/licenses/GPL/2.0/" />
<dc:rights>
<cc:Agent>
<dc:title>Peter Zelezny</dc:title>
</cc:Agent>
</dc:rights>
<dc:contributor>
<cc:Agent>
<dc:title>Samuel Messner</dc:title>
</cc:Agent>
</dc:contributor>
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/GPL/2.0/">
<cc:permits
rdf:resource="http://web.resource.org/cc/Reproduction" />
<cc:permits
rdf:resource="http://web.resource.org/cc/Distribution" />
<cc:requires
rdf:resource="http://web.resource.org/cc/Notice" />
<cc:permits
rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
<cc:requires
rdf:resource="http://web.resource.org/cc/ShareAlike" />
<cc:requires
rdf:resource="http://web.resource.org/cc/SourceCode" />
<cc:License rdf:about="http://creativecommons.org/licenses/GPL/2.0/">
<cc:requires rdf:resource="http://web.resource.org/cc/Notice" />
<cc:requires rdf:resource="http://web.resource.org/cc/ShareAlike" />
<cc:requires rdf:resource="http://web.resource.org/cc/SourceCode" />
<cc:permits rdf:resource="http://web.resource.org/cc/Reproduction" />
<cc:permits rdf:resource="http://web.resource.org/cc/Distribution" />
<cc:permits rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Calque 1"
inkscape:groupmode="layer"
id="layer1">
<g
id="g3663"
style="filter:url(#filter3183)">
<path
style="fill:#000000;fill-opacity:1;"
d="m 31.404792,8.7464684 c -6.271873,0.05843 -12.553,0.431777 -13.735377,1.075609 C 15.304661,11.109737 4.1505773,29.32852 4.1783444,31.859522 c 0.02777,2.531005 11.5871596,20.543967 13.9796816,21.787309 2.392519,1.243342 25.106,1.037521 27.470753,-0.250141 C 47.993531,52.109028 59.147618,33.890246 59.119851,31.359242 59.092081,28.828238 47.532689,10.790262 45.140167,9.5469214 43.943907,8.9252504 37.676665,8.6880384 31.404792,8.7464684 z m 0.05429,4.5275596 c 4.90437,-0.047 9.786849,0.175368 10.722281,0.67538 1.870861,1.000021 10.917726,15.499216 10.939439,17.534904 C 53.142512,33.52 44.410541,48.158649 42.561393,49.194315 40.712245,50.229983 22.960549,50.419464 21.089689,49.419444 19.218826,48.419423 10.199106,33.920226 10.177392,31.884537 10.155682,29.84885 18.860508,15.185189 20.709656,14.14952 c 0.924575,-0.517833 5.845056,-0.828498 10.749425,-0.875492 z"
id="path4107"
inkscape:connector-curvature="0" />
<path
transform="matrix(0.97890109,0,0,0.98965389,0.52623659,-1.3159842)"
style="fill:#000000;fill-opacity:1;"
d="M 31.801142,5.3887159 C 24.358829,5.4607629 16.905535,5.9211193 15.502506,6.7149966 12.696449,8.3027513 -0.53918189,30.767467 -0.50623228,33.888328 -0.47328049,37.00919 13.243292,59.220118 16.0823,60.753225 18.921305,62.286332 45.873514,62.032541 48.67957,60.444787 51.485627,58.857032 64.721258,36.392315 64.688309,33.271454 64.655357,30.150593 50.938784,7.9088218 48.099776,6.3757155 46.680274,5.6091623 39.243454,5.3166688 31.801142,5.3887159 z m 0.06442,5.5827171 c 5.81961,-0.05795 11.613244,0.216241 12.723243,0.83278 2.219996,1.233079 12.955163,19.111349 12.980929,21.621461 0.02577,2.51011 -10.335747,20.560333 -12.529979,21.837366 -2.19423,1.277031 -23.2587,1.510671 -25.478697,0.277592 C 17.341063,54.307554 6.638107,36.429283 6.6123418,33.919173 6.5865755,31.409062 16.915878,13.327995 19.110109,12.050964 20.207224,11.412447 26.045952,11.02938 31.865563,10.971433 z"
id="path4103"
inkscape:connector-curvature="0" />
<path
inkscape:transform-center-y="2.25"
inkscape:transform-center-x="2.25"
style="fill:url(#linearGradient3133);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.31593215000000008;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;"
d="m 10.723737,18.285684 7.623916,-7.935243 13.238019,13.886676 12.492701,-13.886676 8.576909,7.935243 -14.294847,14.878584 13.341856,11.902864 -6.670928,6.94334 L 31.585672,39.351071 18.573785,52.010472 11.676724,45.086347 24.065591,33.164268 10.723737,18.285684 z"
id="path2297"
sodipodi:nodetypes="ccccccccccccc"
inkscape:connector-curvature="0" />
<path
inkscape:connector-curvature="0"
id="path3305"
d="M 31.293607,6.0952825 C 24.436514,6.1604875 17.569304,6.5771256 16.276601,7.2956116 13.691196,8.7325834 1.4963386,29.063913 1.5266972,31.888398 1.5570579,34.712884 14.195039,54.814527 16.810803,56.20204 19.426566,57.589553 44.25941,57.359866 46.844814,55.922894 49.430219,54.485922 61.625078,34.154591 61.594719,31.330106 61.564358,28.505621 48.926376,8.3760634 46.310612,6.9885506 45.002731,6.294794 38.150699,6.0300774 31.293607,6.0952825 z m 0.05936,5.0525485 c 5.36199,-0.05245 10.700046,0.195704 11.722761,0.753694 2.045429,1.115978 11.936445,17.296419 11.960184,19.568154 0.02374,2.271736 -9.523004,18.6078 -11.544693,19.763557 -2.02169,1.155758 -21.429773,1.36721 -23.475201,0.251232 C 17.970585,50.368491 8.1092472,34.188049 8.085508,31.916313 8.061768,29.644577 17.578834,13.2806 19.600523,12.124842 c 1.010846,-0.577879 6.39045,-0.924567 11.75244,-0.977011 z"
style="fill:url(#linearGradient4101);fill-opacity:1;" />
<path
inkscape:connector-curvature="0"
id="path3077"
d="M 14.640198,55.682743 C 9.6971439,47.360612 2.8950957,35.733851 2.9419881,35.686959 c 0.031272,-0.03127 0.5023581,0.289334 1.0468575,0.712459 0.5444994,0.423125 1.0414462,0.769317 1.1043264,0.769317 0.06288,0 2.6329414,4.276521 5.711247,9.50338 l 5.59692,9.503379 2.159128,0.007 2.159126,0.007 -0.34365,-0.584653 C 20.186937,55.28323 17.303514,50.518786 13.968339,45.017137 10.633164,39.515488 7.9043842,34.929294 7.9043842,34.825595 c 0,-0.103699 0.2455542,-0.59277 0.545676,-1.086823 0.3001218,-0.494053 0.545676,-0.941721 0.545676,-0.994816 0,-0.05309 -0.2788317,-0.09654 -0.619626,-0.09654 -0.8505388,0 -1.0953557,-0.488405 -1.0953557,-2.185211 0,-1.90734 -0.048411,-1.868066 2.30512,-1.870072 l 1.9823345,-0.0017 1.052375,-1.721616 c 0.578806,-0.94689 1.052375,-1.785869 1.052375,-1.8644 0,-0.07853 -0.829918,-0.162484 -1.844262,-0.186561 l -1.8442631,-0.04378 4.4809551,-7.327649 4.480953,-7.32765 12.466741,-0.0399 12.466738,-0.0399 0.517892,0.854518 0.517892,0.854518 2.335995,0.04287 2.335994,0.04287 2.742626,4.521316 c 1.508447,2.486723 4.136212,6.819001 5.839482,9.627283 1.703268,2.808283 3.157599,5.105969 3.231846,5.105969 0.256907,0 0.13186,-0.393635 -0.411085,-1.294044 -0.299901,-0.497351 -0.545275,-0.935841 -0.545275,-0.974422 0,-0.03858 0.310833,-0.07015 0.69074,-0.07015 0.575204,0 0.699074,-0.05324 0.740561,-0.318272 0.03599,-0.229934 0.273254,0.06215 0.854835,1.052375 0.702767,1.196557 0.780303,1.410253 0.610448,1.682462 -0.107012,0.171499 -0.377881,0.627528 -0.601929,1.013399 l -0.407361,0.701583 0.533953,0.857491 c 0.293674,0.47162 0.535536,0.950306 0.537472,1.063747 0.0019,0.113441 -3.098537,5.322698 -6.889942,11.576127 l -6.893462,11.36987 -16.876654,0 -16.876655,0 -1.226996,-2.065773 z"
style="fill:none;" />
</g>
</g>
<defs>
<linearGradient id="hexchatGradient" x1="0" y1="0" x2="0" y2="1">
<stop id="hgYellowStop" offset="0" style="stop-color: #FFD600" />
<stop id="hgRedStop" offset="1" style="stop-color: #FF2600" />
</linearGradient>
</defs>
<use xlink:href="#outline" style="opacity:0.15" transform="translate(0,2)" id="shadow" />
<path
style="fill:#000000; fill-opacity: 1;"
d="M 31.71875,4.1088109 C 24.433462,4.1801109 17.123427,4.6356469 15.75,5.4213109 13.003148,6.9926379 0.06149557,29.207739 0.09374996,32.296311 0.12600597,35.384884 13.564642,57.372816 16.34375,58.890061 19.122855,60.407306 45.503149,60.148888 48.25,58.577561 50.996852,57.006233 63.938504,34.791133 63.90625,31.702561 63.87399,28.613989 50.466608,6.5948049 47.6875,5.0775609 46.297948,4.3189379 39.004037,4.0375089 31.71875,4.1088109 Z m -0.1875,9.2500001 c 3.386631,-0.03246 6.676687,0.05409 8.75,0.28125 l -8.71875,9.71875 -9.0625,-9.5 c 2.055746,-0.283043 5.521157,-0.466366 9.03125,-0.5 z m 17.34375,9.84375 c 2.298293,3.744897 4.302354,7.392556 4.3125,8.34375 0.01126,1.055883 -2.358157,5.507241 -4.875,9.6875 l -9.03125,-8.03125 z m -34.46875,0.25 8.75,9.75 -8.1875,7.875 c -2.482342,-3.992634 -4.707927,-8.110307 -4.71875,-9.125 -0.01021,-0.95736 1.927117,-4.687748 4.15625,-8.5 z m 17.15625,16.90625 9.8125,9.21875 c -4.111037,0.67314 -16.108253,0.781873 -19.46875,0.125 z"
id="outline" />
<path
style="fill:url(#hexchatGradient); fill-opacity: 1;"
d="m 31.34375,6.1713109 c -6.857093,0.06521 -13.707297,0.469014 -15,1.1875 C 13.758345,8.7957819 1.5633917,29.128076 1.5937497,31.952561 c 0.03036,2.824486 12.6654863,22.924987 15.2812503,24.3125 2.615763,1.387513 27.445846,1.186972 30.03125,-0.25 2.585405,-1.436972 14.780359,-21.769265 14.75,-24.59375 C 61.62589,28.596826 48.990764,8.4650729 46.375,7.0775609 45.067119,6.3838039 38.200842,6.1061049 31.34375,6.1713109 Z m 0.0625,5.0625001 c 5.36199,-0.05245 10.696035,0.19201 11.71875,0.75 0.06132,0.03346 0.143803,0.127745 0.21875,0.1875 l -11.28125,12.59375 -0.5,0.53125 -0.46875,-0.53125 -11.75,-12.3125 c 0.10903,-0.09884 0.228263,-0.201843 0.3125,-0.25 1.010846,-0.577879 6.38801,-0.916306 11.75,-0.96875 z m 18.0625,9.46875 c 2.883844,4.661341 5.612556,9.652893 5.625,10.84375 0.01348,1.290331 -3.064699,7.087557 -6.09375,12.09375 l -11.09375,-9.90625 -0.53125,-0.46875 0.5,-0.46875 11.59375,-12.09375 z m -35.78125,0.03125 10.84375,12.0625 0.4375,0.46875 -0.46875,0.4375 -10.28125,9.90625 c -3.04689,-4.86606 -6.0493623,-10.36778 -6.0625003,-11.625 -0.01271,-1.216102 2.6892393,-6.451996 5.5312503,-11.25 z m 17.875,17.78125 0.4375,0.4375 12.34375,11.59375 c -0.318014,0.365376 -0.587006,0.638955 -0.78125,0.75 -2.02169,1.155758 -21.423322,1.397228 -23.46875,0.28125 -0.228202,-0.124506 -0.601742,-0.47821 -1,-0.9375 l 12,-11.6875 0.46875,-0.4375 z"
id="coloredX" />
</svg>

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@ -26,4 +26,6 @@ uninstall-hook:
$(UPDATE_MIME_DATABASE);
$(UPDATE_DESKTOP_DATABASE);
EXTRA_DIST = hexchat.appdata.xml.in hexchat.desktop.in htm.desktop.in htm-mime.xml
CLEANFILES = $(appdata_DATA) $(data_desktop_DATA)

124
m4/ax_check_enable_debug.m4 Normal file
View File

@ -0,0 +1,124 @@
# ===========================================================================
# http://www.gnu.org/software/autoconf-archive/ax_check_enable_debug.html
# ===========================================================================
#
# SYNOPSIS
#
# AX_CHECK_ENABLE_DEBUG([enable by default=yes/info/profile/no], [ENABLE DEBUG VARIABLES ...], [DISABLE DEBUG VARIABLES NDEBUG ...], [IS-RELEASE])
#
# DESCRIPTION
#
# Check for the presence of an --enable-debug option to configure, with
# the specified default value used when the option is not present. Return
# the value in the variable $ax_enable_debug.
#
# Specifying 'yes' adds '-g -O0' to the compilation flags for all
# languages. Specifying 'info' adds '-g' to the compilation flags.
# Specifying 'profile' adds '-g -pg' to the compilation flags and '-pg' to
# the linking flags. Otherwise, nothing is added.
#
# Define the variables listed in the second argument if debug is enabled,
# defaulting to no variables. Defines the variables listed in the third
# argument if debug is disabled, defaulting to NDEBUG. All lists of
# variables should be space-separated.
#
# If debug is not enabled, ensure AC_PROG_* will not add debugging flags.
# Should be invoked prior to any AC_PROG_* compiler checks.
#
# IS-RELEASE can be used to change the default to 'no' when making a
# release. Set IS-RELEASE to 'yes' or 'no' as appropriate. By default, it
# uses the value of $ax_is_release, so if you are using the AX_IS_RELEASE
# macro, there is no need to pass this parameter.
#
# AX_IS_RELEASE([git-directory])
# AX_CHECK_ENABLE_DEBUG()
#
# LICENSE
#
# Copyright (c) 2011 Rhys Ulerich <rhys.ulerich@gmail.com>
# Copyright (c) 2014, 2015 Philip Withnall <philip@tecnocode.co.uk>
#
# Copying and distribution of this file, with or without modification, are
# permitted in any medium without royalty provided the copyright notice
# and this notice are preserved.
#serial 5
AC_DEFUN([AX_CHECK_ENABLE_DEBUG],[
AC_BEFORE([$0],[AC_PROG_CC])dnl
AC_BEFORE([$0],[AC_PROG_CXX])dnl
AC_BEFORE([$0],[AC_PROG_F77])dnl
AC_BEFORE([$0],[AC_PROG_FC])dnl
AC_MSG_CHECKING(whether to enable debugging)
ax_enable_debug_default=m4_tolower(m4_normalize(ifelse([$1],,[no],[$1])))
ax_enable_debug_is_release=m4_tolower(m4_normalize(ifelse([$4],,
[$ax_is_release],
[$4])))
# If this is a release, override the default.
AS_IF([test "$ax_enable_debug_is_release" = "yes"],
[ax_enable_debug_default="no"])
m4_define(ax_enable_debug_vars,[m4_normalize(ifelse([$2],,,[$2]))])
m4_define(ax_disable_debug_vars,[m4_normalize(ifelse([$3],,[NDEBUG],[$3]))])
AC_ARG_ENABLE(debug,
[AS_HELP_STRING([--enable-debug=]@<:@yes/info/profile/no@:>@,[compile with debugging])],
[],enable_debug=$ax_enable_debug_default)
# empty mean debug yes
AS_IF([test "x$enable_debug" = "x"],
[enable_debug="yes"])
# case of debug
AS_CASE([$enable_debug],
[yes],[
AC_MSG_RESULT(yes)
CFLAGS="${CFLAGS} -g -O0"
CXXFLAGS="${CXXFLAGS} -g -O0"
FFLAGS="${FFLAGS} -g -O0"
FCFLAGS="${FCFLAGS} -g -O0"
OBJCFLAGS="${OBJCFLAGS} -g -O0"
],
[info],[
AC_MSG_RESULT(info)
CFLAGS="${CFLAGS} -g"
CXXFLAGS="${CXXFLAGS} -g"
FFLAGS="${FFLAGS} -g"
FCFLAGS="${FCFLAGS} -g"
OBJCFLAGS="${OBJCFLAGS} -g"
],
[profile],[
AC_MSG_RESULT(profile)
CFLAGS="${CFLAGS} -g -pg"
CXXFLAGS="${CXXFLAGS} -g -pg"
FFLAGS="${FFLAGS} -g -pg"
FCFLAGS="${FCFLAGS} -g -pg"
OBJCFLAGS="${OBJCFLAGS} -g -pg"
LDFLAGS="${LDFLAGS} -pg"
],
[
AC_MSG_RESULT(no)
dnl Ensure AC_PROG_CC/CXX/F77/FC/OBJC will not enable debug flags
dnl by setting any unset environment flag variables
AS_IF([test "x${CFLAGS+set}" != "xset"],
[CFLAGS=""])
AS_IF([test "x${CXXFLAGS+set}" != "xset"],
[CXXFLAGS=""])
AS_IF([test "x${FFLAGS+set}" != "xset"],
[FFLAGS=""])
AS_IF([test "x${FCFLAGS+set}" != "xset"],
[FCFLAGS=""])
AS_IF([test "x${OBJCFLAGS+set}" != "xset"],
[OBJCFLAGS=""])
])
dnl Define various variables if debugging is disabled.
dnl assert.h is a NOP if NDEBUG is defined, so define it by default.
AS_IF([test "x$enable_debug" = "xyes"],
[m4_map_args_w(ax_enable_debug_vars, [AC_DEFINE(], [,,[Define if debugging is enabled])])],
[m4_map_args_w(ax_disable_debug_vars, [AC_DEFINE(], [,,[Define if debugging is disabled])])])
ax_enable_debug=$enable_debug
])

69
m4/ax_is_release.m4 Normal file
View File

@ -0,0 +1,69 @@
# ===========================================================================
# http://www.gnu.org/software/autoconf-archive/ax_is_release.html
# ===========================================================================
#
# SYNOPSIS
#
# AX_IS_RELEASE(POLICY)
#
# DESCRIPTION
#
# Determine whether the code is being configured as a release, or from
# git. Set the ax_is_release variable to 'yes' or 'no'.
#
# If building a release version, it is recommended that the configure
# script disable compiler errors and debug features, by conditionalising
# them on the ax_is_release variable. If building from git, these
# features should be enabled.
#
# The POLICY parameter specifies how ax_is_release is determined. It can
# take the following values:
#
# * git-directory: ax_is_release will be 'no' if a '.git' directory exists
# * minor-version: ax_is_release will be 'no' if the minor version number
# in $PACKAGE_VERSION is odd; this assumes
# $PACKAGE_VERSION follows the 'major.minor.micro' scheme
# * micro-version: ax_is_release will be 'no' if the micro version number
# in $PACKAGE_VERSION is odd; this assumes
# $PACKAGE_VERSION follows the 'major.minor.micro' scheme
# * always: ax_is_release will always be 'yes'
# * never: ax_is_release will always be 'no'
#
# Other policies may be added in future.
#
# LICENSE
#
# Copyright (c) 2015 Philip Withnall <philip@tecnocode.co.uk>
#
# Copying and distribution of this file, with or without modification, are
# permitted in any medium without royalty provided the copyright notice
# and this notice are preserved.
#serial 3
AC_DEFUN([AX_IS_RELEASE],[
AC_BEFORE([AC_INIT],[$0])
m4_case([$1],
[git-directory],[
# $is_release = (.git directory does not exist)
AS_IF([test -d .git],[ax_is_release=no],[ax_is_release=yes])
],
[minor-version],[
# $is_release = ($minor_version is even)
minor_version=`echo "$PACKAGE_VERSION" | sed 's/[[^.]][[^.]]*.\([[^.]][[^.]]*\).*/\1/'`
AS_IF([test "$(( $minor_version % 2 ))" -ne 0],
[ax_is_release=no],[ax_is_release=yes])
],
[micro-version],[
# $is_release = ($micro_version is even)
micro_version=`echo "$PACKAGE_VERSION" | sed 's/[[^.]]*\.[[^.]]*\.\([[^.]]*\).*/\1/'`
AS_IF([test "$(( $micro_version % 2 ))" -ne 0],
[ax_is_release=no],[ax_is_release=yes])
],
[always],[ax_is_release=yes],
[never],[ax_is_release=no],
[
AC_MSG_ERROR([Invalid policy. Valid policies: git-directory, minor-version.])
])
])

8
m4/clang-analyze.am Normal file
View File

@ -0,0 +1,8 @@
analysis_verbose = $(analysis_verbose_$(V))
analysis_verbose_ = $(analysis_verbose_$(AM_DEFAULT_VERBOSITY))
analysis_verbose_0 = @echo " CCSA " $@; $(COMPILE) --analyze $< -o $@;
analysis_verbose_1 = $(COMPILE) --analyze $< -o $@;
%.plist: %.c
$(analysis_verbose)

View File

@ -1,38 +0,0 @@
# Makefile stub for creating standalone plugin distributions.
plugin_dist: pg_dist pg_dist/config.status
pgi=`cd $(srcdir)/.. && pwd`; cd pg_dist; \
$(MAKE) $(AM_MAKEFLAGS) PLUGIN_INCLUDES=-I$$pgi distcheck dist
pg_dist: pg_distdir pg_dist/configure.in pg_dist/install-sh
cd pg_dist \
&& libtoolize --copy --force --automake \
&& automake --copy --add-missing --foreign \
&& autoconf -l ../$(top_srcdir)
pg_distdir: $(DISTFILES)
test -d pg_dist || mkdir pg_dist
for dfile in $(DISTFILES); do \
test -f $$dfile && cp $$dfile pg_dist \
|| test -f $(srcdir)/$$dfile && cp $(srcdir)/$$dfile pg_dist; done
sed '/Make.plugin/d' < $(srcdir)/Makefile.am > pg_dist/Makefile.am
pg_dist/configure.in: $(srcdir)/../plugin-conf.in
rm -f pg_dist/configure.in
test -f $(srcdir)/config.stub \
&& cat $(srcdir)/config.stub > pg_dist/configure.in || true
cat $(srcdir)/../plugin-conf.in | \
sed 's%@PLUGIN_VERSION@%$(PLUGIN_VERSION)%; \
s%@PLUGIN@%$(PLUGIN)%' >> pg_dist/configure.in
pg_dist/install-sh: pg_distdir
cp $(top_srcdir)/install-sh pg_dist
pg_dist/config.status: pg_dist/configure
cd pg_dist \
&& test -f config.status && $(SHELL) ./config.status --recheck \
|| $(SHELL) ./configure --enable-maintainer-mode
DISTCLEANFILES = pg_dist/* pg_dist
#

View File

@ -2,6 +2,6 @@ libdir = $(hexchatlibdir)
lib_LTLIBRARIES = checksum.la
checksum_la_SOURCES = checksum.c
checksum_la_LDFLAGS = -avoid-version -module
checksum_la_LIBADD =
AM_CPPFLAGS = $(COMMON_CFLAGS) -I$(srcdir)/../../src/common
checksum_la_LDFLAGS = $(PLUGIN_LDFLAGS) -module
checksum_la_LIBADD = $(GLIB_LIBS)
checksum_la_CFLAGS = $(GLIB_CFLAGS) -I$(top_srcdir)/src/common

View File

@ -20,222 +20,194 @@
* THE SOFTWARE.
*/
#ifdef __APPLE__
#define __AVAILABILITYMACROS__
#define DEPRECATED_IN_MAC_OS_X_VERSION_10_7_AND_LATER
#endif
#include "config.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <openssl/sha.h>
#include <glib.h>
#ifdef WIN32
#ifndef snprintf
#define snprintf _snprintf
#endif
#define stat _stat64
#else
/* for INT_MAX */
#include <limits.h>
#define __USE_LARGEFILE64
#define _LARGEFILE_SOURCE
#define _LARGEFILE64_SOURCE
#endif
#include <glib/gstdio.h>
#include <gio/gio.h>
#include "hexchat-plugin.h"
#define BUFSIZE 32768
#define DEFAULT_LIMIT 256 /* default size is 256 MiB */
#define SHA256_DIGEST_LENGTH 32
#define SHA256_BUFFER_LENGTH 65
static hexchat_plugin *ph; /* plugin handle */
static char name[] = "Checksum";
static char desc[] = "Calculate checksum for DCC file transfers";
static char version[] = "3.1";
/* Use of OpenSSL SHA256 interface: http://adamlamers.com/?p=5 */
static void
sha256_hash_string (unsigned char hash[SHA256_DIGEST_LENGTH], char outputBuffer[65])
set_limit (char *size)
{
int i;
for (i = 0; i < SHA256_DIGEST_LENGTH; i++)
int limit = atoi (size);
if (limit > 0 && limit < INT_MAX)
{
sprintf (outputBuffer + (i * 2), "%02x", hash[i]);
}
outputBuffer[64] = 0;
}
#if 0
static void
sha256 (char *string, char outputBuffer[65])
{
int i;
unsigned char hash[SHA256_DIGEST_LENGTH];
SHA256_CTX sha256;
SHA256_Init (&sha256);
SHA256_Update (&sha256, string, strlen (string));
SHA256_Final (hash, &sha256);
for (i = 0; i < SHA256_DIGEST_LENGTH; i++)
{
sprintf (outputBuffer + (i * 2), "%02x", hash[i]);
}
outputBuffer[64] = 0;
}
#endif
static int
sha256_file (char *path, char outputBuffer[65])
{
int bytesRead;
unsigned char *buffer;
unsigned char hash[SHA256_DIGEST_LENGTH];
SHA256_CTX sha256;
FILE *file = fopen (path, "rb");
if (!file)
{
return -534;
}
SHA256_Init (&sha256);
buffer = malloc (BUFSIZE);
bytesRead = 0;
if (!buffer)
{
fclose (file);
return ENOMEM;
}
while ((bytesRead = fread (buffer, 1, BUFSIZE, file)))
{
SHA256_Update (&sha256, buffer, bytesRead);
}
SHA256_Final (hash, &sha256);
sha256_hash_string (hash, outputBuffer);
fclose (file);
free (buffer);
return 0;
}
static void
set_limit (char* size)
{
int buffer = atoi (size);
if (buffer > 0 && buffer < INT_MAX)
{
if (hexchat_pluginpref_set_int (ph, "limit", buffer))
{
hexchat_printf (ph, "File size limit has successfully been set to: %d MiB\n", buffer);
}
if (hexchat_pluginpref_set_int (ph, "limit", limit))
hexchat_printf (ph, "Checksum: File size limit has successfully been set to: %d MiB\n", limit);
else
{
hexchat_printf (ph, "File access error while saving!\n");
}
hexchat_printf (ph, "Checksum: File access error while saving!\n");
}
else
{
hexchat_printf (ph, "Invalid input!\n");
hexchat_printf (ph, "Checksum: Invalid input!\n");
}
}
static int
get_limit ()
get_limit (void)
{
int size = hexchat_pluginpref_get_int (ph, "limit");
if (size <= -1 || size >= INT_MAX)
{
if (size <= 0 || size >= INT_MAX)
return DEFAULT_LIMIT;
}
else
{
return size;
}
}
static void
print_limit ()
static gboolean
check_limit (GFile *file)
{
hexchat_printf (ph, "File size limit for checksums: %d MiB", get_limit ());
GFileInfo *file_info;
goffset file_size;
file_info = g_file_query_info (file, G_FILE_ATTRIBUTE_STANDARD_SIZE, G_FILE_QUERY_INFO_NONE,
NULL, NULL);
if (!file_info)
return FALSE;
file_size = g_file_info_get_size (file_info);
g_object_unref (file_info);
if (file_size > get_limit () * 1048576ll)
return FALSE;
return TRUE;
}
static gboolean
sha256_from_stream (GFileInputStream *file_stream, char out_buf[])
{
GChecksum *checksum;
gssize bytes_read;
guint8 digest[SHA256_DIGEST_LENGTH];
gsize digest_len = sizeof(digest);
guchar buffer[BUFSIZE];
gsize i;
checksum = g_checksum_new (G_CHECKSUM_SHA256);
while ((bytes_read = g_input_stream_read (G_INPUT_STREAM (file_stream), buffer, sizeof (buffer), NULL, NULL)))
{
if (bytes_read == -1)
{
g_checksum_free (checksum);
return FALSE;
}
g_checksum_update (checksum, buffer, bytes_read);
}
g_checksum_get_digest (checksum, digest, &digest_len);
g_checksum_free (checksum);
for (i = 0; i < SHA256_DIGEST_LENGTH; i++)
{
/* out_buf will be exactly SHA256_BUFFER_LENGTH including null */
g_sprintf (out_buf + (i * 2), "%02x", digest[i]);
}
return TRUE;
}
static gboolean
sha256_from_file (char *filename, char out_buf[])
{
GFileInputStream *file_stream;
char *filename_fs;
GFile *file;
filename_fs = g_filename_from_utf8 (filename, -1, NULL, NULL, NULL);
if (!filename_fs)
{
hexchat_printf (ph, "Checksum: Invalid filename (%s)\n", filename);
return FALSE;
}
file = g_file_new_for_path (filename_fs);
g_free (filename_fs);
if (!file)
{
hexchat_printf (ph, "Checksum: Failed to open %s\n", filename);
return FALSE;
}
if (!check_limit (file))
{
hexchat_printf (ph, "Checksum: %s is larger than size limit. You can increase it with /CHECKSUM SET.\n", filename);
g_object_unref (file);
return FALSE;
}
file_stream = g_file_read (file, NULL, NULL);
if (!file_stream)
{
hexchat_printf (ph, "Checksum: Failed to read file %s\n", filename);
g_object_unref (file);
return FALSE;
}
if (!sha256_from_stream (file_stream, out_buf))
{
hexchat_printf (ph, "Checksum: Failed to generate checksum for %s\n", filename);
g_object_unref (file_stream);
g_object_unref (file);
return FALSE;
}
g_object_unref (file_stream);
g_object_unref (file);
return TRUE;
}
static int
dccrecv_cb (char *word[], void *userdata)
{
int result;
struct stat buffer; /* buffer for storing file info */
char sum[65]; /* buffer for checksum */
const char *file;
char *cfile;
const char *dcc_completed_dir;
char *filename, checksum[SHA256_BUFFER_LENGTH];
if (hexchat_get_prefs (ph, "dcc_completed_dir", &file, NULL) == 1 && file[0] != 0)
{
cfile = g_strconcat (file, G_DIR_SEPARATOR_S, word[1], NULL);
}
/* Print in the privmsg tab of the sender */
hexchat_set_context (ph, hexchat_find_context (ph, NULL, word[3]));
if (hexchat_get_prefs (ph, "dcc_completed_dir", &dcc_completed_dir, NULL) == 1 && dcc_completed_dir[0] != '\0')
filename = g_build_filename (dcc_completed_dir, word[1], NULL);
else
filename = g_strdup (word[2]);
if (sha256_from_file (filename, checksum))
{
cfile = g_strdup(word[2]);
hexchat_printf (ph, "SHA-256 checksum for %s (local): %s\n", word[1], checksum);
}
result = stat (cfile, &buffer);
if (result == 0) /* stat returns 0 on success */
{
if (buffer.st_size <= (unsigned long long) get_limit () * 1048576)
{
sha256_file (cfile, sum); /* file is the full filename even if completed dir set */
/* try to print the checksum in the privmsg tab of the sender */
hexchat_set_context (ph, hexchat_find_context (ph, NULL, word[3]));
hexchat_printf (ph, "SHA-256 checksum for %s (local): %s\n", word[1], sum);
}
else
{
hexchat_set_context (ph, hexchat_find_context (ph, NULL, word[3]));
hexchat_printf (ph, "SHA-256 checksum for %s (local): (size limit reached, no checksum calculated, you can increase it with /CHECKSUM INC)\n", word[1]);
}
}
else
{
hexchat_printf (ph, "File access error!\n");
}
g_free (cfile);
g_free (filename);
return HEXCHAT_EAT_NONE;
}
static int
dccoffer_cb (char *word[], void *userdata)
{
int result;
struct stat buffer; /* buffer for storing file info */
char sum[65]; /* buffer for checksum */
char checksum[SHA256_BUFFER_LENGTH];
result = stat (word[3], &buffer);
if (result == 0) /* stat returns 0 on success */
/* Print in the privmsg tab of the receiver */
hexchat_set_context (ph, hexchat_find_context (ph, NULL, word[3]));
if (sha256_from_file (word[3], checksum))
{
if (buffer.st_size <= (unsigned long long) get_limit () * 1048576)
{
sha256_file (word[3], sum); /* word[3] is the full filename */
hexchat_commandf (ph, "quote PRIVMSG %s :SHA-256 checksum for %s (remote): %s", word[2], word[1], sum);
}
else
{
hexchat_set_context (ph, hexchat_find_context (ph, NULL, word[3]));
hexchat_printf (ph, "quote PRIVMSG %s :SHA-256 checksum for %s (remote): (size limit reached, no checksum calculated)", word[2], word[1]);
}
}
else
{
hexchat_printf (ph, "File access error!\n");
hexchat_commandf (ph, "quote PRIVMSG %s :SHA-256 checksum for %s (remote): %s", word[2], word[1], checksum);
}
return HEXCHAT_EAT_NONE;
@ -246,7 +218,7 @@ checksum (char *word[], char *word_eol[], void *userdata)
{
if (!g_ascii_strcasecmp ("GET", word[2]))
{
print_limit ();
hexchat_printf (ph, "File size limit for checksums: %d MiB", get_limit ());
}
else if (!g_ascii_strcasecmp ("SET", word[2]))
{
@ -259,7 +231,7 @@ checksum (char *word[], char *word_eol[], void *userdata)
hexchat_printf (ph, " SET <filesize> - set the maximum file size (in MiB) to be hashed\n");
}
return HEXCHAT_EAT_NONE;
return HEXCHAT_EAT_ALL;
}
int
@ -277,7 +249,7 @@ hexchat_plugin_init (hexchat_plugin *plugin_handle, char **plugin_name, char **p
hexchat_pluginpref_set_int (ph, "limit", DEFAULT_LIMIT);
}
hexchat_hook_command (ph, "CHECKSUM", HEXCHAT_PRI_NORM, checksum, "Usage: /CHECKSUM GET|SET", 0);
hexchat_hook_command (ph, "CHECKSUM", HEXCHAT_PRI_NORM, checksum, "Usage: /CHECKSUM GET|SET", NULL);
hexchat_hook_print (ph, "DCC RECV Complete", HEXCHAT_PRI_NORM, dccrecv_cb, NULL);
hexchat_hook_print (ph, "DCC Offer", HEXCHAT_PRI_NORM, dccoffer_cb, NULL);

View File

@ -1,7 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Label="Configuration">
<PlatformToolset>v120</PlatformToolset>
<PlatformToolset>v140</PlatformToolset>
<ConfigurationType>DynamicLibrary</ConfigurationType>
</PropertyGroup>
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Release|Win32">
@ -19,57 +20,19 @@
<RootNamespace>checksum</RootNamespace>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="..\..\win32\hexchat.props" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="..\..\win32\hexchat.props" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="..\..\win32\hexchat.props" />
<PropertyGroup>
<TargetName>hcchecksum</TargetName>
<OutDir>$(HexChatBin)</OutDir>
<IntDir>$(HexChatObj)$(ProjectName)\</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental>
<TargetName>hcchecksum</TargetName>
<OutDir>$(HexChatBin)</OutDir>
<IntDir>$(HexChatObj)$(ProjectName)\</IntDir>
<OutDir>$(HexChatRel)plugins\</OutDir>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<PrecompiledHeader>
</PrecompiledHeader>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;CHECKSUM_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(DepsRoot)\include;$(Glib);..\..\src\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<AdditionalIncludeDirectories>$(DepsRoot)\include;$(Glib);..\..\src\common;$(HexChatLib);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<ModuleDefinitionFile>checksum.def</ModuleDefinitionFile>
<AdditionalLibraryDirectories>$(DepsRoot)\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>$(DepLibs);%(AdditionalDependencies)</AdditionalDependencies>
@ -77,19 +40,10 @@
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<PrecompiledHeader>
</PrecompiledHeader>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;_WIN64;_AMD64_;NDEBUG;_WINDOWS;_USRDLL;CHECKSUM_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(DepsRoot)\include;$(Glib);..\..\src\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<AdditionalIncludeDirectories>$(DepsRoot)\include;$(Glib);..\..\src\common;$(HexChatLib);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<ModuleDefinitionFile>checksum.def</ModuleDefinitionFile>
<AdditionalLibraryDirectories>$(DepsRoot)\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>$(DepLibs);%(AdditionalDependencies)</AdditionalDependencies>
@ -102,6 +56,4 @@
<None Include="checksum.def" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
</Project>

View File

@ -2,7 +2,7 @@ libdir = $(hexchatlibdir)
lib_LTLIBRARIES = doat.la
doat_la_SOURCES = doat.c
doat_la_LDFLAGS = -avoid-version -module
doat_la_LIBADD =
AM_CPPFLAGS = $(COMMON_CFLAGS) -I$(srcdir)/../../src/common
doat_la_LDFLAGS = $(PLUGIN_LDFLAGS) -module
doat_la_LIBADD = $(GLIB_LIBS)
doat_la_CFLAGS = $(GLIB_CFLAGS) -I$(top_srcdir)/src/common

View File

@ -5,9 +5,12 @@
* http://sam.zoy.org/wtfpl/COPYING or http://lwsitu.com/xchat/COPYING
* for more details. */
#include "config.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <glib.h>
#include "hexchat-plugin.h"
static hexchat_plugin *ph;
@ -31,7 +34,7 @@ parse_command( char *word[], char *word_eol[], void *userdata ) {
break;
}
channel = strdup( token );
channel = g_strdup( token );
delimiter = strchr( channel, '/' );
@ -40,13 +43,13 @@ parse_command( char *word[], char *word_eol[], void *userdata ) {
*delimiter = '\0';
if( strlen( delimiter + 1 ) > 0 ) {
server = strdup( delimiter + 1 );
server = g_strdup( delimiter + 1 );
}
}
/* /Network form */
if( strlen( channel ) == 0 ) {
free( channel );
g_free( channel );
channel = NULL;
}
@ -58,13 +61,8 @@ parse_command( char *word[], char *word_eol[], void *userdata ) {
}
}
if( channel != NULL ) {
free( channel );
}
if( server != NULL ) {
free( server );
}
g_free( channel );
g_free( server );
}
}
return HEXCHAT_EAT_HEXCHAT;

View File

@ -1,7 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Label="Configuration">
<PlatformToolset>v120</PlatformToolset>
<PlatformToolset>v140</PlatformToolset>
<ConfigurationType>DynamicLibrary</ConfigurationType>
</PropertyGroup>
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Release|Win32">
@ -19,75 +20,32 @@
<RootNamespace>doat</RootNamespace>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="..\..\win32\hexchat.props" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="..\..\win32\hexchat.props" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="..\..\win32\hexchat.props" />
<PropertyGroup>
<TargetName>hcdoat</TargetName>
<OutDir>$(HexChatBin)</OutDir>
<IntDir>$(HexChatObj)$(ProjectName)\</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental>
<TargetName>hcdoat</TargetName>
<OutDir>$(HexChatBin)</OutDir>
<IntDir>$(HexChatObj)$(ProjectName)\</IntDir>
<OutDir>$(HexChatRel)plugins\</OutDir>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<PrecompiledHeader>
</PrecompiledHeader>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;DOAT_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>..\..\src\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<AdditionalIncludeDirectories>..\..\src\common;$(HexChatLib);$(Glib);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<AdditionalLibraryDirectories>$(DepsRoot)\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>$(DepLibs);%(AdditionalDependencies)</AdditionalDependencies>
<ModuleDefinitionFile>doat.def</ModuleDefinitionFile>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<PrecompiledHeader>
</PrecompiledHeader>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;_WIN64;_AMD64_;NDEBUG;_WINDOWS;_USRDLL;DOAT_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>..\..\src\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<AdditionalIncludeDirectories>..\..\src\common;$(HexChatLib);$(Glib);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<AdditionalLibraryDirectories>$(DepsRoot)\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>$(DepLibs);%(AdditionalDependencies)</AdditionalDependencies>
<ModuleDefinitionFile>doat.def</ModuleDefinitionFile>
</Link>
</ItemDefinitionGroup>
@ -98,6 +56,4 @@
<None Include="doat.def" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
</Project>

View File

@ -1,7 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Label="Configuration">
<PlatformToolset>v120</PlatformToolset>
<PlatformToolset>v140</PlatformToolset>
<ConfigurationType>DynamicLibrary</ConfigurationType>
</PropertyGroup>
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Release|Win32">
@ -19,75 +20,28 @@
<RootNamespace>exec</RootNamespace>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="..\..\win32\hexchat.props" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="..\..\win32\hexchat.props" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="..\..\win32\hexchat.props" />
<PropertyGroup>
<TargetName>hcexec</TargetName>
<OutDir>$(HexChatBin)</OutDir>
<IntDir>$(HexChatObj)$(ProjectName)\</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental>
<TargetName>hcexec</TargetName>
<OutDir>$(HexChatBin)</OutDir>
<IntDir>$(HexChatObj)$(ProjectName)\</IntDir>
<OutDir>$(HexChatRel)plugins\</OutDir>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<PrecompiledHeader>
</PrecompiledHeader>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;EXEC_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<AdditionalIncludeDirectories>..\..\src\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<ModuleDefinitionFile>exec.def</ModuleDefinitionFile>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<PrecompiledHeader>
</PrecompiledHeader>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;_WIN64;_AMD64_;NDEBUG;_WINDOWS;_USRDLL;EXEC_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<AdditionalIncludeDirectories>..\..\src\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<ModuleDefinitionFile>exec.def</ModuleDefinitionFile>
</Link>
</ItemDefinitionGroup>
@ -98,6 +52,4 @@
<ClCompile Include="exec.c" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
</Project>

View File

@ -1,9 +1,9 @@
EXTRA_DIST = INSTALL LICENSE
EXTRA_DIST = INSTALL LICENSE fish.h irc.h keystore.h plugin_hexchat.h
libdir = $(hexchatlibdir)
lib_LTLIBRARIES = fishlim.la
fishlim_la_SOURCES = fish.c irc.c keystore.c misc.c plugin_hexchat.c
fishlim_la_LDFLAGS = -avoid-version -module
fishlim_la_LIBADD =
AM_CPPFLAGS = $(COMMON_CFLAGS) -I$(srcdir)/../../src/common
fishlim_la_SOURCES = fish.c irc.c keystore.c plugin_hexchat.c
fishlim_la_LDFLAGS = $(PLUGIN_LDFLAGS) -module
fishlim_la_LIBADD = $(GLIB_LIBS) $(OPENSSL_LIBS)
fishlim_la_CFLAGS = $(GLIB_CFLAGS) $(OPENSSL_CFLAGS) -I$(top_srcdir)/src/common

View File

@ -39,17 +39,17 @@ static const char fish_base64[64] = "./0123456789abcdefghijklmnopqrstuvwxyzABCDE
static const signed char fish_unbase64[256] = {
IB,IB,IB,IB,IB,IB,IB,IB, IB,IB,IB,IB,IB,IB,IB,IB,
IB,IB,IB,IB,IB,IB,IB,IB, IB,IB,IB,IB,IB,IB,IB,IB,
// ! " # $ % & ' ( ) * + , - . /
/* ! " # $ % & ' ( ) * + , - . / */
IB,IB,IB,IB,IB,IB,IB,IB, IB,IB,IB,IB,IB,IB, 0, 1,
// 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
/* 0 1 2 3 4 5 6 7 8 9 : ; < = > ? */
2, 3, 4, 5, 6, 7, 8, 9, 10,11,IB,IB,IB,IB,IB,IB,
// @ A B C D E F G H I J K L M N O
/* @ A B C D E F G H I J K L M N O */
IB,38,39,40,41,42,43,44, 45,46,47,48,49,50,51,52,
// P Q R S T U V W X Y Z [ \ ] ^ _
/* P Q R S T U V W X Y Z [ \ ] ^ _*/
53,54,55,56,57,58,59,60, 61,62,63,IB,IB,IB,IB,IB,
// ` a b c d e f g h i j k l m n o
/* ` a b c d e f g h i j k l m n o */
IB,12,13,14,15,16,17,18, 19,20,21,22,23,24,25,26,
// p q r s t u v w x y z { | } ~ <del>
/* p q r s t u v w x y z { | } ~ <del> */
27,28,29,30,31,32,33,34, 35,36,37,IB,IB,IB,IB,IB,
};
@ -75,12 +75,11 @@ char *fish_encrypt(const char *key, size_t keylen, const char *message) {
messagelen = strlen(message);
if (messagelen == 0) return NULL;
encrypted = malloc(((messagelen-1)/8)*12 + 12 + 1); // each 8-byte block becomes 12 bytes
encrypted = g_malloc(((messagelen - 1) / 8) * 12 + 12 + 1); /* each 8-byte block becomes 12 bytes */
end = encrypted;
if (!encrypted) return NULL;
while (*message) {
// Read 8 bytes (a Blowfish block)
/* Read 8 bytes (a Blowfish block) */
BF_LONG binary[2] = { 0, 0 };
unsigned char c;
for (i = 0; i < 8; i++) {
@ -90,10 +89,10 @@ char *fish_encrypt(const char *key, size_t keylen, const char *message) {
}
message += 8;
// Encrypt block
/* Encrypt block */
BF_encrypt(binary, &bfkey);
// Emit FiSH-BASE64
/* Emit FiSH-BASE64 */
bit = 0;
word = 1;
for (j = 0; j < 12; j++) {
@ -106,7 +105,7 @@ char *fish_encrypt(const char *key, size_t keylen, const char *message) {
}
}
// Stop if a null terminator was found
/* Stop if a null terminator was found */
if (c == '\0') break;
}
*end = '\0';
@ -124,12 +123,11 @@ char *fish_decrypt(const char *key, size_t keylen, const char *data) {
unsigned char d;
BF_set_key(&bfkey, keylen, (const unsigned char*)key);
decrypted = malloc(strlen(data)+1);
decrypted = g_malloc(strlen(data) + 1);
end = decrypted;
if (!decrypted) return NULL;
while (*data) {
// Convert from FiSH-BASE64
/* Convert from FiSH-BASE64 */
BF_LONG binary[2] = { 0, 0 };
bit = 0;
word = 1;
@ -144,10 +142,10 @@ char *fish_decrypt(const char *key, size_t keylen, const char *data) {
}
}
// Decrypt block
/* Decrypt block */
BF_decrypt(binary, &bfkey);
// Copy to buffer
/* Copy to buffer */
GET_BYTES(end, binary[0]);
GET_BYTES(end, binary[1]);
}
@ -165,14 +163,14 @@ char *fish_encrypt_for_nick(const char *nick, const char *data) {
char *key;
char *encrypted;
// Look for key
/* Look for key */
key = keystore_get_key(nick);
if (!key) return NULL;
// Encrypt
/* Encrypt */
encrypted = fish_encrypt(key, strlen(key), data);
free(key);
g_free(key);
return encrypted;
}
@ -183,14 +181,14 @@ char *fish_encrypt_for_nick(const char *nick, const char *data) {
char *fish_decrypt_from_nick(const char *nick, const char *data) {
char *key;
char *decrypted;
// Look for key
/* Look for key */
key = keystore_get_key(nick);
if (!key) return NULL;
// Decrypt
/* Decrypt */
decrypted = fish_decrypt(key, strlen(key), data);
free(key);
g_free(key);
return decrypted;
}

View File

@ -25,9 +25,10 @@
#ifndef FISH_H
#define FISH_H
#include <stdbool.h>
#include <stddef.h>
#include <glib.h>
char *fish_encrypt(const char *key, size_t keylen, const char *message);
char *fish_decrypt(const char *key, size_t keylen, const char *data);
char *fish_encrypt_for_nick(const char *nick, const char *data);

View File

@ -1,7 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Label="Configuration">
<PlatformToolset>v120</PlatformToolset>
<PlatformToolset>v140</PlatformToolset>
<ConfigurationType>DynamicLibrary</ConfigurationType>
</PropertyGroup>
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Release|Win32">
@ -19,57 +20,19 @@
<RootNamespace>fishlim</RootNamespace>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="..\..\win32\hexchat.props" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="..\..\win32\hexchat.props" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="..\..\win32\hexchat.props" />
<PropertyGroup>
<TargetName>hcfishlim</TargetName>
<OutDir>$(HexChatBin)</OutDir>
<IntDir>$(HexChatObj)$(ProjectName)\</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental>
<TargetName>hcfishlim</TargetName>
<OutDir>$(HexChatBin)</OutDir>
<IntDir>$(HexChatObj)$(ProjectName)\</IntDir>
<OutDir>$(HexChatRel)plugins\</OutDir>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<PrecompiledHeader>
</PrecompiledHeader>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;FISHLIM_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<AdditionalIncludeDirectories>$(DepsRoot)\include;$(Glib);..\..\src\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>$(DepsRoot)\include;$(Glib);..\..\src\common;$(HexChatLib);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<ModuleDefinitionFile>fishlim.def</ModuleDefinitionFile>
<AdditionalLibraryDirectories>$(DepsRoot)\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>$(DepLibs);%(AdditionalDependencies)</AdditionalDependencies>
@ -77,19 +40,10 @@
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<PrecompiledHeader>
</PrecompiledHeader>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;_WIN64;_AMD64_;NDEBUG;_WINDOWS;_USRDLL;FISHLIM_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<AdditionalIncludeDirectories>$(DepsRoot)\include;$(Glib);..\..\src\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>$(DepsRoot)\include;$(Glib);..\..\src\common;$(HexChatLib);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<ModuleDefinitionFile>fishlim.def</ModuleDefinitionFile>
<AdditionalLibraryDirectories>$(DepsRoot)\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>$(DepLibs);%(AdditionalDependencies)</AdditionalDependencies>
@ -103,17 +57,13 @@
<ClInclude Include="fish.h" />
<ClInclude Include="irc.h" />
<ClInclude Include="keystore.h" />
<ClInclude Include="misc.h" />
<ClInclude Include="plugin_hexchat.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="fish.c" />
<ClCompile Include="irc.c" />
<ClCompile Include="keystore.c" />
<ClCompile Include="misc.c" />
<ClCompile Include="plugin_hexchat.c" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
</Project>

View File

@ -32,9 +32,6 @@
<ClInclude Include="keystore.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="misc.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="plugin_hexchat.h">
<Filter>Header Files</Filter>
</ClInclude>
@ -49,9 +46,6 @@
<ClCompile Include="keystore.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="misc.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="plugin_hexchat.c">
<Filter>Source Files</Filter>
</ClCompile>

View File

@ -22,8 +22,9 @@
*/
#include <stdlib.h>
#include <string.h>
#include "config.h"
#include <glib.h>
#include "irc.h"
/**
@ -31,26 +32,26 @@
* at spaces. The prefix and command is extracted from the message, and
* parameters_offset is set to the index of the first parameter.
*/
bool irc_parse_message(const char *words[],
gboolean irc_parse_message(const char *words[],
const char **prefix, const char **command,
size_t *parameters_offset) {
size_t w = 1;
if (prefix) *prefix = NULL;
if (command) *command = NULL;
// See if the message starts with a prefix (sender user)
/* See if the message starts with a prefix (sender user) */
if (words[w][0] == ':') {
if (prefix) *prefix = &words[w][1];
w++;
}
// Check command
if (words[w][0] == '\0') return false;
/* Check command */
if (words[w][0] == '\0') return FALSE;
if (command) *command = words[w];
w++;
*parameters_offset = w;
return true;
return TRUE;
}
@ -65,48 +66,15 @@ bool irc_parse_message(const char *words[],
*/
char *irc_prefix_get_nick(const char *prefix) {
const char *end;
char *nick;
size_t length;
if (!prefix) return NULL;
// Find end of nick
/* Find end of nick */
end = prefix;
while (*end != '\0' && *end != '!' && *end != '@') end++;
// Allocate string
/* Allocate string */
length = end - prefix;
nick = malloc(length+1);
if (!nick) return NULL;
// Copy to string
memcpy(nick, prefix, length);
nick[length] = '\0';
return nick;
return g_strndup (prefix, length);
}
/**
* Compares two nick names. Return 0 if equal. Otherwise the return value is
* less than zero if a is less than b or greater than zero if a is greater
* than b.
*/
int irc_nick_cmp(const char *a, const char *b) {
char ac;
char bc;
char diff;
for (;;) {
ac = *(a++);
bc = *(b++);
// Change into IRC uppercase (see RFC 2812 section 2.2)
if (ac >= 'a' && ac <= '~') ac &= ~0x20;
if (bc >= 'a' && bc <= '~') bc &= ~0x20;
diff = ac - bc;
if (diff) return diff;
if (!ac) return 0;
}
}

View File

@ -25,14 +25,13 @@
#ifndef IRC_H
#define IRC_H
#include <stdbool.h>
#include <stddef.h>
#include <glib.h>
bool irc_parse_message(const char *words[],
gboolean irc_parse_message(const char *words[],
const char **prefix, const char **command,
size_t *parameters_offset);
char *irc_prefix_get_nick(const char *prefix);
int irc_nick_cmp(const char *a, const char *b);
#endif

View File

@ -22,12 +22,13 @@
*/
#include "config.h"
#include <glib.h>
#include <stdlib.h>
#include <string.h>
#include "irc.h"
#include "fish.h"
#include "misc.h"
#include "keystore.h"
#include "plugin_hexchat.h"
@ -38,7 +39,7 @@ static char *keystore_password = NULL;
/**
* Opens the key store file: ~/.config/hexchat/addon_fishlim.conf
*/
static GKeyFile *getConfigFile() {
static GKeyFile *getConfigFile(void) {
gchar *filename = get_config_filename();
GKeyFile *keyfile = g_key_file_new();
@ -54,10 +55,10 @@ static GKeyFile *getConfigFile() {
/**
* Returns the key store password, or the default.
*/
static const char *get_keystore_password() {
static const char *get_keystore_password(void) {
return (keystore_password != NULL ?
keystore_password :
// Silly default value...
/* Silly default value... */
"blowinikey");
}
@ -87,17 +88,17 @@ static gchar *get_nick_value(GKeyFile *keyfile, const char *nick, const char *it
* Extracts a key from the key store file.
*/
char *keystore_get_key(const char *nick) {
// Get the key
/* Get the key */
GKeyFile *keyfile = getConfigFile();
gchar *value = get_nick_value(keyfile, nick, "key");
g_key_file_free(keyfile);
if (!value) return NULL;
if (strncmp(value, "+OK ", 4) != 0) {
// Key is stored in plaintext
return import_glib_string(value);
/* Key is stored in plaintext */
return value;
} else {
// Key is encrypted
/* Key is encrypted */
const char *encrypted = value+4;
const char *password = get_keystore_password();
char *decrypted = fish_decrypt(password, strlen(password), encrypted);
@ -109,10 +110,10 @@ char *keystore_get_key(const char *nick) {
/**
* Deletes a nick and the associated key in the key store file.
*/
static bool delete_nick(GKeyFile *keyfile, const char *nick) {
static gboolean delete_nick(GKeyFile *keyfile, const char *nick) {
gchar **group;
gchar **groups = g_key_file_get_groups(keyfile, NULL);
bool ok = false;
gboolean ok = FALSE;
for (group = groups; *group != NULL; group++) {
if (!irc_nick_cmp(*group, nick)) {
@ -125,58 +126,77 @@ static bool delete_nick(GKeyFile *keyfile, const char *nick) {
return ok;
}
#if !GLIB_CHECK_VERSION(2,40,0)
/**
* Writes the key store file to disk.
*/
static bool save_keystore(GKeyFile *keyfile) {
char *filename;
bool ok;
// Serialize
static gboolean keyfile_save_to_file (GKeyFile *keyfile, char *filename) {
gboolean ok;
/* Serialize */
gsize file_length;
gchar *file_data = g_key_file_to_data(keyfile, &file_length, NULL);
if (!file_data) return false;
// Write to file
filename = get_config_filename();
ok = g_file_set_contents(filename, file_data, file_length, NULL);
g_free(filename);
if (!file_data)
return FALSE;
/* Write to file */
ok = g_file_set_contents (filename, file_data, file_length, NULL);
g_free(file_data);
return ok;
}
#endif
/**
* Writes the key store file to disk.
*/
static gboolean save_keystore(GKeyFile *keyfile) {
char *filename;
gboolean ok;
filename = get_config_filename();
#if !GLIB_CHECK_VERSION(2,40,0)
ok = keyfile_save_to_file (keyfile, filename);
#else
ok = g_key_file_save_to_file (keyfile, filename, NULL);
#endif
g_free (filename);
return ok;
}
/**
* Sets a key in the key store file.
*/
bool keystore_store_key(const char *nick, const char *key) {
gboolean keystore_store_key(const char *nick, const char *key) {
const char *password;
char *encrypted;
char *wrapped;
bool ok = false;
gboolean ok = FALSE;
GKeyFile *keyfile = getConfigFile();
// Remove old key
/* Remove old key */
delete_nick(keyfile, nick);
// Add new key
/* Add new key */
password = get_keystore_password();
if (password) {
// Encrypt the password
/* Encrypt the password */
encrypted = fish_encrypt(password, strlen(password), key);
if (!encrypted) goto end;
// Prepend "+OK "
/* Prepend "+OK " */
wrapped = g_strconcat("+OK ", encrypted, NULL);
g_free(encrypted);
// Store encrypted in file
/* Store encrypted in file */
g_key_file_set_string(keyfile, nick, "key", wrapped);
free(wrapped);
g_free(wrapped);
} else {
// Store unencrypted in file
/* Store unencrypted in file */
g_key_file_set_string(keyfile, nick, "key", key);
}
// Save key store file
/* Save key store file */
ok = save_keystore(keyfile);
end:
@ -187,23 +207,15 @@ bool keystore_store_key(const char *nick, const char *key) {
/**
* Deletes a nick from the key store.
*/
bool keystore_delete_nick(const char *nick) {
gboolean keystore_delete_nick(const char *nick) {
GKeyFile *keyfile = getConfigFile();
// Delete entry
bool ok = delete_nick(keyfile, nick);
/* Delete entry */
gboolean ok = delete_nick(keyfile, nick);
// Save
/* Save */
if (ok) save_keystore(keyfile);
g_key_file_free(keyfile);
return ok;
}
void keystore_secure_free(void *ptr, size_t size) {
secure_erase(ptr, size);
free(ptr);
}

View File

@ -25,14 +25,13 @@
#ifndef KEYSTORE_H
#define KEYSTORE_H
#include <stdbool.h>
#include <stddef.h>
char *keystore_get_key(const char *nick);
bool keystore_store_key(const char *nick, const char *key);
bool keystore_delete_nick(const char *nick);
#include <glib.h>
void keystore_secure_free(void *ptr, size_t size);
char *keystore_get_key(const char *nick);
gboolean keystore_store_key(const char *nick, const char *key);
gboolean keystore_delete_nick(const char *nick);
#endif

View File

@ -1,54 +0,0 @@
/*
Copyright (c) 2010 Samuel Lidén Borell <samuel@kodafritt.se>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
#include <glib.h>
#include <stdlib.h>
#include <string.h>
#include "misc.h"
void secure_erase(void *ptr, size_t size) {
// "volatile" prevents this code from being optimized away
volatile char* volptr = ptr;
while (size--) *volptr++ = 0;
}
/**
* Re-allocates a string with the native allocator.
*/
char *import_glib_string(gchar *gstr) {
size_t size;
char *native;
if (g_mem_is_system_malloc()) return gstr;
size = strlen(gstr)+1;
native = malloc(size);
memcpy(native, gstr, size);
secure_erase(gstr, size);
g_free(gstr);
return native;
}

View File

@ -1,36 +0,0 @@
/*
Copyright (c) 2010 Samuel Lidén Borell <samuel@kodafritt.se>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
#ifndef MISC_H
#define MISC_H
void secure_erase(void *ptr, size_t size);
#ifdef __G_LIB_H__
char *import_glib_string(gchar *gstr);
#endif
#endif

View File

@ -22,17 +22,14 @@
*/
#include "config.h"
#include <glib.h>
#include <stdlib.h>
#include <string.h>
// #pragma GCC visibility push(default)
#include "hexchat-plugin.h"
#define HEXCHAT_MAX_WORDS 32
// #pragma GCC visibility pop
//#define EXPORT __attribute((visibility("default")))
//#define EXPORT
#include "fish.h"
#include "keystore.h"
@ -51,28 +48,20 @@ static hexchat_plugin *ph;
/**
* Returns the path to the key store file.
*/
gchar *get_config_filename() {
return g_build_filename(hexchat_get_info(ph, "configdir"), "addon_fishlim.conf", NULL);
gchar *get_config_filename(void) {
char *filename_fs, *filename_utf8;
filename_utf8 = g_build_filename(hexchat_get_info(ph, "configdir"), "addon_fishlim.conf", NULL);
filename_fs = g_filename_from_utf8 (filename_utf8, -1, NULL, NULL, NULL);
g_free (filename_utf8);
return filename_fs;
}
/**
* Appends data to a string. Returns true if there was sufficient memory.
* Frees *s and returns false if an error occurs.
*/
static bool append(char **s, size_t *length, const char *data) {
size_t datalen = strlen(data);
char *extended = realloc(*s, *length + datalen + 1);
if (!extended) {
free(*s);
return false;
}
memcpy(extended + *length, data, datalen + 1);
*s = extended;
*length += datalen;
return true;
int irc_nick_cmp(const char *a, const char *b) {
return hexchat_nickcmp (ph, a, b);
}
/*static int handle_debug(char *word[], char *word_eol[], void *userdata) {
hexchat_printf(ph, "debug incoming: ");
for (size_t i = 1; word[i] != NULL && word[i][0] != '\0'; i++) {
@ -87,26 +76,26 @@ static bool append(char **s, size_t *length, const char *data) {
*/
static int handle_outgoing(char *word[], char *word_eol[], void *userdata) {
const char *own_nick;
// Encrypt the message if possible
/* Encrypt the message if possible */
const char *channel = hexchat_get_info(ph, "channel");
char *encrypted = fish_encrypt_for_nick(channel, word_eol[1]);
if (!encrypted) return HEXCHAT_EAT_NONE;
// Display message
/* Display message */
own_nick = hexchat_get_info(ph, "nick");
hexchat_emit_print(ph, "Your Message", own_nick, word_eol[1], NULL);
// Send message
/* Send message */
hexchat_commandf(ph, "PRIVMSG %s :+OK %s", channel, encrypted);
free(encrypted);
g_free(encrypted);
return HEXCHAT_EAT_HEXCHAT;
}
/**
* Called when a channel message or private message is received.
*/
static int handle_incoming(char *word[], char *word_eol[], void *userdata) {
static int handle_incoming(char *word[], char *word_eol[], hexchat_event_attrs *attrs, void *userdata) {
const char *prefix;
const char *command;
const char *recipient;
@ -114,20 +103,19 @@ static int handle_incoming(char *word[], char *word_eol[], void *userdata) {
const char *peice;
char *sender_nick;
char *decrypted;
char *message;
size_t w;
size_t ew;
size_t uw;
size_t length;
char prefix_char = 0;
GString *message;
if (!irc_parse_message((const char **)word, &prefix, &command, &w))
return HEXCHAT_EAT_NONE;
// Topic (command 332) has an extra parameter
/* Topic (command 332) has an extra parameter */
if (!strcmp(command, "332")) w++;
// Look for encrypted data
/* Look for encrypted data */
for (ew = w+1; ew < HEXCHAT_MAX_WORDS-1; ew++) {
const char *s = (ew == w+1 ? word[ew]+1 : word[ew]);
if (*s && (s[1] == '+' || s[1] == 'm')) { prefix_char = *(s++); }
@ -136,61 +124,70 @@ static int handle_incoming(char *word[], char *word_eol[], void *userdata) {
}
return HEXCHAT_EAT_NONE;
has_encrypted_data: ;
// Extract sender nick and recipient nick/channel
/* Extract sender nick and recipient nick/channel */
sender_nick = irc_prefix_get_nick(prefix);
recipient = word[w];
// Try to decrypt with these (the keys are searched for in the key store)
/* Try to decrypt with these (the keys are searched for in the key store) */
encrypted = word[ew+1];
decrypted = fish_decrypt_from_nick(recipient, encrypted);
if (!decrypted) decrypted = fish_decrypt_from_nick(sender_nick, encrypted);
// Check for error
/* Check for error */
if (!decrypted) goto decrypt_error;
// Build unecrypted message
message = NULL;
length = 0;
if (!append(&message, &length, "RECV")) goto decrypt_error;
/* Build unecrypted message */
message = g_string_sized_new (100); /* TODO: more accurate estimation of size */
g_string_append (message, "RECV");
if (attrs->server_time_utc)
{
GTimeVal tv = { (glong)attrs->server_time_utc, 0 };
char *timestamp = g_time_val_to_iso8601 (&tv);
g_string_append (message, " @time=");
g_string_append (message, timestamp);
g_free (timestamp);
}
for (uw = 1; uw < HEXCHAT_MAX_WORDS; uw++) {
if (word[uw][0] != '\0' && !append(&message, &length, " ")) goto decrypt_error;
if (word[uw][0] != '\0')
g_string_append_c (message, ' ');
if (uw == ew) {
// Add the encrypted data
/* Add the encrypted data */
peice = decrypted;
uw++; // Skip "OK+"
uw++; /* Skip "OK+" */
if (ew == w+1) {
// Prefix with colon, which gets stripped out otherwise
if (!append(&message, &length, ":")) goto decrypt_error;
/* Prefix with colon, which gets stripped out otherwise */
g_string_append_c (message, ':');
}
if (prefix_char) {
char prefix_str[2] = { prefix_char, '\0' };
if (!append(&message, &length, prefix_str)) goto decrypt_error;
g_string_append_c (message, prefix_char);
}
} else {
// Add unencrypted data (for example, a prefix from a bouncer or bot)
/* Add unencrypted data (for example, a prefix from a bouncer or bot) */
peice = word[uw];
}
if (!append(&message, &length, peice)) goto decrypt_error;
g_string_append (message, peice);
}
free(decrypted);
g_free(decrypted);
// Simulate unencrypted message
//hexchat_printf(ph, "simulating: %s\n", message);
hexchat_command(ph, message);
free(message);
free(sender_nick);
/* Simulate unencrypted message */
/* hexchat_printf(ph, "simulating: %s\n", message->str); */
hexchat_command(ph, message->str);
g_string_free (message, TRUE);
g_free(sender_nick);
return HEXCHAT_EAT_HEXCHAT;
decrypt_error:
free(decrypted);
free(sender_nick);
g_free(decrypted);
g_free(sender_nick);
return HEXCHAT_EAT_NONE;
}
@ -201,23 +198,23 @@ static int handle_setkey(char *word[], char *word_eol[], void *userdata) {
const char *nick;
const char *key;
// Check syntax
/* Check syntax */
if (*word[2] == '\0') {
hexchat_printf(ph, "%s\n", usage_setkey);
return HEXCHAT_EAT_HEXCHAT;
}
if (*word[3] == '\0') {
// /setkey password
/* /setkey password */
nick = hexchat_get_info(ph, "channel");
key = word_eol[2];
} else {
// /setkey #channel password
/* /setkey #channel password */
nick = word[2];
key = word_eol[3];
}
// Set password
/* Set password */
if (keystore_store_key(nick, key)) {
hexchat_printf(ph, "Stored key for %s\n", nick);
} else {
@ -233,15 +230,15 @@ static int handle_setkey(char *word[], char *word_eol[], void *userdata) {
static int handle_delkey(char *word[], char *word_eol[], void *userdata) {
const char *nick;
// Check syntax
/* Check syntax */
if (*word[2] == '\0' || *word[3] != '\0') {
hexchat_printf(ph, "%s\n", usage_delkey);
return HEXCHAT_EAT_HEXCHAT;
}
nick = word_eol[2];
nick = g_strstrip (word_eol[2]);
// Delete the given nick from the key store
/* Delete the given nick from the key store */
if (keystore_delete_nick(nick)) {
hexchat_printf(ph, "Deleted key for %s\n", nick);
} else {
@ -282,11 +279,11 @@ int hexchat_plugin_init(hexchat_plugin *plugin_handle,
/* Add handlers */
hexchat_hook_command(ph, "", HEXCHAT_PRI_NORM, handle_outgoing, NULL, NULL);
hexchat_hook_server(ph, "NOTICE", HEXCHAT_PRI_NORM, handle_incoming, NULL);
hexchat_hook_server(ph, "PRIVMSG", HEXCHAT_PRI_NORM, handle_incoming, NULL);
//hexchat_hook_server(ph, "RAW LINE", HEXCHAT_PRI_NORM, handle_debug, NULL);
hexchat_hook_server(ph, "TOPIC", HEXCHAT_PRI_NORM, handle_incoming, NULL);
hexchat_hook_server(ph, "332", HEXCHAT_PRI_NORM, handle_incoming, NULL);
hexchat_hook_server_attrs(ph, "NOTICE", HEXCHAT_PRI_NORM, handle_incoming, NULL);
hexchat_hook_server_attrs(ph, "PRIVMSG", HEXCHAT_PRI_NORM, handle_incoming, NULL);
/* hexchat_hook_server(ph, "RAW LINE", HEXCHAT_PRI_NORM, handle_debug, NULL); */
hexchat_hook_server_attrs(ph, "TOPIC", HEXCHAT_PRI_NORM, handle_incoming, NULL);
hexchat_hook_server_attrs(ph, "332", HEXCHAT_PRI_NORM, handle_incoming, NULL);
hexchat_printf(ph, "%s plugin loaded\n", plugin_name);
/* Return success */

View File

@ -25,7 +25,8 @@
#ifndef PLUGIN_HEXCHAT_H
#define PLUGIN_HEXCHAT_H
gchar *get_config_filename();
gchar *get_config_filename(void);
int irc_nick_cmp (const char *, const char *);
#endif

View File

@ -1,94 +0,0 @@
/*
Copyright (c) 2010 Samuel Lidén Borell <samuel@kodafritt.se>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
#include <glib.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "fish.h"
// We can't use the HexChat plugin API from here...
gchar *get_config_filename() {
const gchar *homedir = g_get_home_dir();
return g_build_filename(homedir, ".config", "hexchat", "blow.ini", NULL);
}
static int decrypt(int nick_count, char *nicks[]) {
char encrypted[8192];
while (fgets(encrypted, sizeof(encrypted), stdin)) {
char *msg;
for (int i = 0; i < nick_count; i++) {
msg = fish_decrypt_from_nick(nicks[i], encrypted);
if (msg) goto success;
}
fprintf(stderr, "None of the recipients were found in the key store!\n");
return 1;
success:
fprintf(stderr, "Decrypted text >>>%s<<<\n", msg);
free(msg);
}
return 0;
}
static int encrypt(int nick_count, char *nicks[]) {
char message[8192];
while (fgets(message, sizeof(message), stdin)) {
// Remove newline character
char *newline = strchr(message, '\n');
if (newline) *newline = '\0';
bool error = false;
for (int i = 0; i < nick_count; i++) {
char *encrypted = fish_encrypt_for_nick(nicks[i], message);
if (encrypted) {
fprintf(stderr, "Encrypted [%s]: >>>%s<<<\n", nicks[i], encrypted);
free(encrypted);
} else {
error = true;
}
}
if (error) {
fprintf(stderr, "Some of the recipients were't found in the key store!\n");
return 1;
}
}
return 0;
}
int main(int argc, char *argv[]) {
if (argc < 2) {
fprintf(stderr, "usage: %s [-e] nick...\n", argv[0]);
return 2;
}
if (strcmp(argv[1], "-e") == 0) {
return encrypt(argc-2, &argv[2]);
} else {
return decrypt(argc-1, &argv[1]);
}
}

View File

@ -14,54 +14,27 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
/*
typedef int (*MYPROC)(HWND,HWND,char*,char*,BOOL,BOOL);
#include <glib.h>
int dllProc(char *name, char *data){
HINSTANCE hinstLib;
hinstLib = LoadLibrary("mpcinfo");
//MYPROC proc;
int res;
if (hinstLib != NULL){
//proc = ;
if ((MYPROC) GetProcAddress(hinstLib, name)!=NULL){
res=(MYPROC)(NULL,NULL,data,NULL,TRUE,TRUE);
}
else{fprintf(stderr,"can't get proc: %s\n",name);res=-2;}
}
else{fprintf(stderr,"can't access dll\n");return -1;}
FreeLibrary(hinstLib);
return res;
}
*/
/*
int dllProc(char *name, char *data)
char *split(char *text, char separator)
{
static HMODULE lib = NULL;
if (!lib)
int pos = -1;
size_t i;
for (i = 0; i < strlen(text); i++)
{
lib = LoadLibraryA ("mpcinfo");
if (!lib)
{
return FALSE;
if (text[i] == separator) {
pos = i;
i = strlen(text) + 1;
}
FreeLibrary (lib);
}
return TRUE;
}
*/
if (pos == -1)
{
return text;
}
char *split(char *text, char seperator){
//if (DEBUG==1) putlog("splitting");
int i;int pos=-1;
for (i=0;i<strlen(text);i++){
if (text[i]==seperator){pos=i;i=strlen(text)+1;}
}
if (pos==-1) return text;
text[pos]=0;
return &(text[pos+1]);
text[pos] = 0;
return &(text[pos + 1]);
}
int endsWith(char *text, char *suffix){
@ -71,21 +44,32 @@ int endsWith(char *text, char *suffix){
return 0;
}
int inStr(char *s1, int sl1, char *s2){
//if (DEBUG==1) putlog("checking instr");
int i;int j;
for(i=0;i<sl1-strlen(s2);i++){
for (j=0;j<strlen(s2);j++){
if (s1[i+j]!=s2[j]) j=strlen(s2)+2;
int inStr(char *s1, size_t sl1, char *s2)
{
size_t i;
for (i = 0; i < sl1 - strlen(s2); i++)
{
size_t j;
for (j = 0; j < strlen(s2); j++)
{
if (s1[i + j] != s2[j])
{
j = strlen(s2) + 2;
}
}
if (j == strlen(s2))
{
return i;
}
if (j==strlen(s2)) return i;
}
return -1;
}
static char *subString(char *text, int first, int length, int spcKill){
//if (DEBUG==1) putlog("creating substring");
char *ret=(char*) calloc (length+1,sizeof(char)); //malloc(sizeof(char)*(length+1));
char *ret = g_new (char, length + 1);
int i;
ret[length]=0;
for (i=0;i<length;i++){
@ -107,7 +91,7 @@ static char *substring(char *text, int first, int length){return subString(text,
char *readLine(FILE *f){
//if (DEBUG==1) putlog("reading line from file");
char *buffer=(char*)calloc(1024,sizeof(char)); //malloc(sizeof(char)*1024);
char *buffer = g_new (char, 1024);
int pos=0;
int cc=0;
while((cc!=EOF)&&(pos<1024)&&(cc!=10)){
@ -121,14 +105,19 @@ char *readLine(FILE *f){
return buffer;
}
char *toUpper(char *text){
//if (DEBUG==1) putlog("converting text to upper case");
char *ret=(char*) calloc(strlen(text)+1,sizeof(char));
int i;
for (i=0;i<strlen(text);i++) ret[i]=toupper(text[i]);
ret[strlen(text)]=0;
//if (DEBUG==1) putlog("uc done");
return ret;
char *toUpper(char *text)
{
char *ret = (char*) calloc(strlen(text) + 1, sizeof(char));
size_t i;
for (i = 0; i < strlen(text); i++)
{
ret[i] = toupper(text[i]);
}
ret[strlen(text)] = 0;
return ret;
}
static char *str3cat(char *s1, char *s2, char *s3){

View File

@ -75,62 +75,25 @@ static char MODES [][13]={"Stereo","Joint-Stereo","Dual-Channel","Mono"};
int iPow(int x, int y){return (int)(pow((double)x,(double) y));}
int str2int(char *text){
//if (DEBUG==1) putlog("converting string to int");
int i;
int ret=0;
for (i=1;i<=strlen(text);i++){
if ((text[strlen(text)-i]>57)||(text[strlen(text)-i]<48)){
hexchat_printf(ph,"invalid char in string: %i",text[strlen(text)-i]);
return 255;
}
ret+=((int)text[strlen(text)-i]-48)*iPow(10,i-1);
}
//hexchat_printf(ph, "str2int(%s)=%i",text,ret);
//if (DEBUG==1) putlog("int converted");
return ret;
}
/*
static int getSize(char *file){
//if (DEBUG==1) putlog("reading filesize");
struct stat info;
if (stat(file,&info)!=0) return -1;
return info.st_size;
}*/
/*
int inStr(char *s1, int sl1, char *s2){
//if (DEBUG==1) putlog("checking instr");
int i;int j;
for(i=0;i<sl1-strlen(s2);i++){
for (j=0;j<strlen(s2);j++){
if (s1[i+j]!=s2[j]) j=strlen(s2)+2;
}
if (j==strlen(s2)) return i;
}
return -1;
}
int str2int(char *text)
{
int ret = 0;
static char *subString(char *text, int first, int length, int spcKill){
//if (DEBUG==1) putlog("creating substring");
char *ret=(char*) calloc (length+1,sizeof(char)); //malloc(sizeof(char)*(length+1));
ret[length]=0;int i;
for (i=0;i<length;i++){
ret[i]=text[i+first];
//if (ret[i]==0) ret[i]='0';
size_t i;
for (i = 1; i <= strlen(text); i++)
{
if ((text[strlen(text) - i] > 57) || (text[strlen(text) - i] < 48))
{
hexchat_printf(ph, "invalid char in string: %i", (int) text[strlen(text) - i]);
return 255;
}
ret += ((int) text[strlen(text) - i] - 48)*iPow(10, i - 1);
}
if (spcKill==1){
for (i=length-1;i>=0;i--){
if (ret[i]==32) ret[i]=0;
else i=-1;
}
}
//if (DEBUG==1) putlog("substring created");
return ret;
}
static char *substring(char *text, int first, int length){return subString(text,first,length,0);} //1
*/
static char *tagExtract(char *tag, int tagLen, char* info){
//if (DEBUG==1) putlog("extracting tag");
int pos, len, i;
@ -204,23 +167,28 @@ struct tagInfo readID3V1(char *file){
return ret;
}
char *extractID3Genre(char *tag){
//if (DEBUG==1) putlog("extracting id3 genre");
if (tag[strlen(tag)-1]==')'){
tag[strlen(tag)-1]=0;
tag=&tag[1];
return GENRES[str2int(tag)];
//return tag;
}
else{
int i;
//hexchat_print(ph, "Using 2 criteria");
for (i=0;i<strlen(tag);i++){
if (tag[i]==')'){ tag=&tag[i]+1;return tag;}
//return tag;
}
}
return "[152] failed";
char *extractID3Genre(char *tag)
{
if (tag[strlen(tag) - 1] == ')')
{
tag[strlen(tag) - 1] = 0;
tag = &tag[1];
return GENRES[str2int(tag)];
}
else
{
size_t i;
for (i = 0; i < strlen(tag); i++)
{
if (tag[i] == ')')
{
tag = &tag[i] + 1;
return tag;
}
}
}
return "[152] failed";
}
struct tagInfo readID3V2(char *file){

View File

@ -48,12 +48,20 @@ static int mpc_tell(char *word[], char *word_eol[], void *userdata){
HWND hwnd = FindWindow("MediaPlayerClassicW",NULL);
if (hwnd==0) {hexchat_print(ph, randomLine(notRunTheme));return HEXCHAT_EAT_ALL;}
tTitle=(char*)malloc(sizeof(char)*1024);
tTitle = g_new(char, 1024);
GetWindowText(hwnd, tTitle, 1024);
zero=strstr(tTitle," - Media Player Classic");
if (zero!=NULL) zero[0]=0;
else hexchat_print(ph,"pattern not found");
zero = strstr (tTitle, " - Media Player Classic");
if (zero != NULL)
{
zero[0] = 0;
}
else
{
g_free(tTitle);
hexchat_print(ph, "pattern not found");
return HEXCHAT_EAT_ALL;
}
if ((tTitle[1]==':')&&(tTitle[2]=='\\')){
//hexchat_print(ph,"seams to be full path");
if (endsWith(tTitle,".mp3")==1){
@ -82,7 +90,8 @@ static int mpc_tell(char *word[], char *word_eol[], void *userdata){
//mp3Line=intReplace(mp3Line,"%perc",perc);
//mp3Line=replace(mp3Line,"%plTitle",title);
mp3Line=replace(mp3Line,"%file",tTitle);
hexchat_command(ph, mp3Line);
g_free(tTitle);
hexchat_command(ph, mp3Line);
return HEXCHAT_EAT_ALL;
}
}
@ -111,14 +120,16 @@ static int mpc_tell(char *word[], char *word_eol[], void *userdata){
//oggLine=intReplace(oggLine,"%perc",perc);
//oggLine=replace(oggLine,"%plTitle",title);
oggLine=replace(oggLine,"%file",tTitle);
hexchat_command(ph, oggLine);
g_free(tTitle);
hexchat_command(ph, oggLine);
return HEXCHAT_EAT_ALL;
}
}
}
line=randomLine(titleTheme);
line=replace(line,"%title", tTitle);
hexchat_command(ph,line);
g_free(tTitle);
hexchat_command(ph, line);
return HEXCHAT_EAT_ALL;
}

View File

@ -1,7 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Label="Configuration">
<PlatformToolset>v120</PlatformToolset>
<PlatformToolset>v140</PlatformToolset>
<ConfigurationType>DynamicLibrary</ConfigurationType>
</PropertyGroup>
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Release|Win32">
@ -19,75 +20,32 @@
<RootNamespace>mpcinfo</RootNamespace>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="..\..\win32\hexchat.props" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="..\..\win32\hexchat.props" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="..\..\win32\hexchat.props" />
<PropertyGroup>
<TargetName>hcmpcinfo</TargetName>
<OutDir>$(HexChatBin)</OutDir>
<IntDir>$(HexChatObj)$(ProjectName)\</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental>
<TargetName>hcmpcinfo</TargetName>
<OutDir>$(HexChatBin)</OutDir>
<IntDir>$(HexChatObj)$(ProjectName)\</IntDir>
<OutDir>$(HexChatRel)plugins\</OutDir>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<PrecompiledHeader>
</PrecompiledHeader>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;MPCINFO_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<AdditionalIncludeDirectories>..\..\src\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>..\..\src\common;$(Glib);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<AdditionalLibraryDirectories>$(DepsRoot)\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>$(DepLibs);%(AdditionalDependencies)</AdditionalDependencies>
<ModuleDefinitionFile>mpcinfo.def</ModuleDefinitionFile>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<PrecompiledHeader>
</PrecompiledHeader>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;_WIN64;_AMD64_;NDEBUG;_WINDOWS;_USRDLL;MPCINFO_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<AdditionalIncludeDirectories>..\..\src\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>..\..\src\common;$(Glib);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<AdditionalLibraryDirectories>$(DepsRoot)\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>$(DepLibs);%(AdditionalDependencies)</AdditionalDependencies>
<ModuleDefinitionFile>mpcinfo.def</ModuleDefinitionFile>
</Link>
</ItemDefinitionGroup>
@ -98,6 +56,4 @@
<ClCompile Include="mpcInfo.c" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
</Project>

View File

@ -25,14 +25,18 @@ static int getOggInt(char *buff, int beg, int bytes){
return ret;
}
static char *upperStr(char *text){
//if (DEBUG==1) putlog("converting text to uc");
//printf("upperStr(%s)\n",text);
int i;
char *ret=(char*) malloc(sizeof(char)*(strlen(text)+1));
ret[strlen(text)]=0;
for (i=0;i<strlen(text);i++) ret[i]=toupper(text[i]);
//printf("Result: %s\n",ret);
static char *upperStr(char *text)
{
char *ret = (char*) malloc(sizeof(char)*(strlen(text) + 1));
size_t i;
for (i = 0; i < strlen(text); i++)
{
ret[i] = toupper(text[i]);
}
ret[strlen(text)] = 0;
return ret;
}

View File

@ -49,24 +49,32 @@ void printThemes(){
hexchat_printf(ph,"\nTitle-Theme:\n");printTheme(titleTheme);
}
void cbFix(char *line){
//if (DEBUG==1) putlog("cbfix");
int i, j;
for (i=0;i<strlen(line);i++){
if (line[i]=='%'){
if ((line[i+1]=='C')||(line[i+1]=='B')||(line[i+1]=='U')||(line[i+1]=='O')||(line[i+1]=='R')){
if(line[i+1]=='C') line[i]=3;
if(line[i+1]=='B') line[i]=2;
if(line[i+1]=='U') line[i]=37;
if(line[i+1]=='O') line[i]=17;
if(line[i+1]=='R') line[i]=26;
void cbFix(char *line)
{
size_t i;
for (i = 0; i < strlen(line); i++)
{
size_t j;
for (j=i+1;j<strlen(line)-1;j++) line[j]=line[j+1];
line[strlen(line)-1]=0;
}
}
}
//if (DEBUG==1) putlog("cbfix done");
if (line[i] == '%')
{
if ((line[i + 1] == 'C') || (line[i + 1] == 'B') || (line[i + 1] == 'U') || (line[i + 1] == 'O') || (line[i + 1] == 'R'))
{
if (line[i + 1] == 'C') line[i] = 3;
if (line[i + 1] == 'B') line[i] = 2;
if (line[i + 1] == 'U') line[i] = 37;
if (line[i + 1] == 'O') line[i] = 17;
if (line[i + 1] == 'R') line[i] = 26;
for (j = i + 1; j < strlen(line) - 1; j++)
{
line[j] = line[j + 1];
}
line[strlen(line) - 1] = 0;
}
}
}
}
struct theme themeAdd(struct theme data, char *info){

View File

@ -6,12 +6,13 @@ libdir = $(hexchatlibdir)
lib_LTLIBRARIES = perl.la
perl_la_SOURCES = perl.c
perl_la_LDFLAGS = -avoid-version -module
perl_la_LIBADD = $(PERL_LDFLAGS)
perl_la_LDFLAGS = $(PERL_LDFLAGS) $(PLUGIN_LDFLAGS) -module
perl_la_LIBADD = $(GLIB_LIBS)
perl_la_CFLAGS = $(PERL_CFLAGS) $(GLIB_CFLAGS) -I$(top_srcdir)/src/common
BUILT_SOURCES = hexchat.pm.h irc.pm.h
#CFLAGS = @CFLAGS@ -Wno-unused
AM_CPPFLAGS = $(PERL_CFLAGS) $(COMMON_CFLAGS) -I$(srcdir)/../../src/common
CLEANFILES = hexchat.pm.h irc.pm.h
CLEANFILES = $(BUILT_SOURCES)
hexchat.pm.h irc.pm.h: lib/HexChat.pm lib/Xchat.pm lib/HexChat/Embed.pm \
lib/HexChat/List/Network.pm lib/HexChat/List/Network/Entry.pm \
lib/HexChat/List/Network/AutoJoin.pm lib/IRC.pm

View File

@ -16,6 +16,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "config.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
@ -31,8 +33,9 @@
#include <dirent.h>
#endif
#include <glib.h>
#undef PACKAGE
#include "../../config.h"
#include "hexchat-plugin.h"
@ -75,37 +78,26 @@ thread_mbox (char *str)
static void
perl_auto_load_from_path (const char *path)
{
WIN32_FIND_DATA find_data;
HANDLE find_handle;
char *search_path;
int path_len = strlen (path);
/* +6 for \*.pl and \0 */
search_path = malloc(path_len + 6);
sprintf (search_path, "%s\\*.pl", path);
find_handle = FindFirstFile (search_path, &find_data);
char *search_path = g_build_filename (path, "*.pl", NULL);
WIN32_FIND_DATAA find_data;
HANDLE find_handle = FindFirstFileA (search_path, &find_data);
if (find_handle != INVALID_HANDLE_VALUE)
{
do
{
if (!(find_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY
||find_data.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN))
if ((find_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0 && (find_data.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) == 0)
{
char *full_path =
malloc (path_len + strlen (find_data.cFileName) + 2);
sprintf (full_path, "%s\\%s", path, find_data.cFileName);
char *full_path = g_build_filename (path, find_data.cFileName, NULL);
perl_load_file (full_path);
free (full_path);
g_free (full_path);
}
}
while (FindNextFile (find_handle, &find_data) != 0);
while (FindNextFileA (find_handle, &find_data) != 0);
FindClose (find_handle);
}
free (search_path);
g_free (search_path);
}
#else
static void
@ -115,14 +107,16 @@ perl_auto_load_from_path (const char *path)
struct dirent *ent;
dir = opendir (path);
if (dir) {
while ((ent = readdir (dir))) {
if (dir)
{
while ((ent = readdir (dir)))
{
int len = strlen (ent->d_name);
if (len > 3 && strcasecmp (".pl", ent->d_name + len - 3) == 0) {
char *file = malloc (len + strlen (path) + 2);
sprintf (file, "%s/%s", path, ent->d_name);
if (len > 3 && strcasecmp (".pl", ent->d_name + len - 3) == 0)
{
char *file = g_build_filename (path, ent->d_name, NULL);
perl_load_file (file);
free (file);
g_free (file);
}
}
closedir (dir);
@ -145,31 +139,10 @@ perl_auto_load (void *unused)
/* don't pollute the filesystem with script files, this only causes misuse of the folders
* only use ~/.config/hexchat/addons/ and %APPDATA%\HexChat\addons */
#if 0
/* autoload from ~/.config/hexchat/ or %APPDATA%\HexChat\ on win32 */
perl_auto_load_from_path (xdir);
#endif
sub_dir = malloc (strlen (xdir) + 8);
strcpy (sub_dir, xdir);
strcat (sub_dir, "/addons");
sub_dir = g_build_filename (xdir, "addons", NULL);
perl_auto_load_from_path (sub_dir);
free (sub_dir);
g_free (sub_dir);
#if 0
#ifdef WIN32
/* autoload from C:\Program Files\HexChat\plugins\ */
sub_dir = malloc (1025 + 9);
copied = GetModuleFileName( 0, sub_dir, 1024 );
sub_dir[copied] = '\0';
slash = strrchr( sub_dir, '\\' );
if( slash != NULL ) {
*slash = '\0';
}
perl_auto_load_from_path ( strncat (sub_dir, "\\plugins", 9));
free (sub_dir);
#endif
#endif
return 0;
}
@ -288,7 +261,19 @@ list_item_to_sv ( hexchat_list *list, const char *const *fields )
field_value = newSVuv (hexchat_list_int (ph, list, field_name));
break;
case 't':
field_value = newSVnv (hexchat_list_time (ph, list, field_name));
/* From perldoc for Perl's own timelocal() and timegm():
* <quote>
* On perl versions older than 5.12.0, the range of dates that can be actually be handled depends on the size of time_t (usually a signed integer) on the given platform.
* As of version 5.12.0, perl has stopped using the underlying time library of the operating system it's running on and has its own implementation of those routines with a
* safe range of at least +/ 2**52 (about 142 million years).
* </quote>
*
* This is further confirmed from looking at the source for Time::Local - it's a Perl module and the implementations of timelocal() and timegm() use simple addition and
* subtraction of numbers. Perl automatically promotes numbers from int32_t (IV) to uint32_t (UV) to 64-bit IEEE754 double (NV) as required.
*
* This means that using a double (NV) for our own time_t suffers from the same assumptions that Perl's own functions do.
*/
field_value = newSVnv ((const NV) hexchat_list_time (ph, list, field_name));
break;
default:
field_value = &PL_sv_undef;
@ -372,7 +357,7 @@ fd_cb (int fd, int flags, void *userdata)
if (data->userdata) {
SvREFCNT_dec (data->userdata);
}
free (data);
g_free (data);
}
}
@ -736,7 +721,7 @@ XS (XS_HexChat_send_modes)
if (SvROK (ST (0))) {
p_targets = (AV*) SvRV (ST (0));
target_count = av_len (p_targets) + 1;
targets = malloc (target_count * sizeof (char *));
targets = g_new (const char *, target_count);
for (i = 0; i < target_count; i++ ) {
elem = av_fetch (p_targets, i, 0);
@ -747,13 +732,13 @@ XS (XS_HexChat_send_modes)
}
}
} else{
targets = malloc (sizeof (char *));
targets = g_new (const char *, 1);
targets[0] = SvPV_nolen (ST (0));
target_count = 1;
}
if (target_count == 0) {
free (targets);
g_free ((char**) targets);
XSRETURN_EMPTY;
}
@ -765,7 +750,7 @@ XS (XS_HexChat_send_modes)
}
hexchat_send_modes (ph, targets, target_count, modes_per_line, sign, mode);
free (targets);
g_free ((char**) targets);
}
}
static
@ -883,11 +868,7 @@ XS (XS_HexChat_hook_server)
userdata = ST (3);
package = ST (4);
data = NULL;
data = malloc (sizeof (HookData));
if (data == NULL) {
XSRETURN_UNDEF;
}
data = g_new (HookData, 1);
data->callback = newSVsv (callback);
data->userdata = newSVsv (userdata);
data->depth = 0;
@ -932,11 +913,7 @@ XS (XS_HexChat_hook_command)
package = ST (5);
data = NULL;
data = malloc (sizeof (HookData));
if (data == NULL) {
XSRETURN_UNDEF;
}
data = g_new (HookData, 1);
data->callback = newSVsv (callback);
data->userdata = newSVsv (userdata);
data->depth = 0;
@ -972,11 +949,7 @@ XS (XS_HexChat_hook_print)
userdata = ST (3);
package = ST (4);
data = malloc (sizeof (HookData));
if (data == NULL) {
XSRETURN_UNDEF;
}
data = g_new (HookData, 1);
data->callback = newSVsv (callback);
data->userdata = newSVsv (userdata);
data->depth = 0;
@ -1010,11 +983,7 @@ XS (XS_HexChat_hook_timer)
userdata = ST (2);
package = ST (3);
data = malloc (sizeof (HookData));
if (data == NULL) {
XSRETURN_UNDEF;
}
data = g_new (HookData, 1);
data->callback = newSVsv (callback);
data->userdata = newSVsv (userdata);
data->ctx = hexchat_get_context (ph);
@ -1064,11 +1033,7 @@ XS (XS_HexChat_hook_fd)
}
#endif
data = malloc (sizeof (HookData));
if (data == NULL) {
XSRETURN_UNDEF;
}
data = g_new (HookData, 1);
data->callback = newSVsv (callback);
data->userdata = newSVsv (userdata);
data->depth = 0;
@ -1108,7 +1073,7 @@ XS (XS_HexChat_unhook)
SvREFCNT_dec (userdata->package);
}
free (userdata);
g_free (userdata);
}
XSRETURN (retCount);
}

View File

@ -1,7 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Label="Configuration">
<PlatformToolset>v120</PlatformToolset>
<PlatformToolset>v140</PlatformToolset>
<ConfigurationType>DynamicLibrary</ConfigurationType>
</PropertyGroup>
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Release|Win32">
@ -19,66 +20,28 @@
<RootNamespace>perl520</RootNamespace>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="..\..\win32\hexchat.props" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="..\..\win32\hexchat.props" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
<TargetName>$(PerlOutput)</TargetName>
<OutDir>$(HexChatBin)</OutDir>
<IntDir>$(HexChatObj)$(ProjectName)\</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental>
<TargetName>$(PerlOutput)</TargetName>
<OutDir>$(HexChatBin)</OutDir>
<IntDir>$(HexChatObj)$(ProjectName)\</IntDir>
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="..\..\win32\hexchat.props" />
<PropertyGroup>
<TargetName>hcperl</TargetName>
<OutDir>$(HexChatRel)plugins\</OutDir>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<PrecompiledHeader>
</PrecompiledHeader>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;PERL520_EXPORTS;$(OwnFlags);%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(PerlPath)\lib\CORE;$(IntDir);..\..\src\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;PERL520_EXPORTS;HAS_BOOL;$(OwnFlags);%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(IntDir);..\..\src\common;$(HexChatLib);$(PerlPath)\lib\CORE;$(Glib);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<AdditionalLibraryDirectories>$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>$(PerlLib).lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(IntDir);$(DepsRoot)\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>$(PerlLib).lib;$(DepLibs);%(AdditionalDependencies)</AdditionalDependencies>
<ModuleDefinitionFile>perl.def</ModuleDefinitionFile>
<DelayLoadDLLs>$(PerlLib).dll;%(DelayLoadDLLs)</DelayLoadDLLs>
</Link>
<PreBuildEvent>
<Command>"$(GendefPath)\gendef" "$(PerlPath)\bin\$(PerlLib).dll"
move $(PerlLib).def "$(IntDir)"
lib /nologo /machine:x86 "/def:$(IntDir)$(PerlLib).def" "/out:$(OutDir)\$(PerlLib).lib"
lib /nologo /machine:x86 "/def:$(IntDir)$(PerlLib).def" "/out:$(IntDir)\$(PerlLib).lib"
"$(PerlPath)\bin\perl.exe" generate_header
move irc.pm.h "$(IntDir)"
move hexchat.pm.h "$(IntDir)"</Command>
@ -86,28 +49,19 @@ move hexchat.pm.h "$(IntDir)"</Command>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<PrecompiledHeader>
</PrecompiledHeader>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;_WIN64;_AMD64_;NDEBUG;_WINDOWS;_USRDLL;PERL520_EXPORTS;$(OwnFlags);%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(PerlPath)\lib\CORE;$(IntDir);..\..\src\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<PreprocessorDefinitions>WIN32;_WIN64;_AMD64_;NDEBUG;_WINDOWS;_USRDLL;PERL520_EXPORTS;HAS_BOOL;$(OwnFlags);%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(IntDir);..\..\src\common;$(HexChatLib);$(PerlPath)\lib\CORE;$(Glib);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<AdditionalLibraryDirectories>$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>$(PerlLib).lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(IntDir);$(DepsRoot)\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>$(PerlLib).lib;$(DepLibs);%(AdditionalDependencies)</AdditionalDependencies>
<ModuleDefinitionFile>perl.def</ModuleDefinitionFile>
<DelayLoadDLLs>$(PerlLib).dll;%(DelayLoadDLLs)</DelayLoadDLLs>
</Link>
<PreBuildEvent>
<Command>"$(GendefPath)\gendef" "$(PerlPath)\bin\$(PerlLib).dll"
move $(PerlLib).def "$(IntDir)"
lib /nologo /machine:x64 "/def:$(IntDir)$(PerlLib).def" "/out:$(OutDir)\$(PerlLib).lib"
lib /nologo /machine:x64 "/def:$(IntDir)$(PerlLib).def" "/out:$(IntDir)\$(PerlLib).lib"
"$(PerlPath)\bin\perl.exe" generate_header
move irc.pm.h "$(IntDir)"
move hexchat.pm.h "$(IntDir)"</Command>
@ -120,6 +74,4 @@ move hexchat.pm.h "$(IntDir)"</Command>
<ClCompile Include="perl.c" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
</Project>

View File

@ -1,19 +0,0 @@
AC_INIT(@PLUGIN@-config.h.in)
AM_CONFIG_HEADER(@PLUGIN@-config.h)
AM_INIT_AUTOMAKE(hexchat-@PLUGIN@, @PLUGIN_VERSION@)
AM_MAINTAINER_MODE
AM_DISABLE_STATIC
AM_PROG_LIBTOOL
AC_ARG_WITH(plugin-includes,
[ --with-plugin-includes directory containing hexchat-plugin.h],
PLUGIN_INCLUDES=$enableval)
AC_SUBST(PLUGIN_INCLUDES)
hexchatlibdir=${libdir}/hexchat
AC_SUBST(hexchatlibdir)
AC_OUTPUT(
Makefile
)

View File

@ -1,10 +1,9 @@
EXTRA_DIST =
libdir = $(hexchatlibdir)
lib_LTLIBRARIES = python.la
python_la_SOURCES = python.c
python_la_LDFLAGS = -avoid-version -module
python_la_LIBADD = $(PY_LIBS)
AM_CPPFLAGS = $(PY_CFLAGS) $(COMMON_CFLAGS) -I$(srcdir)/../../src/common
python_la_LDFLAGS = $(PLUGIN_LDFLAGS) -module
python_la_LIBADD = $(PYTHON_LIBS) $(GLIB_LIBS)
python_la_CPPFLAGS = $(PYTHON_CPPFLAGS)
python_la_CFLAGS = $(GLIB_CFLAGS) -I$(top_srcdir)/src/common

View File

@ -51,6 +51,8 @@
*
*/
#include "config.h"
#include <glib.h>
#include <glib/gstdio.h>
#include <string.h>
@ -64,9 +66,9 @@
#include <dirent.h>
#endif
#include "../../config.h"
#include "hexchat-plugin.h"
#undef _POSIX_C_SOURCE /* Avoid warning: also in /usr/include/features.h from glib.h */
#undef _POSIX_C_SOURCE /* Avoid warnings from /usr/include/features.h */
#undef _XOPEN_SOURCE
#include <Python.h>
#include <structmember.h>
#include <pythread.h>
@ -271,7 +273,7 @@ typedef struct {
static PyObject *Util_BuildList(char *word[]);
static PyObject *Util_BuildEOLList(char *word[]);
static void Util_Autoload();
static void Util_Autoload(void);
static char *Util_Expand(char *filename);
static int Callback_Server(char *word[], char *word_eol[], hexchat_event_attrs *attrs, void *userdata);
@ -281,7 +283,7 @@ static int Callback_Print(char *word[], void *userdata);
static int Callback_Timer(void *userdata);
static int Callback_ThreadTimer(void *userdata);
static PyObject *XChatOut_New();
static PyObject *XChatOut_New(void);
static PyObject *XChatOut_write(PyObject *self, PyObject *args);
static void XChatOut_dealloc(PyObject *self);
@ -298,7 +300,7 @@ static PyObject *Context_FromContext(hexchat_context *context);
static PyObject *Context_FromServerAndChannel(char *server, char *channel);
static PyObject *Plugin_New(char *filename, PyObject *xcoobj);
static PyObject *Plugin_GetCurrent();
static PyObject *Plugin_GetCurrent(void);
static PluginObject *Plugin_ByString(char *str);
static Hook *Plugin_AddHook(int type, PyObject *plugin, PyObject *callback,
PyObject *userdata, char *name, void *data);
@ -334,11 +336,11 @@ static PyObject *Module_hexchat_pluginpref_list(PyObject *self, PyObject *args);
static void IInterp_Exec(char *command);
static int IInterp_Cmd(char *word[], char *word_eol[], void *userdata);
static void Command_PyList();
static void Command_PyList(void);
static void Command_PyLoad(char *filename);
static void Command_PyUnload(char *name);
static void Command_PyReload(char *name);
static void Command_PyAbout();
static void Command_PyAbout(void);
static int Command_Py(char *word[], char *word_eol[], void *userdata);
/* ===================================================================== */
@ -449,10 +451,8 @@ Util_BuildEOLList(char *word[])
PyList_SetItem(list, i - 1, uni_part);
}
if (last)
g_free (last);
if (accum)
g_free (accum);
g_free (last);
g_free (accum);
return list;
}
@ -802,9 +802,7 @@ Callback_ThreadTimer(void *userdata)
/* We keep this information global, so we can reset it when the
* deinit function is called. */
/* XXX This should be somehow bound to the printing context. */
static char *xchatout_buffer = NULL;
static int xchatout_buffer_size = 0;
static int xchatout_buffer_pos = 0;
static GString *xchatout_buffer = NULL;
static PyObject *
XChatOut_New()
@ -828,76 +826,42 @@ XChatOut_dealloc(PyObject *self)
static PyObject *
XChatOut_write(PyObject *self, PyObject *args)
{
int new_buffer_pos, data_size, print_limit, add_space;
gboolean add_space;
char *data, *pos;
if (!PyArg_ParseTuple(args, "s#:write", &data, &data_size))
if (!PyArg_ParseTuple(args, "s:write", &data))
return NULL;
if (!data_size) {
Py_INCREF(Py_None);
return Py_None;
if (!data || !*data) {
Py_RETURN_NONE;
}
BEGIN_XCHAT_CALLS(RESTORE_CONTEXT|ALLOW_THREADS);
if (((XChatOutObject *)self)->softspace) {
add_space = 1;
add_space = TRUE;
((XChatOutObject *)self)->softspace = 0;
} else {
add_space = 0;
}
if (xchatout_buffer_size-xchatout_buffer_pos < data_size+add_space) {
char *new_buffer;
/* This buffer grows whenever needed, and does not
* shrink. If we ever implement unloading of the
* python interface, we must find some way to free
* this buffer as well. */
xchatout_buffer_size += data_size*2+16;
new_buffer = g_realloc(xchatout_buffer, xchatout_buffer_size);
if (new_buffer == NULL) {
hexchat_print(ph, "Not enough memory to print");
/* The system is out of resources. Let's help. */
g_free(xchatout_buffer);
xchatout_buffer = NULL;
xchatout_buffer_size = 0;
xchatout_buffer_pos = 0;
/* Return something valid, since we have
* already warned the user, and he probably
* won't be able to notice this exception. */
goto exit;
}
xchatout_buffer = new_buffer;
}
memcpy(xchatout_buffer+xchatout_buffer_pos, data, data_size);
print_limit = new_buffer_pos = xchatout_buffer_pos+data_size;
pos = xchatout_buffer+print_limit;
if (add_space && *(pos-1) != '\n') {
*pos = ' ';
*(pos+1) = 0;
new_buffer_pos++;
}
while (*pos != '\n' && print_limit > xchatout_buffer_pos) {
pos--;
print_limit--;
}
if (*pos == '\n') {
/* Crop it, inserting the string limiter there. */
*pos = 0;
hexchat_print(ph, xchatout_buffer);
if (print_limit < new_buffer_pos) {
/* There's still data to be printed. */
print_limit += 1; /* Include the limiter. */
xchatout_buffer_pos = new_buffer_pos-print_limit;
memmove(xchatout_buffer, xchatout_buffer+print_limit,
xchatout_buffer_pos);
} else {
xchatout_buffer_pos = 0;
}
} else {
xchatout_buffer_pos = new_buffer_pos;
add_space = FALSE;
}
g_string_append (xchatout_buffer, data);
/* If not end of line add space to continue buffer later */
if (add_space && xchatout_buffer->str[xchatout_buffer->len - 1] != '\n')
{
g_string_append_c (xchatout_buffer, ' ');
}
/* If there is an end of line print up to that */
if ((pos = strrchr (xchatout_buffer->str, '\n')))
{
*pos = '\0';
hexchat_print (ph, xchatout_buffer->str);
/* Then remove it from buffer */
g_string_erase (xchatout_buffer, 0, pos - xchatout_buffer->str + 1);
}
exit:
END_XCHAT_CALLS();
Py_INCREF(Py_None);
return Py_None;
Py_RETURN_NONE;
}
#define OFF(x) offsetof(XChatOutObject, x)
@ -1049,8 +1013,7 @@ Context_set(ContextObject *self, PyObject *args)
{
PyObject *plugin = Plugin_GetCurrent();
Plugin_SetContext(plugin, self->context);
Py_INCREF(Py_None);
return Py_None;
Py_RETURN_NONE;
}
static PyObject *
@ -1063,8 +1026,7 @@ Context_command(ContextObject *self, PyObject *args)
hexchat_set_context(ph, self->context);
hexchat_command(ph, text);
END_XCHAT_CALLS();
Py_INCREF(Py_None);
return Py_None;
Py_RETURN_NONE;
}
static PyObject *
@ -1077,8 +1039,7 @@ Context_prnt(ContextObject *self, PyObject *args)
hexchat_set_context(ph, self->context);
hexchat_print(ph, text);
END_XCHAT_CALLS();
Py_INCREF(Py_None);
return Py_None;
Py_RETURN_NONE;
}
static PyObject *
@ -1123,8 +1084,7 @@ Context_get_info(ContextObject *self, PyObject *args)
info = hexchat_get_info(ph, name);
END_XCHAT_CALLS();
if (info == NULL) {
Py_INCREF(Py_None);
return Py_None;
Py_RETURN_NONE;
}
return PyUnicode_FromString(info);
}
@ -1407,11 +1367,7 @@ static Hook *
Plugin_AddHook(int type, PyObject *plugin, PyObject *callback,
PyObject *userdata, char *name, void *data)
{
Hook *hook = (Hook *) g_malloc(sizeof(Hook));
if (hook == NULL) {
PyErr_NoMemory();
return NULL;
}
Hook *hook = g_new(Hook, 1);
hook->type = type;
hook->plugin = plugin;
Py_INCREF(callback);
@ -1465,8 +1421,7 @@ Plugin_RemoveHook(PyObject *plugin, Hook *hook)
hook));
Py_DECREF(hook->callback);
Py_DECREF(hook->userdata);
if (hook->name)
g_free(hook->name);
g_free(hook->name);
g_free(hook);
}
}
@ -1485,8 +1440,7 @@ Plugin_RemoveAllHooks(PyObject *plugin)
}
Py_DECREF(hook->callback);
Py_DECREF(hook->userdata);
if (hook->name)
g_free(hook->name);
g_free(hook->name);
g_free(hook);
list = list->next;
}
@ -1715,8 +1669,7 @@ Module_hexchat_command(PyObject *self, PyObject *args)
BEGIN_XCHAT_CALLS(RESTORE_CONTEXT|ALLOW_THREADS);
hexchat_command(ph, text);
END_XCHAT_CALLS();
Py_INCREF(Py_None);
return Py_None;
Py_RETURN_NONE;
}
static PyObject *
@ -1728,8 +1681,7 @@ Module_xchat_prnt(PyObject *self, PyObject *args)
BEGIN_XCHAT_CALLS(RESTORE_CONTEXT|ALLOW_THREADS);
hexchat_print(ph, text);
END_XCHAT_CALLS();
Py_INCREF(Py_None);
return Py_None;
Py_RETURN_NONE;
}
static PyObject *
@ -1772,10 +1724,9 @@ Module_hexchat_get_info(PyObject *self, PyObject *args)
info = hexchat_get_info(ph, name);
END_XCHAT_CALLS();
if (info == NULL) {
Py_INCREF(Py_None);
return Py_None;
Py_RETURN_NONE;
}
if (strcmp (name, "gtkwin_ptr") == 0)
if (strcmp (name, "gtkwin_ptr") == 0 || strcmp (name, "win_ptr") == 0)
return PyUnicode_FromFormat("%p", info); /* format as pointer */
else
return PyUnicode_FromString(info);
@ -1826,8 +1777,7 @@ Module_hexchat_get_context(PyObject *self, PyObject *args)
return NULL;
ctxobj = Context_FromContext(Plugin_GetContext(plugin));
if (ctxobj == NULL) {
Py_INCREF(Py_None);
return Py_None;
Py_RETURN_NONE;
}
return ctxobj;
}
@ -1844,8 +1794,7 @@ Module_hexchat_find_context(PyObject *self, PyObject *args, PyObject *kwargs)
return NULL;
ctxobj = Context_FromServerAndChannel(server, channel);
if (ctxobj == NULL) {
Py_INCREF(Py_None);
return Py_None;
Py_RETURN_NONE;
}
return ctxobj;
}
@ -1891,7 +1840,7 @@ Module_hexchat_pluginpref_get(PyObject *self, PyObject *args)
if (!PyArg_ParseTuple(args, "s:get_pluginpref", &var))
return NULL;
// This will always return numbers as integers.
/* This will always return numbers as integers. */
BEGIN_XCHAT_CALLS(NONE);
result = hexchat_pluginpref_get_str(prefph, var, retstr);
END_XCHAT_CALLS();
@ -2225,8 +2174,7 @@ Module_hexchat_unhook(PyObject *self, PyObject *args)
Plugin_RemoveHook(plugin, hook);
}
Py_INCREF(Py_None);
return Py_None;
Py_RETURN_NONE;
}
static PyObject *
@ -2534,11 +2482,8 @@ IInterp_Exec(char *command)
}
d = PyModule_GetDict(m);
len = strlen(command);
buffer = (char *) g_malloc(len+2);
if (buffer == NULL) {
hexchat_print(ph, "Not enough memory for command buffer");
goto fail;
}
buffer = g_malloc(len + 2);
memcpy(buffer, command, len);
buffer[len] = '\n';
buffer[len+1] = 0;
@ -2573,7 +2518,7 @@ IInterp_Cmd(char *word[], char *word_eol[], void *userdata)
/* Python command handling */
static void
Command_PyList()
Command_PyList(void)
{
GSList *list;
list = plugin_list;
@ -2640,7 +2585,7 @@ Command_PyReload(char *name)
}
static void
Command_PyAbout()
Command_PyAbout(void)
{
hexchat_print(ph, about);
}
@ -2784,6 +2729,7 @@ hexchat_plugin_init(hexchat_plugin *plugin_handle,
Py_Initialize();
PySys_SetArgv(1, argv);
xchatout_buffer = g_string_new (NULL);
xchatout = XChatOut_New();
if (xchatout == NULL) {
hexchat_print(ph, "Can't allocate xchatout object");
@ -2831,7 +2777,7 @@ hexchat_plugin_init(hexchat_plugin *plugin_handle,
}
int
hexchat_plugin_deinit()
hexchat_plugin_deinit(void)
{
GSList *list;
@ -2854,10 +2800,8 @@ hexchat_plugin_deinit()
plugin_list = NULL;
/* Reset xchatout buffer. */
g_free(xchatout_buffer);
g_string_free (xchatout_buffer, TRUE);
xchatout_buffer = NULL;
xchatout_buffer_size = 0;
xchatout_buffer_pos = 0;
if (interp_plugin) {
Py_DECREF(interp_plugin);

View File

@ -1,7 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Label="Configuration">
<PlatformToolset>v120</PlatformToolset>
<PlatformToolset>v140</PlatformToolset>
<ConfigurationType>DynamicLibrary</ConfigurationType>
</PropertyGroup>
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Release|Win32">
@ -19,80 +20,33 @@
<RootNamespace>python2</RootNamespace>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="..\..\win32\hexchat.props" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="..\..\win32\hexchat.props" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="..\..\win32\hexchat.props" />
<PropertyGroup>
<TargetName>$(Python2Output)</TargetName>
<OutDir>$(HexChatBin)</OutDir>
<IntDir>$(HexChatObj)$(ProjectName)\</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental>
<TargetName>$(Python2Output)</TargetName>
<OutDir>$(HexChatBin)</OutDir>
<IntDir>$(HexChatObj)$(ProjectName)\</IntDir>
<OutDir>$(HexChatRel)plugins\</OutDir>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<PrecompiledHeader>
</PrecompiledHeader>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;PYTHON_EXPORTS;$(OwnFlags);%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(Glib);$(Python2Path)\include;..\..\src\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<AdditionalIncludeDirectories>$(Glib);$(Python2Path)\include;..\..\src\common;$(HexChatLib);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<ModuleDefinitionFile>python.def</ModuleDefinitionFile>
<AdditionalDependencies>"$(Python2Lib).lib";$(DepLibs);%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(DepsRoot)\lib;$(OutDir);$(Python2Path)\libs;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalLibraryDirectories>$(DepsRoot)\lib;$(Python2Path)\libs;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<PrecompiledHeader>
</PrecompiledHeader>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;_WIN64;_AMD64_;NDEBUG;_WINDOWS;_USRDLL;PYTHON_EXPORTS;$(OwnFlags);%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(Glib);$(Python2Path)\include;..\..\src\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<AdditionalIncludeDirectories>$(Glib);$(Python2Path)\include;..\..\src\common;$(HexChatLib);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<ModuleDefinitionFile>python.def</ModuleDefinitionFile>
<AdditionalDependencies>"$(Python2Lib).lib";$(DepLibs);%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(DepsRoot)\lib;$(OutDir);$(Python2Path)\libs;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalLibraryDirectories>$(DepsRoot)\lib;$(Python2Path)\libs;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
@ -102,6 +56,4 @@
<ClCompile Include="python.c" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
</Project>

View File

@ -1,7 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Label="Configuration">
<PlatformToolset>v120</PlatformToolset>
<PlatformToolset>v140</PlatformToolset>
<ConfigurationType>DynamicLibrary</ConfigurationType>
</PropertyGroup>
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Release|Win32">
@ -19,80 +20,33 @@
<RootNamespace>python3</RootNamespace>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="..\..\win32\hexchat.props" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="..\..\win32\hexchat.props" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="..\..\win32\hexchat.props" />
<PropertyGroup>
<TargetName>$(Python3Output)</TargetName>
<OutDir>$(HexChatBin)</OutDir>
<IntDir>$(HexChatObj)$(ProjectName)\</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental>
<TargetName>$(Python3Output)</TargetName>
<OutDir>$(HexChatBin)</OutDir>
<IntDir>$(HexChatObj)$(ProjectName)\</IntDir>
<OutDir>$(HexChatRel)plugins\</OutDir>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<PrecompiledHeader>
</PrecompiledHeader>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;PYTHON_EXPORTS;$(OwnFlags);%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(Glib);$(Python3Path)\include;..\..\src\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<AdditionalIncludeDirectories>$(Glib);$(Python3Path)\include;..\..\src\common;$(HexChatLib);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<ModuleDefinitionFile>python.def</ModuleDefinitionFile>
<AdditionalDependencies>"$(Python3Lib).lib";$(DepLibs);%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(DepsRoot)\lib;$(OutDir);$(Python3Path)\libs;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalLibraryDirectories>$(DepsRoot)\lib;$(Python3Path)\libs;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<PrecompiledHeader>
</PrecompiledHeader>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;_WIN64;_AMD64_;NDEBUG;_WINDOWS;_USRDLL;PYTHON_EXPORTS;$(OwnFlags);%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(Glib);$(Python3Path)\include;..\..\src\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<AdditionalIncludeDirectories>$(Glib);$(Python3Path)\include;..\..\src\common;$(HexChatLib);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<ModuleDefinitionFile>python.def</ModuleDefinitionFile>
<AdditionalDependencies>"$(Python3Lib).lib";$(DepLibs);%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(DepsRoot)\lib;$(OutDir);$(Python3Path)\libs;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalLibraryDirectories>$(DepsRoot)\lib;$(Python3Path)\libs;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
@ -102,6 +56,4 @@
<ClCompile Include="python.c" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
</Project>

View File

@ -1,7 +1,17 @@
libdir = $(hexchatlibdir)
sources = sysinfo.c format.c shared/df.c
if PLATFORM_OSX
sources += osx/backend.m
else
sources += unix/backend.c unix/match.c unix/parse.c unix/pci.c
endif
EXTRA_DIST = osx unix win32 shared format.h sysinfo.h sysinfo-backend.h
lib_LTLIBRARIES = sysinfo.la
sysinfo_la_SOURCES = hwmon.c match.c parse.c pci.c xsys.c
sysinfo_la_LDFLAGS = -avoid-version -module
sysinfo_la_LIBADD = -lpci
AM_CPPFLAGS = $(COMMON_CFLAGS) -I$(srcdir)/../../src/common
sysinfo_la_SOURCES = $(sources)
sysinfo_la_LDFLAGS = $(PLUGIN_LDFLAGS) -module
sysinfo_la_LIBADD = $(LIBPCI_LIBS) $(GLIB_LIBS)
AM_CPPFLAGS = $(LIBPCI_CFLAGS) $(GLIB_CFLAGS) -I$(top_srcdir)/src/common -I$(srcdir)/shared

90
plugins/sysinfo/format.c Normal file
View File

@ -0,0 +1,90 @@
/*
* SysInfo - sysinfo plugin for HexChat
* Copyright (c) 2015 Patrick Griffis.
*
* This program is free software you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <glib.h>
char *
sysinfo_format_uptime (gint64 uptime)
{
char buffer[128];
gint64 weeks = uptime / 604800;
int days = (uptime / 86400) % 7;
int hours = (uptime / 3600) % 24;
int minutes = (uptime / 60) % 60;
int seconds = uptime % 60;
if (weeks != 0)
{
g_snprintf (buffer, sizeof(buffer), "%" G_GINT64_FORMAT "w %dd %dh %dm %ds", weeks, days, hours, minutes, seconds);
}
else if (days != 0)
{
g_snprintf (buffer, sizeof(buffer), "%dd %dh %dm %ds", days, hours, minutes, seconds);
}
else if (hours != 0)
{
g_snprintf (buffer, sizeof(buffer), "%dh %dm %ds", hours, minutes, seconds);
}
else if (minutes != 0)
{
g_snprintf (buffer, sizeof(buffer), "%dm %ds", minutes, seconds);
}
else
{
g_snprintf (buffer, sizeof(buffer), "%ds", seconds);
}
return g_strdup (buffer);
}
char *
sysinfo_format_memory (guint64 totalmem, guint64 freemem)
{
char *total_fmt, *free_fmt, *ret;
total_fmt = g_format_size_full (totalmem, G_FORMAT_SIZE_IEC_UNITS);
free_fmt = g_format_size_full (freemem, G_FORMAT_SIZE_IEC_UNITS);
ret = g_strdup_printf ("%s Total (%s Free)", total_fmt, free_fmt);
g_free (total_fmt);
g_free (free_fmt);
return ret;
}
char *
sysinfo_format_disk (guint64 total, guint64 free)
{
char *total_fmt, *free_fmt, *used_fmt, *ret;
GFormatSizeFlags format_flags = G_FORMAT_SIZE_DEFAULT;
#ifdef WIN32 /* Windows uses IEC size (with SI format) */
format_flags = G_FORMAT_SIZE_IEC_UNITS;
#endif
total_fmt = g_format_size_full (total, format_flags);
free_fmt = g_format_size_full (free, format_flags);
used_fmt = g_format_size_full (total - free, format_flags);
ret = g_strdup_printf ("%s / %s (%s Free)", used_fmt, total_fmt, free_fmt);
g_free (total_fmt);
g_free (free_fmt);
g_free (used_fmt);
return ret;
}

View File

@ -1,7 +1,6 @@
/*
* xsys.h - X-Sys general parameters header
* Copyright (C) 2005 Gustavo Zacarias
* Copyright (C) 2006, 2007 Tony Vroon
* SysInfo - sysinfo plugin for HexChat
* Copyright (c) 2015 Patrick Griffis.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -19,14 +18,11 @@
*/
#ifndef _XSYS_H_
#define _XSYS_H_
#ifndef FORMAT_H
#define FORMAT_H
#define bsize 1024
#define delims ":="
int sysinfo_get_percent ();
void sysinfo_get_pciids (char *dest);
void sysinfo_print_error (const char* msg);
char *sysinfo_format_uptime(gint64 uptime);
char *sysinfo_format_memory(guint64 totalmem, guint64 freemem);
char *sysinfo_format_disk(guint64 total, guint64 free);
#endif

View File

@ -1,64 +0,0 @@
/*
* hwmon.c - Hardware monitoring functions for X-Sys
* Copyright (C) 2005 Tony Vroon
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <unistd.h>
#include "xsys.h"
int hwmon_chip_present()
{
FILE *fp = fopen("/sys/class/hwmon/hwmon0/device/name", "r");
if(fp != NULL) {
fclose(fp);
return 1;
}
return 0;
}
#if 0
void get_hwmon_chip_name(char *name)
{
char *position, buffer[bsize];
FILE *fp = fopen("/sys/class/hwmon/hwmon0/device/name", "r");
if(fp != NULL) {
if(fgets(buffer, bsize, fp) != NULL) {
position = strstr(buffer, "\n");
*(position) = '\0';
snprintf(name, sizeof(name), "%s", buffer);
}
fclose(fp);
}
}
#endif
void get_hwmon_temp(unsigned int *value, unsigned int *sensor)
{
char buffer[bsize];
FILE *fp;
snprintf(buffer, bsize, "/sys/class/hwmon/hwmon0/device/temp%i_input", *sensor);
fp = fopen(buffer, "r");
if(fp != NULL) {
if(fgets(buffer, bsize, fp) != NULL)
*value = atoi(buffer);
fclose(fp);
}
}

View File

@ -1,240 +0,0 @@
/*
* match.c - matching functions for X-Sys
* Copyright (C) 2005, 2006, 2007 Tony Vroon
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <unistd.h>
#include "xsys.h"
float percentage(unsigned long long *free, unsigned long long *total)
{
unsigned long long result = (*free) * (unsigned long long)1000 / (*total);
return result / 10.0;
}
char *pretty_freespace(const char *desc, unsigned long long *free_k, unsigned long long *total_k)
{
char *quantities[] = { "KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB", 0 };
char *result, **quantity;
double free_space, total_space;
free_space = *free_k;
total_space = *total_k;
result = malloc(bsize * sizeof(char));
if (total_space == 0)
{
snprintf(result, bsize, "%s: none", desc);
return result;
}
quantity = quantities;
while (total_space > 1023 && *(quantity + 1))
{
quantity++;
free_space = free_space / 1024;
total_space = total_space / 1024;
}
if (sysinfo_get_percent () != 0)
snprintf(result, bsize, "%s: %.1f%s, %.1f%% free",
desc, total_space, *quantity,
percentage(free_k, total_k));
else
snprintf(result, bsize, "%s: %.1f%s/%.1f%s free",
desc, free_space, *quantity, total_space, *quantity);
return result;
}
void remove_leading_whitespace(char *buffer)
{
char *buffer2 = NULL;
int i = 0, j = 0, ews = 0;
buffer2 = (char*)malloc(strlen(buffer) * sizeof(char));
if (buffer2 == NULL)
return;
memset (buffer2, (char)0, strlen(buffer));
while (i < strlen(buffer))
{
/* count tabs, spaces as whitespace. */
if (!(buffer[i] == (char)32 || buffer[i] == (char)9) || ews == 1)
{
ews = 1;
buffer2[j] = buffer[i];
j++;
}
i++;
}
memset (buffer, (char)0, strlen(buffer));
strcpy (buffer, buffer2);
free (buffer2);
}
char *decruft_filename(char *buffer)
{
char *match, *match_end;
while ((match = strstr(buffer, "%20")))
{
match_end = match + 3;
*match++ = ' ';
while (*match_end)
*match++ = *match_end++;
*match = 0;
}
return buffer;
}
void find_match_char(char *buffer, char *match, char *result)
{
char *position;
remove_leading_whitespace(buffer);
if(strstr(buffer, match) == strstr(buffer, buffer))
{
position = strpbrk(buffer, delims);
if (position != NULL) {
position += 1;
strcpy(result, position);
position = strstr(result, "\n");
*(position) = '\0';
remove_leading_whitespace(result);
}
else
strcpy(result, "\0");
}
}
void find_match_double(char *buffer, char *match, double *result)
{
char *position;
remove_leading_whitespace(buffer);
if(strstr(buffer, match) == strstr(buffer, buffer))
{
position = strpbrk(buffer, delims);
if (position != NULL) {
position += 1;
*result = strtod(position, NULL);
}
else
*result = 0;
}
}
void find_match_double_hex(char *buffer, char *match, double *result)
{
char *position;
remove_leading_whitespace(buffer);
if(strstr(buffer, match) == strstr(buffer, buffer))
{
position = strpbrk(buffer, delims);
if (position != NULL) {
memcpy(position,"0x",2);
*result = strtod(position,NULL);
}
else
*result = 0;
}
}
void find_match_int(char *buffer, char *match, unsigned int *result)
{
char *position;
remove_leading_whitespace(buffer);
if(strstr(buffer, match) == strstr(buffer, buffer))
{
position = strpbrk(buffer, delims);
if (position != NULL) {
position += 1;
*result = atoi(position);
}
else
*result = 0;
}
}
void find_match_ll(char *buffer, char *match, unsigned long long *result)
{
char *position;
remove_leading_whitespace(buffer);
if(strstr(buffer, match) == strstr(buffer, buffer))
{
position = strpbrk(buffer, delims);
if (position != NULL) {
position += 1;
*result = strtoll(position, NULL, 10);
}
else
*result = 0;
}
}
void format_output(const char *arg, char *string, char *format)
{
char *pos1, *pos2, buffer[bsize];
pos1 = &format[0];
strncpy(buffer, string, bsize);
string[0] = '\0';
while((pos2 = strstr(pos1, "%")) != NULL)
{
strncat(string, pos1, (size_t)(pos2-pos1));
if(*(pos2+1) == '1')
strcat(string, arg);
else if(*(pos2+1) == '2')
strcat(string, buffer);
else if(*(pos2+1) == 'C' || *(pos2+1) == 'c')
strcat(string, "\003");
else if(*(pos2+1) == 'B' || *(pos2+1) == 'b')
strcat(string, "\002");
else if(*(pos2+1) == 'R' || *(pos2+1) == 'r')
strcat(string, "\026");
else if(*(pos2+1) == 'O' || *(pos2+1) == 'o')
strcat(string, "\017");
else if(*(pos2+1) == 'U' || *(pos2+1) == 'u')
strcat(string, "\037");
else if(*(pos2+1) == '%')
strcat(string, "%");
pos1=pos2+2;
}
strcat(string, pos1);
}
void flat_format_output(const char *arg, char *string, char *format)
{
char *pos1, *pos2, buffer[bsize];
pos1 = &format[0];
strncpy(buffer, string, bsize);
string[0] = '\0';
while((pos2 = strstr(pos1, "%")) != NULL)
{
strncat(string, pos1, (size_t)(pos2-pos1));
if(*(pos2+1) == '1')
strcat(string, arg);
else if(*(pos2+1) == '2')
strcat(string, buffer);
else if(*(pos2+1) == '%')
strcat(string, "%");
pos1=pos2+2;
}
strcat(string, pos1);
}

View File

@ -0,0 +1,263 @@
/*
* SysInfo - sysinfo plugin for HexChat
* Copyright (c) 2015 Patrick Griffis.
*
* This program is free software you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
/*
* Some snippets based upon Textual's System Profiler plugin.
* https://github.com/Codeux-Software/Textual
*/
#import <Cocoa/Cocoa.h>
#include <sys/sysctl.h>
#include <mach/mach.h>
#include <mach/mach_host.h>
#include <mach/host_info.h>
#include <mach/mach_vm.h>
#include <glib.h>
#include "format.h"
#include "df.h"
static char *
get_os (void)
{
NSDictionary *systemversion = [NSDictionary dictionaryWithContentsOfFile:@"/System/Library/CoreServices/SystemVersion.plist"];
NSString *build = [systemversion objectForKey:@"ProductBuildVersion"];
if (!build)
return NULL;
NSString *version = [systemversion objectForKey:@"ProductUserVisibleVersion"];
if (!version)
{
[build release];
return NULL;
}
NSDictionary *profiler = [NSDictionary dictionaryWithContentsOfFile:[@"~/Library/Preferences/com.apple.SystemProfiler.plist" stringByExpandingTildeInPath]];
NSDictionary *names = [profiler objectForKey:@"OS Names"];
NSString *os_name = nil;
for (NSString *name in names)
{
if ([name hasPrefix:build])
{
os_name = [names objectForKey:name];
break;
}
}
[build release];
if (!os_name)
{
[version release];
return NULL;
}
char *ret = g_strdup_printf ("%s %s", [os_name UTF8String], [version UTF8String]);
[version release];
return ret;
}
static char *
get_os_fallback (void)
{
NSProcessInfo *info = [NSProcessInfo processInfo];
NSOperatingSystemVersion version = [info operatingSystemVersion];
return g_strdup_printf ("OS X %ld.%ld.%ld", version.majorVersion, version.minorVersion, version.patchVersion);
}
char *
sysinfo_backend_get_os(void)
{
static char *os_str = NULL;
if (!os_str)
{
os_str = get_os();
if (!os_str)
os_str = get_os_fallback();
}
return g_strdup (os_str);
}
char *
sysinfo_backend_get_disk(void)
{
gint64 total, free_space;
if (xs_parse_df (&total, &free_space))
{
return NULL;
}
return sysinfo_format_disk (total, free_space);
}
static guint64
get_free_memory (void)
{
mach_msg_type_number_t infoCount = (sizeof(vm_statistics_data_t) / sizeof(natural_t));
vm_size_t pagesize;
vm_statistics_data_t vm_stat;
host_page_size(mach_host_self(), &pagesize);
if (host_statistics(mach_host_self(), HOST_VM_INFO, (host_info_t)&vm_stat, &infoCount) == KERN_SUCCESS)
return ((vm_stat.inactive_count + vm_stat.free_count) * pagesize);
return 0;
}
char *
sysinfo_backend_get_memory(void)
{
NSProcessInfo *info = [NSProcessInfo processInfo];
guint64 totalmem, freemem;
totalmem = [info physicalMemory];
if ((freemem = get_free_memory()) == 0)
return NULL;
return sysinfo_format_memory (totalmem, freemem);
}
char *
sysinfo_backend_get_cpu(void)
{
guint64 cpu_clock_uint = 0;
double cpu_clock;
char cpu_string[256];
gsize len;
gboolean giga = FALSE;
len = sizeof(cpu_string);
if (sysctlbyname ("machdep.cpu.brand_string", cpu_string, &len, NULL, 0) != 0)
return NULL;
cpu_string[sizeof(cpu_string) - 1] = '\0';
len = sizeof(cpu_clock_uint);
if (sysctlbyname("hw.cpufrequency", &cpu_clock_uint, &len, NULL, 0) < 0)
return NULL;
cpu_clock = cpu_clock_uint / 1000000;
if (cpu_clock > 1000)
{
cpu_clock /= 1000;
giga = TRUE;
}
if (giga)
return g_strdup_printf ("%s (%.2fGHz)", cpu_string, cpu_clock);
else
return g_strdup_printf ("%s (%.0fMHz)", cpu_string, cpu_clock);
}
static char *
get_gpu(void)
{
CFMutableDictionaryRef pciDevices = IOServiceMatching("IOPCIDevice");
io_iterator_t entry_iterator, serviceObject;
if (IOServiceGetMatchingServices(kIOMasterPortDefault, pciDevices, &entry_iterator) != kIOReturnSuccess)
return NULL;
GString *gpu_list = g_string_new(NULL);
while ((serviceObject = IOIteratorNext(entry_iterator)))
{
CFMutableDictionaryRef serviceDictionary;
kern_return_t status = IORegistryEntryCreateCFProperties(serviceObject, &serviceDictionary,
kCFAllocatorDefault, kNilOptions);
if (status != kIOReturnSuccess)
{
IOObjectRelease(serviceObject);
continue;
}
const void *class = CFDictionaryGetValue(serviceDictionary, @"class-code");
if (!class || *(guint32*)CFDataGetBytePtr(class) != 0x30000) /* DISPLAY_VGA */
{
CFRelease(serviceDictionary);
continue;
}
const void *model = CFDictionaryGetValue(serviceDictionary, @"model");
if (model)
{
if (CFGetTypeID(model) == CFDataGetTypeID() && CFDataGetLength(model) > 1)
{
if (gpu_list->len != 0)
g_string_append (gpu_list, ", ");
g_string_append_len (gpu_list, (const char*)CFDataGetBytePtr(model), CFDataGetLength(model) - 1);
}
}
CFRelease(serviceDictionary);
}
if (gpu_list->len == 0)
{
g_string_free (gpu_list, TRUE);
return NULL;
}
/* The string may contain nul-chars we must replace */
int i;
for (i = 0; i < gpu_list->len; i++)
{
if (gpu_list->str[i] == '\0')
gpu_list->str[i] = ' ';
}
return g_string_free (gpu_list, FALSE);
}
char *
sysinfo_backend_get_gpu(void)
{
static char *gpu_str = NULL;
if (!gpu_str)
gpu_str = get_gpu();
return g_strdup (gpu_str);
}
char *
sysinfo_backend_get_sound(void)
{
return NULL;
}
char *
sysinfo_backend_get_uptime(void)
{
NSProcessInfo *info = [NSProcessInfo processInfo];
double uptime = [info systemUptime];
return sysinfo_format_uptime ((gint64)uptime);
}
char *
sysinfo_backend_get_network(void)
{
return NULL;
}

View File

@ -1,462 +0,0 @@
/*
* parse.c - parsing functions for X-Sys
* by mike9010
* Copyright (C) 2003, 2004, 2005 Michael Shoup
* Copyright (C) 2005, 2006, 2007 Tony Vroon
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <sys/utsname.h>
#include <unistd.h>
#include <time.h>
#include <dirent.h>
#include <sys/types.h>
#include <pci/header.h>
#include "pci.h"
#include "match.h"
#include "hwmon.h"
#include "xsys.h"
#include "parse.h"
int xs_parse_cpu(char *model, char *vendor, double *freq, char *cache, unsigned int *count)
{
#if defined(__i386__) || defined(__x86_64__) || defined(__powerpc__) || defined(__alpha__) || defined(__ia64__) || defined(__parisc__) || defined(__sparc__)
char buffer[bsize];
#endif
#if defined(__powerpc__)
char *pos = NULL;
#endif
FILE *fp = fopen("/proc/cpuinfo", "r");
if(fp == NULL)
return 1;
if(count != NULL) *count = 0;
strcpy(cache,"unknown\0");
#if defined(__i386__) || defined(__x86_64__)
while(fgets(buffer, bsize, fp) != NULL)
{
find_match_char(buffer, "model name", model);
find_match_char(buffer, "vendor_id", vendor);
find_match_double(buffer, "cpu MHz", freq);
find_match_char(buffer, "cache size", cache);
find_match_int(buffer, "processor", count);
}
*count = *count + 1;
#endif
#ifdef __powerpc__
while(fgets(buffer, bsize, fp) != NULL)
{
find_match_char(buffer, "cpu", model);
find_match_char(buffer, "machine", vendor);
find_match_double(buffer, "clock", freq);
find_match_char(buffer, "L2 cache", cache);
find_match_int(buffer, "processor", count);
}
*count = *count + 1;
pos = strstr(model, ",");
if (pos != NULL) *pos = '\0';
#endif
#ifdef __alpha__
while(fgets(buffer, bsize, fp) != NULL)
{
find_match_char(buffer, "cpu model", model);
find_match_char(buffer, "system type", vendor);
find_match_double(buffer, "cycle frequency [Hz]", freq);
find_match_char(buffer, "L2 cache", cache);
find_match_int(buffer, "cpus detected", count);
}
*freq = *freq / 1000000;
#endif
#ifdef __ia64__
while(fgets(buffer, bsize, fp) != NULL)
{
find_match_char(buffer, "model", model);
find_match_char(buffer, "vendor", vendor);
find_match_double(buffer, "cpu MHz", freq);
find_match_int(buffer, "processor", count);
}
*count = *count + 1;
#endif
#ifdef __parisc__
while(fgets(buffer, bsize, fp) != NULL)
{
find_match_char(buffer, "cpu ", model);
find_match_char(buffer, "cpu family", vendor);
find_match_char(buffer, "D-cache", cache);
find_match_double(buffer, "cpu MHz", freq);
find_match_int(buffer, "processor", count);
}
*count = *count + 1;
#endif
#ifdef __sparc__
DIR *dir;
struct dirent *entry;
FILE *fp2;
while(fgets(buffer, bsize, fp) != NULL)
{
find_match_char(buffer, "cpu ", model);
find_match_char(buffer, "type ", vendor);
find_match_int(buffer, "ncpus active", count);
find_match_double_hex(buffer, "Cpu0ClkTck", freq);
}
/* Cache is tricky, only implemented for sparc64 */
if ((dir = opendir("/proc/openprom")) != NULL)
while ((entry = readdir(dir)) != NULL)
if (strncmp(entry->d_name,"SUNW,UltraSPARC",15) == 0)
{
snprintf(buffer,bsize,"/proc/openprom/%s/ecache-size",entry->d_name);
fp2 = fopen(buffer, "r");
if (fp2 == NULL) break;
fscanf(fp2,"%16s",cache);
fclose(fp2);
sprintf(buffer,"0x%s",cache);
sprintf(cache,"%0.0f KB",strtod(buffer,NULL)/1024);
}
*freq = *freq / 1000000;
#endif
fclose(fp);
return 0;
}
int xs_parse_uptime(int *weeks, int *days, int *hours, int *minutes, int *seconds)
{
char buffer[bsize];
long long uptime = 0;
FILE *fp = fopen("/proc/uptime", "r");
if(fp == NULL)
return 1;
if(fgets(buffer, bsize, fp) != NULL)
uptime = strtol(buffer, NULL, 0);
*seconds = uptime%60;
*minutes = (uptime/60)%60;
*hours = (uptime/3600)%24;
*days = (uptime/86400)%7;
*weeks = uptime/604800;
fclose(fp);
return 0;
}
int xs_parse_os(char *user, char *host, char *kernel)
{
struct utsname osinfo;
char hostn[bsize], *usern = getenv("USER");
if(uname(&osinfo)<0)
return 1;
if(gethostname(hostn, bsize)<0)
return 1;
strncpy(user, usern, bsize);
strcpy(host, hostn);
snprintf(kernel, bsize, "%s %s %s", osinfo.sysname, osinfo.release, osinfo.machine);
return 0;
}
int xs_parse_sound(char *snd_card)
{
char buffer[bsize], cards[bsize] = "\0", vendor[7] = "\0", device[7] = "\0", *pos;
u16 class = PCI_CLASS_MULTIMEDIA_AUDIO;
FILE *fp = NULL;
if((fp = fopen("/proc/asound/cards", "r"))== NULL) {
if (pci_find_by_class(&class, vendor, device) == 0)
{
pci_find_fullname(snd_card, vendor, device);
return 0;
}
else
return 1;
}
while(fgets(buffer, bsize, fp) != NULL)
{
if(isdigit(buffer[0]) || isdigit(buffer[1]))
{
char card_buf[bsize];
long card_id = 0;
pos = strstr(buffer, ":");
card_id = strtoll(buffer, NULL, 0);
if (card_id == 0)
snprintf(card_buf, bsize, "%s", pos+2);
else
snprintf(card_buf, bsize, "%ld: %s", card_id, pos+2);
pos = strstr(card_buf, "\n");
*pos = '\0';
strcat(cards, card_buf);
}
}
strcpy(snd_card, cards);
fclose(fp);
return 0;
}
int xs_parse_video(char *vid_card)
{
char vendor[7] = "\0", device[7] = "\0";
u16 class = PCI_CLASS_DISPLAY_VGA;
if (pci_find_by_class(&class, vendor, device))
return 1;
else
pci_find_fullname(vid_card, vendor, device);
return 0;
}
int xs_parse_ether(char *ethernet_card)
{
char vendor[7] = "\0", device[7] = "\0";
u16 class = PCI_CLASS_NETWORK_ETHERNET;
if (pci_find_by_class(&class, vendor, device))
return 1;
else
pci_find_fullname(ethernet_card, vendor, device);
return 0;
}
int xs_parse_agpbridge(char *agp_bridge)
{
char vendor[7] = "\0", device[7] = "\0";
u16 class = PCI_CLASS_BRIDGE_HOST;
if (pci_find_by_class(&class, vendor, device))
return 1;
else
pci_find_fullname(agp_bridge, vendor, device);
return 0;
}
int xs_parse_netdev(const char *device, unsigned long long *bytes_recv, unsigned long long *bytes_sent)
{
FILE *fp;
char buffer[bsize], *pos;
int i;
fp=fopen("/proc/net/dev", "r");
if(fp==NULL)
return 1;
while(fgets(buffer, bsize, fp) != NULL)
{
for(i=0; isspace(buffer[i]); i++);
if(strncmp(device, &buffer[i], strlen(device)) == 0) break;
}
fclose(fp);
pos = strstr(buffer, ":");
pos++;
*bytes_recv = strtoull(pos, &pos, 0);
for(i=0;i<7;i++) strtoull(pos, &pos, 0);
*bytes_sent = strtoull(pos, NULL, 0);
return 0;
}
int xs_parse_df(const char *mount_point, char *result)
{
FILE *pipe;
char buffer[bsize], *pos;
unsigned long long total_k=0, free_k=0;
int i=0;
pipe = popen("df -k -l -P", "r");
if(pipe==NULL)
return 1;
while(fgets(buffer, bsize, pipe) != NULL)
{
/* Skip over pseudo-filesystems and description line */
if(isalpha(buffer[0]))
continue;
for(pos=buffer; !isspace(*pos); pos++);
for(;isspace(*pos);pos++);
if(mount_point == NULL)
{
total_k += strtoull(pos, &pos, 0);
strtoull(pos, &pos, 0);
free_k += strtoull(pos, &pos, 0);
continue;
}
total_k = strtoull(pos, &pos, 0);
strtoull(pos, &pos, 0);
free_k = strtoull(pos, &pos, 0);
strtoull(pos, &pos, 0);
for(;isspace(*pos);pos++);
for(;*pos!='/';pos++);
for(i=0;*(buffer+i)!='\n';i++);
*(buffer+i)='\0';
if(strncasecmp(mount_point, "ALL", 3)==0)
{
char *tmp_buf = pretty_freespace(pos, &free_k, &total_k);
strcat(tmp_buf, " | ");
strcat(result, tmp_buf);
free(tmp_buf);
}
else if(strncmp(mount_point, pos, strlen(mount_point)) == 0)
{
char *tmp_buf = pretty_freespace(mount_point, &free_k, &total_k);
strncpy(result, tmp_buf, bsize);
free(tmp_buf);
break;
}
else snprintf(result, bsize, "Mount point %s not found!", mount_point);
}
if(mount_point != NULL && strncasecmp(mount_point, "ALL", 3)==0)
*(result+strlen(result)-3) = '\0';
if(mount_point == NULL)
{
char *tmp_buf = pretty_freespace("Total", &free_k, &total_k);
strncpy(result, tmp_buf, bsize);
free(tmp_buf);
}
pclose(pipe);
return 0;
}
int xs_parse_meminfo(unsigned long long *mem_tot, unsigned long long *mem_free, int swap)
{
FILE *fp;
char buffer[bsize];
unsigned long long freemem = 0, buffers = 0, cache = 0;
*mem_tot = 0;
*mem_free = 0;
if((fp = fopen("/proc/meminfo", "r")) == NULL)
return 1;
while(fgets(buffer, bsize, fp) != NULL)
{
if(!swap)
{
find_match_ll(buffer, "MemTotal:", mem_tot);
find_match_ll(buffer, "MemFree:", &freemem);
find_match_ll(buffer, "Buffers:", &buffers);
find_match_ll(buffer, "Cached:", &cache);
}
else
{
find_match_ll(buffer, "SwapTotal:", mem_tot);
find_match_ll(buffer, "SwapFree:", mem_free);
}
}
if (!swap) {
*mem_free = freemem + buffers + cache;
}
fclose(fp);
return 0;
}
int xs_parse_distro(char *name)
{
FILE *fp = NULL;
char buffer[bsize], *pos = NULL;
if((fp = fopen("/etc/portage/make.conf", "r")) != NULL ||
(fp = fopen("/etc/make.conf", "r")) != NULL)
{
char keywords[bsize];
while(fgets(buffer, bsize, fp) != NULL)
find_match_char(buffer, "ACCEPT_KEYWORDS", keywords);
/* cppcheck-suppress uninitvar */
if (strstr(keywords, "\"") == NULL)
snprintf(buffer, bsize, "Gentoo Linux (stable)");
else
snprintf(buffer, bsize, "Gentoo Linux %s", keywords);
}
else if((fp = fopen("/etc/redhat-release", "r")) != NULL)
fgets(buffer, bsize, fp);
else if((fp = fopen("/etc/mageia-release", "r")) != NULL)
fgets(buffer, bsize, fp);
else if((fp = fopen("/etc/slackware-version", "r")) != NULL)
fgets(buffer, bsize, fp);
else if((fp = fopen("/etc/mandrake-release", "r")) != NULL)
fgets(buffer, bsize, fp);
else if((fp = fopen("/etc/SuSE-release", "r")) != NULL)
fgets(buffer, bsize, fp);
else if((fp = fopen("/etc/turbolinux-release", "r")) != NULL)
fgets(buffer, bsize, fp);
else if((fp = fopen("/etc/arch-release", "r")) != NULL)
snprintf(buffer, bsize, "ArchLinux");
else if((fp = fopen("/etc/lsb-release", "r")) != NULL)
{
char id[bsize], codename[bsize], release[bsize];
strcpy(id, "?");
strcpy(codename, "?");
strcpy(release, "?");
while(fgets(buffer, bsize, fp) != NULL)
{
find_match_char(buffer, "DISTRIB_ID", id);
find_match_char(buffer, "DISTRIB_CODENAME", codename);
find_match_char(buffer, "DISTRIB_RELEASE", release);
}
snprintf(buffer, bsize, "%s \"%s\" %s", id, codename, release);
}
else if((fp = fopen("/etc/debian_version", "r")) != NULL)
{
char release[bsize];
fgets(release, bsize, fp);
snprintf(buffer, bsize, "Debian %s", release);
}
else
snprintf(buffer, bsize, "Unknown Distro");
if(fp != NULL) fclose(fp);
pos=strchr(buffer, '\n');
if(pos != NULL) *pos = '\0';
strcpy(name, buffer);
return 0;
}
int xs_parse_hwmon_chip(char *chip)
{
if (!hwmon_chip_present())
return 1;
#if 0
else
get_hwmon_chip_name(chip);
#endif
return 0;
}
int xs_parse_hwmon_temp(char *temp, unsigned int *sensor)
{
unsigned int value;
float celsius;
if (!hwmon_chip_present())
return 1;
else
get_hwmon_temp(&value, sensor);
celsius = (float)value;
snprintf(temp, bsize, "%.1fC", celsius/1000.0);
return 0;
}

View File

@ -1,157 +0,0 @@
/*
* pci.c - PCI functions for X-Sys
* Copyright (C) 1997-1999 Martin Mares <mj@atrey.karlin.mff.cuni.cz> [PCI routines from lspci]
* Copyright (C) 2000 Tom Rini <trini@kernel.crashing.org> [XorgAutoConfig pci.c, based on lspci]
* Copyright (C) 2005, 2006 Tony Vroon
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <unistd.h>
#include <pci/pci.h>
#include "xsys.h"
static struct pci_filter filter; /* Device filter */
static struct pci_access *pacc;
int bus, dev, func; /* Location of the card */
struct device {
struct device *next;
struct pci_dev *dev;
unsigned int config_cnt;
u8 config[256];
};
static struct device *first_dev;
static struct device *scan_device(struct pci_dev *p)
{
int how_much = 64;
struct device *d;
if (!pci_filter_match(&filter, p))
return NULL;
d = malloc(sizeof(struct device));
bzero(d, sizeof(*d));
d->dev = p;
if (!pci_read_block(p, 0, d->config, how_much))
exit(1);
if (how_much < 128 && (d->config[PCI_HEADER_TYPE] & 0x7f) == PCI_HEADER_TYPE_CARDBUS) {
/* For cardbus bridges, we need to fetch 64 bytes more to get the full standard header... */
if (!pci_read_block(p, 64, d->config+64, 64))
exit(1);
how_much = 128;
}
d->config_cnt = how_much;
pci_setup_cache(p, d->config, d->config_cnt);
pci_fill_info(p, PCI_FILL_IDENT);
return d;
}
static void scan_devices(void)
{
struct device *d;
struct pci_dev *p;
pci_scan_bus(pacc);
for(p=pacc->devices; p; p=p->next)
if ((d = scan_device(p))) {
d->next = first_dev;
first_dev = d;
}
}
static u16 get_conf_word(struct device *d, unsigned int pos)
{
return d->config[pos] | (d->config[pos+1] << 8);
}
int pci_find_by_class(u16 *class, char *vendor, char *device)
{
struct device *d;
struct pci_dev *p;
int nomatch = 1;
pacc = pci_alloc();
pci_filter_init(pacc, &filter);
pci_init(pacc);
scan_devices();
for(d=first_dev; d; d=d->next) {
p = d->dev;
/* Acquire vendor & device ID if the class matches */
if(get_conf_word(d, PCI_CLASS_DEVICE) == *class) {
nomatch = 0;
snprintf(vendor,7,"%04x",p->vendor_id);
snprintf(device,7,"%04x",p->device_id);
break;
}
}
pci_cleanup(pacc);
return nomatch;
}
void pci_find_fullname(char *fullname, char *vendor, char *device)
{
char buffer[bsize];
char vendorname[bsize/2] = "";
char devicename[bsize/2] = "";
char *position;
int cardfound = 0;
FILE *fp;
sysinfo_get_pciids (buffer);
fp = fopen (buffer, "r");
if(fp == NULL) {
snprintf(fullname, bsize, "%s:%s", vendor, device);
sysinfo_print_error ("pci.ids file not found! You might want to adjust your pciids setting with /SYSINFO SET pciids (you can query its current value with /SYSINFO LIST).\n");
return;
}
while(fgets(buffer, bsize, fp) != NULL) {
if (!isspace(buffer[0]) && strstr(buffer, vendor) != NULL) {
position = strstr(buffer, vendor);
position += 6;
strncpy(vendorname, position, bsize/2);
position = strstr(vendorname, "\n");
*(position) = '\0';
break;
}
}
while(fgets(buffer, bsize, fp) != NULL) {
if(strstr(buffer, device) != NULL) {
position = strstr(buffer, device);
position += 6;
strncpy(devicename, position, bsize/2);
position = strstr(devicename, " (");
if (position == NULL)
position = strstr(devicename, "\n");
*(position) = '\0';
cardfound = 1;
break;
}
}
if (cardfound == 1)
snprintf(fullname, bsize, "%s %s", vendorname, devicename);
else
snprintf(fullname, bsize, "%s:%s", vendor, device);
fclose(fp);
}

View File

@ -0,0 +1,53 @@
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <glib.h>
#include "sysinfo.h"
int xs_parse_df(gint64 *out_total, gint64 *out_free)
{
FILE *pipe;
char buffer[bsize];
pipe = popen("df -k -l -P", "r");
if(pipe==NULL)
return 1;
*out_total = *out_free = 0;
while(fgets(buffer, bsize, pipe) != NULL)
{
long long int avail, total;
/* Filesystem 1024-blocks Used Available Capacity Mounted-on */
if (sscanf (buffer, "%*s %lld %*s %lld %*s %*s", &total, &avail) == 2)
{
*out_total += total;
*out_free += avail;
}
}
/* Convert to bytes */
*out_total *= 1000;
*out_free *= 1000;
pclose(pipe);
return 0;
}

View File

@ -1,7 +1,4 @@
/* HexChat
* Copyright (C) 1998-2010 Peter Zelezny.
* Copyright (C) 2009-2013 Berke Viktor.
*
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
@ -17,9 +14,10 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#ifndef HEXCHAT_IDENTD_H
#define HEXCHAT_IDENTD_H
void identd_start (char *username);
#ifndef SYSINFO_SHARED_H
#define SYSINFO_SHARED_H
int xs_parse_df(gint64 *total_bytes, gint64 *free_bytes);
#endif

View File

@ -0,0 +1,33 @@
/*
* SysInfo - sysinfo plugin for HexChat
* Copyright (c) 2015 Patrick Griffis.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#ifndef SYSINFO_BACKEND_H
#define SYSINFO_BACKEND_H
char *sysinfo_backend_get_os(void);
char *sysinfo_backend_get_disk(void);
char *sysinfo_backend_get_memory(void);
char *sysinfo_backend_get_cpu(void);
char *sysinfo_backend_get_gpu(void);
char *sysinfo_backend_get_sound(void);
char *sysinfo_backend_get_uptime(void);
char *sysinfo_backend_get_network(void);
#endif

277
plugins/sysinfo/sysinfo.c Normal file
View File

@ -0,0 +1,277 @@
/*
* SysInfo - sysinfo plugin for HexChat
* Copyright (c) 2012 Berke Viktor.
*
* xsys.c - main functions for X-Sys 2
* by mikeshoup
* Copyright (C) 2003, 2004, 2005 Michael Shoup
* Copyright (C) 2005, 2006, 2007 Tony Vroon
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "config.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <glib.h>
#include "hexchat-plugin.h"
#include "sysinfo-backend.h"
#include "sysinfo.h"
#define _(x) hexchat_gettext(ph,x)
#define DEFAULT_ANNOUNCE TRUE
static hexchat_plugin *ph;
static char name[] = "Sysinfo";
static char desc[] = "Display info about your hardware and OS";
static char version[] = "1.0";
static char sysinfo_help[] = "SysInfo Usage:\n /SYSINFO [-e|-o] [CLIENT|OS|CPU|RAM|DISK|VGA|SOUND|ETHERNET|UPTIME], print various details about your system or print a summary without arguments\n /SYSINFO SET <variable>\n";
typedef struct
{
const char *name; /* Lower case name used for prefs */
const char *title; /* Used for the end formatting */
char *(*callback) (void);
gboolean def; /* Hide by default? */
} hwinfo;
static char *
get_client (void)
{
return g_strdup_printf ("HexChat %s", hexchat_get_info(ph, "version"));
}
static hwinfo hwinfos[] = {
{"client", "Client", get_client},
{"os", "OS", sysinfo_backend_get_os},
{"cpu", "CPU", sysinfo_backend_get_cpu},
{"memory", "Memory", sysinfo_backend_get_memory},
{"storage", "Storage", sysinfo_backend_get_disk},
{"vga", "VGA", sysinfo_backend_get_gpu},
{"sound", "Sound", sysinfo_backend_get_sound, TRUE},
{"ethernet", "Ethernet", sysinfo_backend_get_network, TRUE},
{"uptime", "Uptime", sysinfo_backend_get_uptime},
{NULL, NULL},
};
static gboolean sysinfo_get_bool_pref (const char *pref, gboolean def);
static gboolean
should_show_info (hwinfo info)
{
char hide_pref[32];
g_snprintf (hide_pref, sizeof(hide_pref), "hide_%s", info.name);
return !sysinfo_get_bool_pref (hide_pref, info.def);
}
static void
print_summary (gboolean announce)
{
char **strings = g_new0 (char*, G_N_ELEMENTS(hwinfos));
int i, x;
char *output;
for (i = 0, x = 0; hwinfos[i].name != NULL; i++)
{
if (should_show_info (hwinfos[i]))
{
char *str = hwinfos[i].callback();
if (str)
{
strings[x++] = g_strdup_printf ("\002%s\002: %s", hwinfos[i].title, str);
g_free (str);
}
}
}
output = g_strjoinv (" \002\342\200\242\002 ", strings);
hexchat_commandf (ph, "%s %s", announce ? "SAY" : "ECHO", output);
g_strfreev (strings);
g_free (output);
}
static void
print_info (char *info, gboolean announce)
{
int i;
for (i = 0; hwinfos[i].name != NULL; i++)
{
if (!g_ascii_strcasecmp (info, hwinfos[i].name))
{
char *str = hwinfos[i].callback();
if (str)
{
hexchat_commandf (ph, "%s \002%s\002: %s", announce ? "SAY" : "ECHO",
hwinfos[i].title, str);
g_free (str);
}
else
hexchat_print (ph, _("Sysinfo: Failed to get info. Either not supported or error."));
return;
}
}
hexchat_print (ph, _("Sysinfo: No info by that name\n"));
}
/*
* Simple wrapper for backend specific options.
* Ensure dest >= 512.
*/
int
sysinfo_get_str_pref (const char *pref, char *dest)
{
return hexchat_pluginpref_get_str (ph, pref, dest);
}
static gboolean
sysinfo_get_bool_pref (const char *pref, gboolean def)
{
int value = hexchat_pluginpref_get_int (ph, pref);
if (value != -1)
return value;
return def;
}
static void
sysinfo_set_pref_real (const char *pref, char *value, gboolean def)
{
if (value && value[0])
{
guint64 i = g_ascii_strtoull (value, NULL, 0);
hexchat_pluginpref_set_int (ph, pref, i != 0);
hexchat_printf (ph, _("Sysinfo: %s is set to: %d\n"), pref, i != 0);
}
else
{
hexchat_printf (ph, _("Sysinfo: %s is set to: %d\n"), pref,
sysinfo_get_bool_pref(pref, def));
}
}
static void
sysinfo_set_pref (char *key, char *value)
{
if (!key || !key[0])
{
hexchat_print (ph, _("Sysinfo: Valid settings are: announce and hide_* for each piece of information. e.g. hide_os. Without a value it will show current (or default) setting.\n"));
return;
}
if (!strcmp (key, "announce"))
{
sysinfo_set_pref_real (key, value, DEFAULT_ANNOUNCE);
return;
}
#ifdef HAVE_LIBPCI
else if (!strcmp (key, "pciids"))
{
if (value && value[0])
{
hexchat_pluginpref_set_str (ph, "pciids", value);
hexchat_printf (ph, _("Sysinfo: pciids is set to: %s\n"), value);
}
else
{
char buf[512];
if (hexchat_pluginpref_get_str (ph, "pciids", buf) == 0)
strcpy (buf, DEFAULT_PCIIDS);
hexchat_printf (ph, _("Sysinfo: pciids is set to: %s\n"), buf);
}
return;
}
#endif
else if (g_str_has_prefix (key, "hide_"))
{
int i;
for (i = 0; hwinfos[i].name != NULL; i++)
{
if (!strcmp (key + 5, hwinfos[i].name))
{
sysinfo_set_pref_real (key, value, hwinfos[i].def);
return;
}
}
}
hexchat_print (ph, _("Sysinfo: Invalid variable name\n"));
}
static int
sysinfo_cb (char *word[], char *word_eol[], void *userdata)
{
gboolean announce = sysinfo_get_bool_pref("announce", DEFAULT_ANNOUNCE);
int offset = 0, channel_type;
char *cmd;
/* Allow overriding global announce setting */
if (!strcmp ("-e", word[2]))
{
announce = FALSE;
offset++;
}
else if (!strcmp ("-o", word[2]))
{
announce = TRUE;
offset++;
}
/* Cannot send to server tab */
channel_type = hexchat_list_int (ph, NULL, "type");
if (channel_type != 2 /* SESS_CHANNEL */ && channel_type != 3 /* SESS_DIALOG */)
announce = FALSE;
cmd = word[2+offset];
if (!g_ascii_strcasecmp ("SET", cmd))
sysinfo_set_pref (word[3+offset], word_eol[4+offset]);
else if (!cmd || !cmd[0])
print_summary (announce);
else
print_info (cmd, announce);
return HEXCHAT_EAT_ALL;
}
int
hexchat_plugin_init (hexchat_plugin *plugin_handle, char **plugin_name, char **plugin_desc, char **plugin_version, char *arg)
{
ph = plugin_handle;
*plugin_name = name;
*plugin_desc = desc;
*plugin_version = version;
hexchat_hook_command (ph, "SYSINFO", HEXCHAT_PRI_NORM, sysinfo_cb, sysinfo_help, NULL);
hexchat_command (ph, "MENU ADD \"Window/Send System Info\" \"SYSINFO\"");
hexchat_printf (ph, _("%s plugin loaded\n"), name);
return 1;
}
int
hexchat_plugin_deinit (void)
{
hexchat_command (ph, "MENU DEL \"Window/Display System Info\"");
hexchat_printf (ph, _("%s plugin unloaded\n"), name);
return 1;
}

View File

@ -1,416 +0,0 @@
/* HexChat
* Copyright (c) 2011-2012 Berke Viktor.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#include <stdio.h>
#include <windows.h>
#include <comutil.h>
#include <wbemidl.h>
#include "hexchat-plugin.h"
static hexchat_plugin *ph; /* plugin handle */
static char name[] = "SysInfo";
static char desc[] = "Display info about your hardware and OS";
static char version[] = "1.1";
static char helptext[] = "USAGE: /sysinfo - Sends info about your hardware and OS to current channel.";
static int firstRun;
static char *wmiOs;
static char *wmiCpu;
static char *wmiVga;
static int
getCpuArch (void)
{
OSVERSIONINFOEX osvi;
SYSTEM_INFO si;
osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFOEX);
GetVersionEx ((LPOSVERSIONINFOW) &osvi);
GetSystemInfo (&si);
if (si.wProcessorArchitecture == 9)
{
return 64;
}
else
{
return 86;
}
}
#if 0
/* use WMI instead, wProcessorArchitecture displays current binary arch instead of OS arch anyway */
static char *
getOsName (void)
{
static char winver[32];
double mhz;
OSVERSIONINFOEX osvi;
SYSTEM_INFO si;
osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFOEX);
GetVersionEx ((LPOSVERSIONINFOW) &osvi);
GetSystemInfo (&si);
strcpy (winver, "Windows ");
switch (osvi.dwMajorVersion)
{
case 5:
switch (osvi.dwMinorVersion)
{
case 1:
strcat (winver, "XP");
break;
case 2:
if (osvi.wProductType == VER_NT_WORKSTATION)
{
strcat (winver, "XP x64 Edition");
}
else
{
if (GetSystemMetrics(SM_SERVERR2) == 0)
{
strcat (winver, "Server 2003");
}
else
{
strcat (winver, "Server 2003 R2");
}
}
break;
}
break;
case 6:
switch (osvi.dwMinorVersion)
{
case 0:
if (osvi.wProductType == VER_NT_WORKSTATION)
{
strcat (winver, "Vista");
}
else
{
strcat (winver, "Server 2008");
}
break;
case 1:
if (osvi.wProductType == VER_NT_WORKSTATION)
{
strcat (winver, "7");
}
else
{
strcat (winver, "Server 2008 R2");
}
break;
case 2:
if (osvi.wProductType == VER_NT_WORKSTATION)
{
strcat (winver, "8");
}
else
{
strcat (winver, "8 Server");
}
break;
}
break;
}
if (si.wProcessorArchitecture == 9)
{
strcat (winver, " (x64)");
}
else
{
strcat (winver, " (x86)");
}
return winver;
}
/* x86-only, SDK-only, use WMI instead */
static char *
getCpuName (void)
{
// Get extended ids.
unsigned int nExIds;
unsigned int i;
int CPUInfo[4] = {-1};
static char CPUBrandString[128];
__cpuid (CPUInfo, 0x80000000);
nExIds = CPUInfo[0];
/* Get the information associated with each extended ID. */
for (i=0x80000000; i <= nExIds; ++i)
{
__cpuid (CPUInfo, i);
if (i == 0x80000002)
{
memcpy (CPUBrandString, CPUInfo, sizeof (CPUInfo));
}
else if (i == 0x80000003)
{
memcpy( CPUBrandString + 16, CPUInfo, sizeof (CPUInfo));
}
else if (i == 0x80000004)
{
memcpy (CPUBrandString + 32, CPUInfo, sizeof (CPUInfo));
}
}
return CPUBrandString;
}
#endif
static char *
getCpuMhz (void)
{
HKEY hKey;
int result;
int data;
int dataSize;
double cpuspeed;
static char buffer[16];
const char *cpuspeedstr;
if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, TEXT("Hardware\\Description\\System\\CentralProcessor\\0"), 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS)
{
dataSize = sizeof (data);
result = RegQueryValueEx (hKey, TEXT("~MHz"), 0, 0, (LPBYTE)&data, (LPDWORD)&dataSize);
RegCloseKey (hKey);
if (result == ERROR_SUCCESS)
{
cpuspeed = ( data > 1000 ) ? data / 1000 : data;
cpuspeedstr = ( data > 1000 ) ? "GHz" : "MHz";
sprintf (buffer, "%.2f %s", cpuspeed, cpuspeedstr);
}
}
return buffer;
}
static char *
getMemoryInfo (void)
{
static char buffer[32];
MEMORYSTATUSEX meminfo;
meminfo.dwLength = sizeof (meminfo);
GlobalMemoryStatusEx (&meminfo);
sprintf (buffer, "%I64d MB Total (%I64d MB Free)", meminfo.ullTotalPhys / 1024 / 1024, meminfo.ullAvailPhys / 1024 / 1024);
return buffer;
}
static char *
getWmiInfo (int mode)
{
/* for more details about this wonderful API, see
http://msdn.microsoft.com/en-us/site/aa394138
http://msdn.microsoft.com/en-us/site/aa390423
http://msdn.microsoft.com/en-us/library/windows/desktop/aa394138%28v=vs.85%29.aspx
http://social.msdn.microsoft.com/forums/en-US/vcgeneral/thread/d6420012-e432-4964-8506-6f6b65e5a451
*/
char *buffer = (char *) malloc (128);
HRESULT hres;
HRESULT hr;
IWbemLocator *pLoc = NULL;
IWbemServices *pSvc = NULL;
IEnumWbemClassObject *pEnumerator = NULL;
IWbemClassObject *pclsObj;
ULONG uReturn = 0;
hres = CoInitializeEx (0, COINIT_APARTMENTTHREADED | COINIT_SPEED_OVER_MEMORY);
if (FAILED (hres))
{
strcpy (buffer, "Error Code 0");
return buffer;
}
hres = CoInitializeSecurity (NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);
/* mysteriously failing after the first execution, but only when used as a plugin, skip it */
/*if (FAILED (hres))
{
CoUninitialize ();
strcpy (buffer, "Error Code 1");
return buffer;
}*/
hres = CoCreateInstance (CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &pLoc);
if (FAILED (hres))
{
CoUninitialize ();
strcpy (buffer, "Error Code 2");
return buffer;
}
hres = pLoc->ConnectServer (_bstr_t (L"root\\CIMV2"), NULL, NULL, 0, NULL, 0, 0, &pSvc);
if (FAILED (hres))
{
pLoc->Release ();
CoUninitialize ();
strcpy (buffer, "Error Code 3");
return buffer;
}
hres = CoSetProxyBlanket (pSvc, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE);
if (FAILED (hres))
{
pSvc->Release ();
pLoc->Release ();
CoUninitialize ();
strcpy (buffer, "Error Code 4");
return buffer;
}
switch (mode)
{
case 0:
hres = pSvc->ExecQuery (_bstr_t ("WQL"), _bstr_t ("SELECT * FROM Win32_OperatingSystem"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator);
break;
case 1:
hres = pSvc->ExecQuery (_bstr_t ("WQL"), _bstr_t ("SELECT * FROM Win32_Processor"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator);
break;
case 2:
hres = pSvc->ExecQuery (_bstr_t ("WQL"), _bstr_t ("SELECT * FROM Win32_VideoController"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator);
break;
}
if (FAILED (hres))
{
pSvc->Release ();
pLoc->Release ();
CoUninitialize ();
strcpy (buffer, "Error Code 5");
return buffer;
}
while (pEnumerator)
{
hr = pEnumerator->Next (WBEM_INFINITE, 1, &pclsObj, &uReturn);
if (0 == uReturn)
{
break;
}
VARIANT vtProp;
switch (mode)
{
case 0:
hr = pclsObj->Get (L"Caption", 0, &vtProp, 0, 0);
break;
case 1:
hr = pclsObj->Get (L"Name", 0, &vtProp, 0, 0);
break;
case 2:
hr = pclsObj->Get (L"Name", 0, &vtProp, 0, 0);
break;
}
WideCharToMultiByte (CP_ACP, 0, vtProp.bstrVal, -1, buffer, SysStringLen (vtProp.bstrVal)+1, NULL, NULL);
VariantClear (&vtProp);
}
pSvc->Release ();
pLoc->Release ();
pEnumerator->Release ();
pclsObj->Release ();
CoUninitialize ();
return buffer;
}
static int
printInfo (char *word[], char *word_eol[], void *user_data)
{
/* query WMI info only at the first time SysInfo is called, then cache it to save time */
if (firstRun)
{
hexchat_printf (ph, "%s first execution, querying and caching WMI info...\n", name);
wmiOs = getWmiInfo (0);
wmiCpu = getWmiInfo (1);
wmiVga = getWmiInfo (2);
firstRun = 0;
}
if (hexchat_list_int (ph, NULL, "type") >= 2)
{
/* uptime will work correctly for up to 50 days, should be enough */
hexchat_commandf (ph, "ME ** SysInfo ** Client: HexChat %s (x%d) ** OS: %s ** CPU: %s (%s) ** RAM: %s ** VGA: %s ** Uptime: %.2f Hours **",
hexchat_get_info (ph, "version"),
getCpuArch (),
wmiOs,
wmiCpu,
getCpuMhz (),
getMemoryInfo (),
wmiVga, (float) GetTickCount() / 1000 / 60 / 60);
}
else
{
hexchat_printf (ph, " * Client: HexChat %s (x%d)\n", hexchat_get_info (ph, "version"), getCpuArch ());
hexchat_printf (ph, " * OS: %s\n", wmiOs);
hexchat_printf (ph, " * CPU: %s (%s)\n", wmiCpu, getCpuMhz ());
hexchat_printf (ph, " * RAM: %s\n", getMemoryInfo ());
hexchat_printf (ph, " * VGA: %s\n", wmiVga);
hexchat_printf (ph, " * Uptime: %.2f Hours\n", (float) GetTickCount() / 1000 / 60 / 60);
}
return HEXCHAT_EAT_HEXCHAT;
}
int
hexchat_plugin_init (hexchat_plugin *plugin_handle, char **plugin_name, char **plugin_desc, char **plugin_version, char *arg)
{
ph = plugin_handle;
*plugin_name = name;
*plugin_desc = desc;
*plugin_version = version;
firstRun = 1;
hexchat_hook_command (ph, "SYSINFO", HEXCHAT_PRI_NORM, printInfo, helptext, NULL);
hexchat_command (ph, "MENU -ishare\\system.png ADD \"Window/Send System Info\" \"SYSINFO\"");
hexchat_printf (ph, "%s plugin loaded\n", name);
return 1; /* return 1 for success */
}
int
hexchat_plugin_deinit (void)
{
hexchat_command (ph, "MENU DEL \"Window/Display System Info\"");
hexchat_printf (ph, "%s plugin unloaded\n", name);
return 1;
}

View File

@ -1,6 +1,6 @@
/*
* hwmon.h - Hardware monitoring header for X-Sys
* Copyright (C) 2005 Tony Vroon
* SysInfo - sysinfo plugin for HexChat
* Copyright (c) 2015 Patrick Griffis.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -18,11 +18,12 @@
*/
#ifndef _HWMON_H_
#define _HWMON_H_
#ifndef SYSINFO_H
#define SYSINFO_H
int hwmon_chip_present();
void get_hwmon_chip_name(char *name);
void get_hwmon_temp(unsigned int *value, unsigned int *sensor);
#define bsize 1024
#define DEFAULT_PCIIDS "/usr/share/hwdata/pci.ids"
int sysinfo_get_str_pref (const char *name, char *dest);
#endif

View File

@ -1,7 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Label="Configuration">
<PlatformToolset>v120</PlatformToolset>
<PlatformToolset>v140</PlatformToolset>
<ConfigurationType>DynamicLibrary</ConfigurationType>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Release|Win32">
@ -19,91 +21,51 @@
<RootNamespace>sysinfo</RootNamespace>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="..\..\win32\hexchat.props" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="..\..\win32\hexchat.props" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="..\..\win32\hexchat.props" />
<PropertyGroup>
<TargetName>hcsysinfo</TargetName>
<OutDir>$(HexChatBin)</OutDir>
<IntDir>$(HexChatObj)$(ProjectName)\</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental>
<TargetName>hcsysinfo</TargetName>
<OutDir>$(HexChatBin)</OutDir>
<IntDir>$(HexChatObj)$(ProjectName)\</IntDir>
<OutDir>$(HexChatRel)plugins\</OutDir>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<PrecompiledHeader>
</PrecompiledHeader>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;SYSINFO_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>..\..\src\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<AdditionalIncludeDirectories>..\..\src\common;$(DepsRoot)\include;$(Glib);$(HexChatLib);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<TreatWChar_tAsBuiltInType>false</TreatWChar_tAsBuiltInType>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<ModuleDefinitionFile>sysinfo.def</ModuleDefinitionFile>
<AdditionalDependencies>wbemuuid.lib;comsupp.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(DepsRoot)\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>$(HexChatLib)common.lib;wbemuuid.lib;comsupp.lib;$(DepLibs);%(AdditionalDependencies)</AdditionalDependencies>
<IgnoreSpecificDefaultLibraries>comsupp.lib</IgnoreSpecificDefaultLibraries>
<ModuleDefinitionFile>sysinfo.def</ModuleDefinitionFile>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<PrecompiledHeader>
</PrecompiledHeader>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;_WIN64;_AMD64_;NDEBUG;_WINDOWS;_USRDLL;SYSINFO_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>..\..\src\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<AdditionalIncludeDirectories>..\..\src\common;$(DepsRoot)\include;$(Glib);$(HexChatLib);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<TreatWChar_tAsBuiltInType>false</TreatWChar_tAsBuiltInType>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<ModuleDefinitionFile>sysinfo.def</ModuleDefinitionFile>
<AdditionalDependencies>wbemuuid.lib;comsupp.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(DepsRoot)\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>$(HexChatLib)common.lib;wbemuuid.lib;comsupp.lib;$(DepLibs);%(AdditionalDependencies)</AdditionalDependencies>
<IgnoreSpecificDefaultLibraries>comsupp.lib</IgnoreSpecificDefaultLibraries>
<ModuleDefinitionFile>sysinfo.def</ModuleDefinitionFile>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<None Include="sysinfo.def" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="sysinfo.cpp" />
<ClCompile Include="format.c" />
<ClCompile Include="sysinfo.c" />
<ClCompile Include="win32\backend.c" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="format.h" />
<ClInclude Include="sysinfo-backend.h" />
<ClInclude Include="sysinfo.h" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View File

@ -9,6 +9,9 @@
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{c873eb6b-aca6-434d-8ec9-199838b80838}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<None Include="sysinfo.def">
@ -16,8 +19,25 @@
</None>
</ItemGroup>
<ItemGroup>
<ClCompile Include="sysinfo.cpp">
<ClCompile Include="sysinfo.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="win32\backend.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="format.c">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="sysinfo.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="sysinfo-backend.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="format.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
</Project>

View File

@ -0,0 +1,170 @@
/*
* SysInfo - sysinfo plugin for HexChat
* Copyright (c) 2015 Patrick Griffis.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <glib.h>
#include "parse.h"
#include "match.h"
#include "sysinfo.h"
#include "format.h"
#include "df.h"
char *sysinfo_backend_get_os(void)
{
char name[bsize];
if (xs_parse_distro (name) != 0)
{
return NULL;
}
return g_strdup(name);
}
char *sysinfo_backend_get_disk(void)
{
gint64 total, free;
if (xs_parse_df (&total, &free))
{
return NULL;
}
return sysinfo_format_disk (total, free);
}
char *sysinfo_backend_get_memory(void)
{
unsigned long long mem_total;
unsigned long long mem_free;
unsigned long long swap_total;
unsigned long long swap_free;
char *swap_fmt = NULL, *mem_fmt, *ret;
if (xs_parse_meminfo (&mem_total, &mem_free, 0) == 1)
{
return NULL;
}
if (xs_parse_meminfo (&swap_total, &swap_free, 1) != 1)
{
swap_fmt = sysinfo_format_memory (swap_total, swap_free);
}
mem_fmt = sysinfo_format_memory (mem_total, mem_free);
if (swap_fmt)
{
ret = g_strdup_printf ("Physical: %s Swap: %s", mem_fmt, swap_fmt);
g_free (mem_fmt);
g_free (swap_fmt);
}
else
ret = mem_fmt;
return ret;
}
char *sysinfo_backend_get_cpu(void)
{
char model[bsize];
char vendor[bsize];
char buffer[bsize];
double freq;
int giga = 0;
if (xs_parse_cpu (model, vendor, &freq) != 0)
{
return NULL;
}
if (freq > 1000)
{
freq /= 1000;
giga = 1;
}
if (giga)
{
g_snprintf (buffer, bsize, "%s (%.2fGHz)", model, freq);
}
else
{
g_snprintf (buffer, bsize, "%s (%.0fMHz)", model, freq);
}
return g_strdup (buffer);
}
char *sysinfo_backend_get_gpu(void)
{
char vid_card[bsize];
char agp_bridge[bsize];
char buffer[bsize];
int ret;
if ((ret = xs_parse_video (vid_card)) != 0)
{
return NULL;
}
if (xs_parse_agpbridge (agp_bridge) != 0)
{
g_snprintf (buffer, bsize, "%s", vid_card);
}
else
{
g_snprintf (buffer, bsize, "%s @ %s", vid_card, agp_bridge);
}
return g_strdup (buffer);
}
char *sysinfo_backend_get_sound(void)
{
char sound[bsize];
if (xs_parse_sound (sound) != 0)
{
return NULL;
}
return g_strdup (sound);
}
char *sysinfo_backend_get_uptime(void)
{
gint64 uptime;
if ((uptime = xs_parse_uptime ()) == 0)
{
return NULL;
}
return sysinfo_format_uptime (uptime);
}
char *sysinfo_backend_get_network(void)
{
char ethernet_card[bsize];
if (xs_parse_ether (ethernet_card))
{
g_strlcpy (ethernet_card, "None found", bsize);
}
return g_strdup (ethernet_card);
}

View File

@ -0,0 +1,98 @@
/*
* match.c - matching functions for X-Sys
* Copyright (C) 2005, 2006, 2007 Tony Vroon
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <glib.h>
#include "sysinfo.h"
#define delims ":="
void find_match_char(char *buffer, char *match, char *result)
{
char *position;
g_strchug(buffer);
if(strstr(buffer, match) == strstr(buffer, buffer))
{
position = strpbrk(buffer, delims);
if (position != NULL)
{
position += 1;
strcpy(result, position);
position = strstr(result, "\n");
*(position) = '\0';
g_strchug(result);
}
else
strcpy(result, "\0");
}
}
void find_match_double(char *buffer, char *match, double *result)
{
char *position;
g_strchug(buffer);
if(strstr(buffer, match) == strstr(buffer, buffer))
{
position = strpbrk(buffer, delims);
if (position != NULL)
{
position += 1;
*result = strtod(position, NULL);
}
else
*result = 0;
}
}
void find_match_double_hex(char *buffer, char *match, double *result)
{
char *position;
g_strchug(buffer);
if(strstr(buffer, match) == strstr(buffer, buffer))
{
position = strpbrk(buffer, delims);
if (position != NULL)
{
memcpy(position,"0x",2);
*result = strtod(position,NULL);
}
else
*result = 0;
}
}
void find_match_ll(char *buffer, char *match, unsigned long long *result)
{
char *position;
g_strchug(buffer);
if(strstr(buffer, match) == strstr(buffer, buffer))
{
position = strpbrk(buffer, delims);
if (position != NULL)
{
position += 1;
*result = strtoll(position, NULL, 10);
}
else
*result = 0;
}
}

View File

@ -23,13 +23,7 @@
void find_match_char(char *buffer, char *match, char *result);
void find_match_double(char *buffer, char *match, double *result);
void find_match_double_hex(char *buffer, char *match, double *result);
void find_match_int(char *buffer, char *match, unsigned int *result);
void find_match_ll(char *buffer, char *match, unsigned long long *result);
void format_output(const char *arg, char *string, char *format);
void flat_format_output(const char *arg, char *string, char *format);
float percentage(unsigned long long *free, unsigned long long *total);
char *pretty_freespace(const char *desc, unsigned long long *free_k, unsigned long long *total_k);
void remove_leading_whitespace(char *buffer);
char *decruft_filename(char *buffer);
#endif

View File

@ -0,0 +1,315 @@
/*
* parse.c - parsing functions for X-Sys
* by mike9010
* Copyright (C) 2003, 2004, 2005 Michael Shoup
* Copyright (C) 2005, 2006, 2007 Tony Vroon
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <pci/header.h>
#include <glib.h>
#ifdef __sparc__
#include <dirent.h>
#endif
#include "pci.h"
#include "match.h"
#include "parse.h"
#include "sysinfo.h"
int xs_parse_cpu(char *model, char *vendor, double *freq)
{
#if defined(__i386__) || defined(__x86_64__) || defined(__powerpc__) || defined(__alpha__) || defined(__ia64__) || defined(__parisc__) || defined(__sparc__)
char buffer[bsize];
#endif
FILE *fp;
fp = fopen("/proc/cpuinfo", "r");
if(fp == NULL)
return 1;
#if defined(__i386__) || defined(__x86_64__)
while(fgets(buffer, bsize, fp) != NULL)
{
find_match_char(buffer, "model name", model);
find_match_char(buffer, "vendor_id", vendor);
find_match_double(buffer, "cpu MHz", freq);
}
#elif defined(__powerpc__)
{
char *pos;
while(fgets(buffer, bsize, fp) != NULL)
{
find_match_char(buffer, "cpu", model);
find_match_char(buffer, "machine", vendor);
find_match_double(buffer, "clock", freq);
}
pos = strstr(model, ",");
if (pos != NULL)
*pos = '\0';
}
#elif defined( __alpha__)
while(fgets(buffer, bsize, fp) != NULL)
{
find_match_char(buffer, "cpu model", model);
find_match_char(buffer, "system type", vendor);
find_match_double(buffer, "cycle frequency [Hz]", freq);
}
*freq = *freq / 1000000;
#elif defined(__ia64__)
while(fgets(buffer, bsize, fp) != NULL)
{
find_match_char(buffer, "model", model);
find_match_char(buffer, "vendor", vendor);
find_match_double(buffer, "cpu MHz", freq);
}
#elif defined(__parisc__)
while(fgets(buffer, bsize, fp) != NULL)
{
find_match_char(buffer, "cpu ", model);
find_match_char(buffer, "cpu family", vendor);
find_match_double(buffer, "cpu MHz", freq);
}
#elif defined(__sparc__)
{
DIR *dir;
struct dirent *entry;
FILE *fp2;
while(fgets(buffer, bsize, fp) != NULL)
{
find_match_char(buffer, "cpu ", model);
find_match_char(buffer, "type ", vendor);
find_match_double_hex(buffer, "Cpu0ClkTck", freq);
}
*freq = *freq / 1000000;
}
#else
fclose(fp);
return 1; /* Unsupported */
#endif
fclose(fp);
return 0;
}
gint64 xs_parse_uptime(void)
{
char buffer[bsize];
gint64 uptime = 0;
FILE *fp = fopen("/proc/uptime", "r");
if(fp == NULL)
return 0;
if(fgets(buffer, bsize, fp) != NULL)
uptime = g_ascii_strtoll(buffer, NULL, 0);
fclose(fp);
return uptime;
}
int xs_parse_sound(char *snd_card)
{
char buffer[bsize], cards[bsize] = "\0", vendor[7] = "\0", device[7] = "\0", *pos;
u16 class = PCI_CLASS_MULTIMEDIA_AUDIO;
FILE *fp = NULL;
if((fp = fopen("/proc/asound/cards", "r"))== NULL)
{
if (pci_find_by_class(&class, vendor, device) == 0)
{
pci_find_fullname(snd_card, vendor, device);
return 0;
}
else
return 1;
}
while(fgets(buffer, bsize, fp) != NULL)
{
if(isdigit(buffer[0]) || isdigit(buffer[1]))
{
char card_buf[bsize];
gint64 card_id = 0;
pos = strstr(buffer, ":");
card_id = g_ascii_strtoll(buffer, NULL, 0);
if (card_id == 0)
g_snprintf(card_buf, bsize, "%s", pos+2);
else
g_snprintf(card_buf, bsize, "%"G_GINT64_FORMAT": %s", card_id, pos+2);
pos = strstr(card_buf, "\n");
*pos = '\0';
strcat(cards, card_buf);
}
}
strcpy(snd_card, cards);
fclose(fp);
return 0;
}
int xs_parse_video(char *vid_card)
{
char vendor[7] = "\0", device[7] = "\0";
u16 class = PCI_CLASS_DISPLAY_VGA;
if (pci_find_by_class(&class, vendor, device))
return 1;
else
pci_find_fullname(vid_card, vendor, device);
return 0;
}
int xs_parse_ether(char *ethernet_card)
{
char vendor[7] = "\0", device[7] = "\0";
u16 class = PCI_CLASS_NETWORK_ETHERNET;
if (pci_find_by_class(&class, vendor, device))
return 1;
else
pci_find_fullname(ethernet_card, vendor, device);
return 0;
}
int xs_parse_agpbridge(char *agp_bridge)
{
char vendor[7] = "\0", device[7] = "\0";
u16 class = PCI_CLASS_BRIDGE_HOST;
if (pci_find_by_class(&class, vendor, device))
return 1;
else
pci_find_fullname(agp_bridge, vendor, device);
return 0;
}
int xs_parse_meminfo(unsigned long long *mem_tot, unsigned long long *mem_free, int swap)
{
FILE *fp;
char buffer[bsize];
unsigned long long freemem = 0, buffers = 0, cache = 0;
*mem_tot = 0;
*mem_free = 0;
if((fp = fopen("/proc/meminfo", "r")) == NULL)
return 1;
while(fgets(buffer, bsize, fp) != NULL)
{
if(!swap)
{
find_match_ll(buffer, "MemTotal:", mem_tot);
find_match_ll(buffer, "MemFree:", &freemem);
find_match_ll(buffer, "Buffers:", &buffers);
find_match_ll(buffer, "Cached:", &cache);
}
else
{
find_match_ll(buffer, "SwapTotal:", mem_tot);
find_match_ll(buffer, "SwapFree:", mem_free);
}
}
if (!swap)
{
*mem_free = freemem + buffers + cache;
}
fclose(fp);
/* Convert to bytes */
*mem_free *= 1000;
*mem_tot *= 1000;
return 0;
}
int xs_parse_distro(char *name)
{
FILE *fp = NULL;
char buffer[bsize], *pos = NULL;
if((fp = fopen("/etc/portage/make.conf", "r")) != NULL ||
(fp = fopen("/etc/make.conf", "r")) != NULL)
{
char keywords[bsize];
while(fgets(buffer, bsize, fp) != NULL)
find_match_char(buffer, "ACCEPT_KEYWORDS", keywords);
/* cppcheck-suppress uninitvar */
if (strstr(keywords, "\"") == NULL)
g_snprintf(buffer, bsize, "Gentoo Linux (stable)");
else
g_snprintf(buffer, bsize, "Gentoo Linux %s", keywords);
}
else if((fp = fopen("/etc/redhat-release", "r")) != NULL)
fgets(buffer, bsize, fp);
else if((fp = fopen("/etc/mageia-release", "r")) != NULL)
fgets(buffer, bsize, fp);
else if((fp = fopen("/etc/slackware-version", "r")) != NULL)
fgets(buffer, bsize, fp);
else if((fp = fopen("/etc/mandrake-release", "r")) != NULL)
fgets(buffer, bsize, fp);
else if((fp = fopen("/etc/SuSE-release", "r")) != NULL)
fgets(buffer, bsize, fp);
else if((fp = fopen("/etc/turbolinux-release", "r")) != NULL)
fgets(buffer, bsize, fp);
else if((fp = fopen("/etc/arch-release", "r")) != NULL)
g_snprintf(buffer, bsize, "ArchLinux");
else if((fp = fopen("/etc/lsb-release", "r")) != NULL)
{
char id[bsize], codename[bsize], release[bsize];
strcpy(id, "?");
strcpy(codename, "?");
strcpy(release, "?");
while(fgets(buffer, bsize, fp) != NULL)
{
find_match_char(buffer, "DISTRIB_ID", id);
find_match_char(buffer, "DISTRIB_CODENAME", codename);
find_match_char(buffer, "DISTRIB_RELEASE", release);
}
g_snprintf(buffer, bsize, "%s \"%s\" %s", id, codename, release);
}
else if((fp = fopen("/etc/debian_version", "r")) != NULL)
{
char release[bsize];
fgets(release, bsize, fp);
g_snprintf(buffer, bsize, "Debian %s", release);
}
else
g_snprintf(buffer, bsize, "Unknown Distro");
if(fp != NULL)
fclose(fp);
pos=strchr(buffer, '\n');
if(pos != NULL)
*pos = '\0';
strcpy(name, buffer);
return 0;
}

View File

@ -23,18 +23,13 @@
#ifndef _PARSE_H_
#define _PARSE_H_
int xs_parse_cpu(char *model, char *vendor, double *freq, char *cache, unsigned int *count);
int xs_parse_uptime(int *weeks, int *days, int *hours, int *minutes, int *seconds);
int xs_parse_os(char *user, char *host, char *kernel);
int xs_parse_cpu(char *model, char *vendor, double *freq);
gint64 xs_parse_uptime(void);
int xs_parse_sound(char *snd_card);
int xs_parse_netdev(const char *device, unsigned long long *bytes_recv, unsigned long long *bytes_sent);
int xs_parse_df(const char *mount_point, char *string);
int xs_parse_meminfo(unsigned long long *mem_tot, unsigned long long *mem_free, int swap);
int xs_parse_video(char *vid_card);
int xs_parse_agpbridge(char *agp_bridge);
int xs_parse_ether(char *ethernet_card);
int xs_parse_distro(char *name);
int xs_parse_hwmon_chip(char *chip);
int xs_parse_hwmon_temp(char *temp, unsigned int *sensor);
#endif

169
plugins/sysinfo/unix/pci.c Normal file
View File

@ -0,0 +1,169 @@
/*
* pci.c - PCI functions for X-Sys
* Copyright (C) 1997-1999 Martin Mares <mj@atrey.karlin.mff.cuni.cz> [PCI routines from lspci]
* Copyright (C) 2000 Tom Rini <trini@kernel.crashing.org> [XorgAutoConfig pci.c, based on lspci]
* Copyright (C) 2005, 2006 Tony Vroon
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <pci/pci.h>
#include <glib.h>
#include "sysinfo.h"
static struct pci_filter filter; /* Device filter */
static struct pci_access *pacc;
int bus, dev, func; /* Location of the card */
struct device {
struct device *next;
struct pci_dev *dev;
unsigned int config_cnt;
u8 config[256];
};
static struct device *first_dev;
static struct device *scan_device(struct pci_dev *p)
{
int how_much = 64;
struct device *d;
if (!pci_filter_match(&filter, p))
return NULL;
d = g_new0 (struct device, 1);
d->dev = p;
if (!pci_read_block(p, 0, d->config, how_much))
exit(1);
if (how_much < 128 && (d->config[PCI_HEADER_TYPE] & 0x7f) == PCI_HEADER_TYPE_CARDBUS)
{
/* For cardbus bridges, we need to fetch 64 bytes more to get the full standard header... */
if (!pci_read_block(p, 64, d->config+64, 64))
exit(1);
how_much = 128;
}
d->config_cnt = how_much;
pci_setup_cache(p, d->config, d->config_cnt);
pci_fill_info(p, PCI_FILL_IDENT);
return d;
}
static void scan_devices(void)
{
struct device *d;
struct pci_dev *p;
pci_scan_bus(pacc);
for(p=pacc->devices; p; p=p->next)
{
if ((d = scan_device(p)))
{
d->next = first_dev;
first_dev = d;
}
}
}
static u16 get_conf_word(struct device *d, unsigned int pos)
{
return d->config[pos] | (d->config[pos+1] << 8);
}
int pci_find_by_class(u16 *class, char *vendor, char *device)
{
struct device *d;
struct pci_dev *p;
int nomatch = 1;
pacc = pci_alloc();
pci_filter_init(pacc, &filter);
pci_init(pacc);
scan_devices();
for(d=first_dev; d; d=d->next)
{
p = d->dev;
/* Acquire vendor & device ID if the class matches */
if(get_conf_word(d, PCI_CLASS_DEVICE) == *class)
{
nomatch = 0;
g_snprintf(vendor,7,"%04x",p->vendor_id);
g_snprintf(device,7,"%04x",p->device_id);
break;
}
}
pci_cleanup(pacc);
return nomatch;
}
void pci_find_fullname(char *fullname, char *vendor, char *device)
{
char buffer[bsize];
char vendorname[bsize/2] = "";
char devicename[bsize/2] = "";
char *position;
int cardfound = 0;
FILE *fp;
if (!sysinfo_get_str_pref ("pciids", buffer))
strcpy (buffer, DEFAULT_PCIIDS);
fp = fopen (buffer, "r");
if(fp == NULL)
{
g_snprintf(fullname, bsize, "%s:%s", vendor, device);
//sysinfo_print_error ("pci.ids file not found! You might want to adjust your pciids setting with /SYSINFO SET pciids (you can query its current value with /SYSINFO LIST).\n");
return;
}
while(fgets(buffer, bsize, fp) != NULL)
{
if (!isspace(buffer[0]) && strstr(buffer, vendor) != NULL)
{
position = strstr(buffer, vendor);
position += 6;
strncpy(vendorname, position, bsize/2);
position = strstr(vendorname, "\n");
*(position) = '\0';
break;
}
}
while(fgets(buffer, bsize, fp) != NULL)
{
if(strstr(buffer, device) != NULL)
{
position = strstr(buffer, device);
position += 6;
strncpy(devicename, position, bsize/2);
position = strstr(devicename, " (");
if (position == NULL)
position = strstr(devicename, "\n");
*(position) = '\0';
cardfound = 1;
break;
}
}
if (cardfound == 1)
g_snprintf(fullname, bsize, "%s %s", vendorname, devicename);
else
g_snprintf(fullname, bsize, "%s:%s", vendor, device);
fclose(fp);
}

View File

@ -0,0 +1,117 @@
/* HexChat
* Copyright (c) 2011-2012 Berke Viktor.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#include <stdio.h>
#include <windows.h>
#include <wbemidl.h>
#include <glib.h>
#include "../../../src/common/sysinfo/sysinfo.h"
#include "../format.h"
static int command_callback (char *word[], char *word_eol[], void *user_data);
void print_info (void);
guint64 hdd_capacity;
guint64 hdd_free_space;
char *read_hdd_info (IWbemClassObject *object);
char *get_memory_info (void);
char *
sysinfo_backend_get_sound (void)
{
return NULL;
}
char *
sysinfo_backend_get_network (void)
{
return NULL;
}
char *
sysinfo_backend_get_uptime (void)
{
return sysinfo_format_uptime (GetTickCount64 () / 1000);
}
char *
sysinfo_backend_get_disk (void)
{
guint64 hdd_capacity;
guint64 hdd_free_space;
sysinfo_get_hdd_info (&hdd_capacity, &hdd_free_space);
if (hdd_capacity != 0)
{
return sysinfo_format_disk(hdd_capacity, hdd_free_space);
}
return NULL;
}
char *
sysinfo_backend_get_cpu (void)
{
return sysinfo_get_cpu ();
}
char *
sysinfo_backend_get_memory (void)
{
/* Memory information is always loaded dynamically since it includes the current amount of free memory */
return get_memory_info ();
}
char *
sysinfo_backend_get_gpu (void)
{
return sysinfo_get_gpu ();
}
char *
sysinfo_backend_get_os (void)
{
return sysinfo_get_os ();
}
static int get_cpu_arch (void)
{
return sysinfo_get_cpu_arch ();
}
static char *get_memory_info (void)
{
MEMORYSTATUSEX meminfo = { 0 };
meminfo.dwLength = sizeof (meminfo);
if (!GlobalMemoryStatusEx (&meminfo))
{
return NULL;
}
return sysinfo_format_memory (meminfo.ullTotalPhys, meminfo.ullAvailPhys);
}

View File

@ -1,116 +0,0 @@
v2.2.0
* (Thomas Cort) Report L2 cache info for Alpha CPUs
* (Tony Vroon) Drop XMMS, port audacious features to D-Bus, make dependency mandatory
* (Tony Vroon) Use pretty_freespace for memory & swap reporting as well as disk space
* (Tony Vroon) Make pretty_freespace report none if total_size is 0, thanks to Emopig <andrew@nelless.net> for the report
* (Tony Vroon) Make pretty_freespace aware of terabytes, petabytes, exabytes, zettabytes & yottabytes
* (Tony Vroon) Remove xchatdirfs workaround
v2.1.0
Removals & pending removal:
* (Tony Vroon) Remove support for BMP, it is an abandoned project. Suggested upgrade path: audacious
* (Tony Vroon) Remove /uname & /euname; the OS part of sysinfo displays similar info without requiring a process pipe
* (Tony Vroon) Added a note that the xchatdirfs workaround is due for removal as X-Chat Gnome has fixed the bug
Bugfixes:
* (Tony Vroon) Actually show the vendor that we retrieve in cpuinfo
* (Tony Vroon) Display Gentoo Linux as stable or ~arch, the baselayout version doesn't really interest anyone
* (Tony Vroon) Match framework: Make remove_leading_whitespace actually work
* (Tony Vroon) Match framework: Do not assume that a delimiter is always followed by a space
Code improvements:
* (Tony Vroon) PCI framework: We were requesting more info then we actually return to the caller
* (Tony Vroon) Match framework: Consolidate delimiters in a single define & use 1 strpbrk instead of 2 strstr's
* (Tony Vroon) Display the machine string instead of the pmac-generation as vendor info for PPC machines
New features
* (Tony Vroon) Show memory capacity in gigabytes instead of in megabytes when appropriate
* (Tony Vroon) Cut cpu name at comma (so overly long other info such as "altivec supported" is no longer displayed)
* (Tony Vroon) Now Playing: Report time played as well as the song length
* (Tony Vroon) Now Playing: Support reporting as an action; configurable at runtime
* (Tony Vroon) Check LSB release data, prefer above all others; based on a code sample submitted by Thomas Winwood
v2.0.9
* (Tony Vroon) Protect the matching framework against spurious matches (bug reported by Harm Geerts)
* (Tony Vroon) Unexporting unnecessary symbols for PCI framework
* (Tony Vroon) Deal with incompatible header changes in pciutils
* (Tony Vroon) Begin implementing hardware monitoring support, not yet activated
* (Tony Vroon) Add support for Audacious, a BMP fork
v2.0.8
* (Tony Vroon) Make XMMS interface actually work, thanks to a patch from Morten Cools
* (Tony Vroon) Use percentages for df information as well
* (Gustavo Zacarias) Add support for Sparc architecture, cache size detection on sparc64 only
* (Gustavo Zacarias) Consolidate buffer sizes into a single define
v2.0.7
* (Tony Vroon) Have df parser ignore pseudo-filesystems; deal with other locales more gracefully
* (Tony Vroon) Change default formatstring not to use mIRC color codes
* (Tony Vroon) Add fallback to ~/.xchat2 for xchat-gnome which does not report xchatdirfs properly
* (Tony Vroon) Revert to beepctrl.h style calls as infopipe is too unreliable
v2.0.6
* (Tony Vroon) Rewrote PCI framework, no longer depends on sysfs, kernel 2.4 and lower will work now
* (Tony Vroon) Made percentages configurable, can be set at runtime (feature request by Halcy0n)
* (Tony Vroon) Abstract out all pointer voodoo from xsys.c
* (Tony Vroon) Do not return XCHAT_EAT_NONE, causes spurious "unknown command" errors
* (Tony Vroon) Deal more gracefully with a missing soundcard or unknown linux distribution
* (Tony Vroon) Add error handling to the matching framework
v2.0.5
* (Tony Vroon) Added support for parisc/hppa & ia64 architectures
* (Tony Vroon) Proper report of L2 cache as "unknown" instead of showing bits of unitialized memory
* (Tony Vroon) Upped PCI parser yield for ppc64 architecture, has high bus number for AGP card
* (Tony Vroon) Use percentages in memory/swap information
v2.0.4
* (Tony Vroon) /sound uses ALSA if possible, PCI now fallback (false positives reported with PCI code)
* (Tony Vroon) Remove 0 prefix from first ALSA card; 1: and up will be shown for extra cards
* (Tony Vroon) Matching code rewritten and separated out from other code
* (Tony Vroon) Use new matching framework where possible
* (Tony Vroon) Added support for Alpha architecture, thanks to Bert (bert@ev6.net)
v2.0.3
* (Tony Vroon) Fix buttons, XMMS -> NP
* (Tony Vroon) PCI functions separated out from other code; fully rewritten
* (Tony Vroon) Use new PCI framework for sound detection; ALSA is now fallback
* (Tony Vroon) Implement /ether
* (Tony Vroon) /video now reports video card @ AGP bridge; resolution info dropped
v2.0.2
* (Tony Vroon) XMMS/BMP: Delete XMMS/BMP detection; it just got obsoleted by a BMP bugfix
* (Tony Vroon) XMMS/BMP: Change to /np & /enp as commands (np -> now playing)
* (Tony Vroon) Allow customization of now_playing with /playing
* (Tony Vroon) Separate out the length field for now_playing
* (Tony Vroon) Better configuration file handling
* (Tony Vroon) Set homepage to http://dev.gentoo.org/~chainsaw/xsys
* (Tony Vroon) Make channel buttons optional, not everyone appreciates them
* (Tony Vroon) Fix cpuinfo parsing on x86_64, a necessary define was missing
v2.0.1
* (Tony Vroon) XMMS/BMP: Report "stream" if song length is -1
* (Tony Vroon) XMMS/BMP: Determine whether XMMS or BMP is playing
* (Tony Vroon) Better errorhandling if pci.ids parsing fails; at least mention raw PCI ID of card
* (Tony Vroon) Remove AGP from video card messages; we detect plain PCI cards too
* (Tony Vroon) Fix Debian release detector
v2.0.0
* (mikeshoup) Clean up of code for 2.0.0 release
* (Tony Vroon) Added PowerPC /proc/cpuinfo support
* (Tony Vroon) Changed LSPCI to SYSFS
v1.9.3
* (mikeshoup) Introduced distro function
* (mikeshoup, Tony Vroon's suggestion) Removed bitrate from /XMMS
v1.9.2
* 2005/01/14 (mikeshoup) Put in the userlist buttons
* 2005/01/10 (mikeshoup) Added XMMS/BMP Support
v1.9.1
* 2004/12/20 (mikeshoup) Added a dynamic formatting scheme
* 2004/12/19 (mikeshoup) Changed some commands
* 2004/12/18 (mikeshoup) Reintroducted /VIDEO
v1.9.0
* 2004/12/17 (mikeshoup) Initial Release

View File

@ -1,15 +0,0 @@
INSTALLATION
============
Installation is straightforward. You need Audacious 1.4 or higher and D-Bus.
Open up the Makefile, check to make sure PCIIDS points to your pci.ids file.
(Symptom if you get it wrong: raw PCI ID's (XXXX:XXXX) emitted by /VIDEO and friends).
Run: make
Run: make install
Voila!
NOTES:
`make install' copies the compiled library (something like xsys-v.v.v.so) to
$HOME/.xchat2/xsys-plugin.so for autoloading. If $HOME/.xchat2/xsys-plugin.so
exists, it is removed first.

View File

@ -1,38 +0,0 @@
#### SET THIS VALUE TO THE LOCATION OF THE `pci.ids` file ####
PCIIDS = /usr/share/misc/pci.ids
#### UNCOMMENT THIS IF YOU WANT THE BUTTONS ####
#BUTTON = -Dbuttonbar
#### SHOULD NOT NEED TO EDIT BELOW THIS LINE ####
VER_MAJOR = 2
VER_MINOR = 2
VER_PATCH = 0
CC = gcc
CFLAGS += -O2 -Wall -fPIC
CFLAGS += -DVER_MINOR=$(VER_MINOR) -DVER_MAJOR=$(VER_MAJOR) -DVER_PATCH=$(VER_PATCH) \
-DVER_STRING=\"$(VER_MAJOR).$(VER_MINOR).$(VER_PATCH)\" -DPCIIDS=\"$(PCIIDS)\" $(BUTTON)
LDFLAGS = $(CFLAGS) -shared
LIBRARY = xsys-$(VER_MAJOR).$(VER_MINOR).$(VER_PATCH).so
OBJECTS = xsys.o parse.o pci.o match.o hwmon.o
ALL : $(LIBRARY)
$(LIBRARY) : $(OBJECTS)
$(CC) $(LDFLAGS) -o $(LIBRARY) $(OBJECTS) -lpci
xsys.o : xsys.c
parse.o : parse.c
pci.o : pci.c
match.o : match.c
hwmon.o : hwmon.c
.PHONY : clean
clean :
rm -rf *.o *.so *~
.PHONY : install
install : $(LIBRARY)
rm -f $(HOME)/.xchat2/xsys-plugin.so
cp ./$(LIBRARY) $(HOME)/.xchat2/xsys-plugin.so

View File

@ -1,105 +0,0 @@
X-Sys README
============
What is X-Sys?
X-Sys is a plugin for X-Chat that allows you to display your current system statistics in
a channel, private conversation or just in an echo to yourself for testing purposes.
It is supported on Linux, running on various architectures. Right now x86, ppc, ppc64, sparc,
sparc64 and alpha are supported, with parisc and ia64 implemented but awaiting testing.
---------------
Who wrote this?
X-Sys is originally a Mike Shoup creation, from the very first alpha releases to the open-source
version 1 releases. But then, things stalled. For a few months (more like a year almost)
Mike didn't work on X-Sys. The last version that had been written was 1.0.5.
The website was gone, and I (Tony) couldn't find Mike. So, I took over and improved it to my liking.
It turned out that Mike was still around, though, he contacted me and started development again,
now called version 2, a complete rewrite. Various 1.9 betas came out that I contributed patches to,
and starting with version 2.0.0 I'm maintaining xchat-xsys again, this time with Mike's blessing.
---------------
What do I need?
- X-Chat (regular or Gnome version)
- Audacious 1.4 or higher
- D-Bus (for communication with Audacious)
- a working toolchain (compiler, binutils, etc).
------------------------------------------------
What if I get errors about u8 not being defined?
Sorry to hear that, it appears your linux distribution neglected to install essential headers on your
system. On Debian & Ubuntu, apt-get install pciutils-dev should make it happy.
========
COMMANDS
X-Sys 2 has the following implemented commands:
/XSYS & /EXSYS - Output current version, either to channel or echoed on screen.
/CPUINFO & /ECPUINFO - Echoes or says current cpu statistics
/SYSUPTIME & /ESYSUPTIME - Echoes or says current uptime
/OSINFO & /EOSINFO - Echoes or says various OS statistics
/SOUND & /ESOUND - Echoes or says the current sound card, as determined by ALSA
/NETDATA & /ENETDATA - Echoes or says total amount transferred through a network
interface. Use like: `/netdata eth0' (where eth0 is a network interface)
/NETSTREAM & /ENETSTREAM - Echoes or says amount of bandwidth being used.
Use like: `/netstream eth0' (where eth0 is a network interface)
/DISKINFO & /EDISKINFO - Echoes or says free space on partitions. The DISK command has a
few arguments as follows:
ALL - Displays every partitions
/mount - Displays free space for that specific mount point
No arguments just displays total free space
/MEMINFO & /EMEMINFO - Echoes or says memory information.
/VIDEO & /EVIDEO - Echoes or says the current video card on the PCI bus
/ETHER & /EETHER - Echoes or says the current network card on the PCI bus
/DISTRO & /EDISTRO - Echoes or says which distro you're running
If this doesn't work for your distro, look for a *-release file or similar in /etc
E-mail this to chainsaw@gentoo.org
and the big one:
/SYSINFO & /ESYSINFO - Complete system information!
Two output control commands:
/XSYS2FORMAT , No arguments, it will print just the current formatting string.
It will take any arguments to it as the formatting string.
The formatting string can consist of any letter/numbers, and is used to format
the output. The following special symbols can be used:
%B : Bold
%Cnn : Foreground Color, where nn is a number corresponding to a mIRC color
%Cnn,nn : Foreground,Background Color
%R : Reverse Foreground/Background Colors
%O : Reset Color and Format (thats an 'oh' not a 'zero (0)')
%C : Reset Color
%U : Underline
/PLAYING will either print or allow you to set the text for /np.
The default is now_playing, but you can set this to whatever text you prefer.
/PERCENTAGES will allow you to set whether to use percentages in plugin output or not.
Percentages are enabled by default. Use a zero value to disable, and a non-zero value
to enable. If unsure, use 1.
/NP & /ENP - Reports what's currently playing in Audacious.
====
BUGS
(none known)
E-mail me your bug reports at chainsaw@gentoo.org
Please include the following information:
- what architecture you are using (amd64, ia64, parisc, ppc, ppc64, sparc, sparc64 or x86)
- what linux distribution you are using (Gentoo 2007.1, Fedora Core 8, etc)
- what compiler you have used to compile X-Sys, i.e. gcc (GCC) 4.1.2 (Gentoo 4.1.2)
- what version of X-Sys you are using
=======
Thanks!
Remember, everything here is:
(C) 2003, 2004, 2005 by Michael Shoup
(C) 2005, 2006, 2007 by Tony Vroon
All Rights Reserved.
Visit http://dev.gentoo.org/~chainsaw/xsys/ for release information.
Feel free to e-mail me for feature requests, or see if I'm online on irc.freenode.net

View File

@ -1,923 +0,0 @@
/*
* SysInfo - sysinfo plugin for HexChat
* Copyright (c) 2012 Berke Viktor.
*
* xsys.c - main functions for X-Sys 2
* by mikeshoup
* Copyright (C) 2003, 2004, 2005 Michael Shoup
* Copyright (C) 2005, 2006, 2007 Tony Vroon
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <glib.h>
#include "hexchat-plugin.h"
#include "parse.h"
#include "match.h"
#include "xsys.h"
#define DEFAULT_FORMAT "%B%1:%B %2 **"
#define DEFAULT_PERCENT 1
#define DEFAULT_ANNOUNCE 1
#define DEFAULT_PCIIDS "/usr/share/hwdata/pci.ids"
static hexchat_plugin *ph; /* plugin handle */
static int error_printed = 0; /* semaphore, make sure not to print the same error more than once during one execution */
static char name[] = "SysInfo";
static char desc[] = "Display info about your hardware and OS";
static char version[] = "3.0";
static char sysinfo_help[] = "SysInfo Usage:\n /SYSINFO [-e|-o] [OS|DISTRO|CPU|RAM|DISK|VGA|SOUND|ETHERNET|UPTIME], print various details about your system or print a summary without arguments\n /SYSINFO LIST, print current settings\n /SYSINFO SET <variable>, update given setting\n /SYSINFO RESET, reset settings to defaults\n /NETDATA <iface>, show transmitted data on given interface\n /NETSTREAM <iface>, show current bandwidth on given interface\n";
void
sysinfo_get_pciids (char* dest)
{
hexchat_pluginpref_get_str (ph, "pciids", dest);
}
int
sysinfo_get_percent ()
{
return hexchat_pluginpref_get_int (ph, "percent");
}
int
sysinfo_get_announce ()
{
return hexchat_pluginpref_get_int (ph, "announce");
}
void
sysinfo_print_error (const char* msg)
{
if (!error_printed)
{
hexchat_printf (ph, "%s\t%s", name, msg);
}
error_printed++;
}
static int
print_summary (int announce, char* format)
{
char sysinfo[bsize];
char buffer[bsize];
char cpu_model[bsize];
char cpu_cache[bsize];
char cpu_vendor[bsize];
char os_host[bsize];
char os_user[bsize];
char os_kernel[bsize];
unsigned long long mem_total;
unsigned long long mem_free;
unsigned int count;
double cpu_freq;
int giga = 0;
int weeks;
int days;
int hours;
int minutes;
int seconds;
sysinfo[0] = '\0';
snprintf (buffer, bsize, "%s", hexchat_get_info (ph, "version"));
format_output ("HexChat", buffer, format);
strcat (sysinfo, "\017 ");
strncat (sysinfo, buffer, bsize - strlen (sysinfo));
/* BEGIN OS PARSING */
if (xs_parse_os (os_user, os_host, os_kernel) != 0)
{
hexchat_printf (ph, "%s\tERROR in parse_os()", name);
return HEXCHAT_EAT_ALL;
}
snprintf (buffer, bsize, "%s", os_kernel);
format_output ("OS", buffer, format);
strcat (sysinfo, "\017 ");
strncat (sysinfo, buffer, bsize - strlen (sysinfo));
/* BEGIN DISTRO PARSING */
if (xs_parse_distro (buffer) != 0)
{
strncpy (buffer, "Unknown", bsize);
}
format_output ("Distro", buffer, format);
strcat (sysinfo, "\017 ");
strncat (sysinfo, buffer, bsize - strlen (sysinfo));
/* BEGIN CPU PARSING */
if (xs_parse_cpu (cpu_model, cpu_vendor, &cpu_freq, cpu_cache, &count) != 0)
{
hexchat_printf (ph, "%s\tERROR in parse_cpu()", name);
return HEXCHAT_EAT_ALL;
}
if (cpu_freq > 1000)
{
cpu_freq /= 1000;
giga = 1;
}
if (giga)
{
snprintf (buffer, bsize, "%u x %s (%s) @ %.2fGHz", count, cpu_model, cpu_vendor, cpu_freq);
}
else
{
snprintf (buffer, bsize, "%u x %s (%s) @ %.0fMHz", count, cpu_model, cpu_vendor, cpu_freq);
}
format_output ("CPU", buffer, format);
strcat (sysinfo, "\017 ");
strncat (sysinfo, buffer, bsize - strlen (sysinfo));
/* BEGIN MEMORY PARSING */
if (xs_parse_meminfo (&mem_total, &mem_free, 0) == 1)
{
hexchat_printf (ph, "%s\tERROR in parse_meminfo!", name);
return HEXCHAT_EAT_ALL;
}
snprintf (buffer, bsize, "%s", pretty_freespace ("Physical", &mem_free, &mem_total));
format_output ("RAM", buffer, format);
strcat (sysinfo, "\017 ");
strncat (sysinfo, buffer, bsize - strlen (sysinfo));
/* BEGIN DISK PARSING */
if (xs_parse_df (NULL, buffer))
{
hexchat_printf (ph, "%s\tERROR in parse_df", name);
return HEXCHAT_EAT_ALL;
}
format_output ("Disk", buffer, format);
strcat (sysinfo, "\017 ");
strncat (sysinfo, buffer, bsize - strlen (buffer));
/* BEGIN VIDEO PARSING */
if (xs_parse_video (buffer))
{
hexchat_printf (ph, "%s\tERROR in parse_video", name);
return HEXCHAT_EAT_ALL;
}
format_output ("VGA", buffer, format);
strcat (sysinfo, "\017 ");
strncat (sysinfo, buffer, bsize - strlen (buffer));
/* BEGIN SOUND PARSING */
if (xs_parse_sound (buffer))
{
strncpy (buffer, "Not present", bsize);
}
format_output ("Sound", buffer, format);
strcat (sysinfo, "\017 ");
strncat (sysinfo, buffer, bsize - strlen (buffer));
/* BEGIN ETHERNET PARSING */
if (xs_parse_ether (buffer))
{
strncpy (buffer, "None found", bsize);
}
format_output ("Ethernet", buffer, format);
strcat (sysinfo, "\017 ");
strncat (sysinfo, buffer, bsize - strlen (buffer));
/* BEGIN UPTIME PARSING */
if (xs_parse_uptime (&weeks, &days, &hours, &minutes, &seconds))
{
hexchat_printf (ph, "%s\tERROR in parse_uptime()", name);
return HEXCHAT_EAT_ALL;
}
if (minutes != 0 || hours != 0 || days != 0 || weeks != 0)
{
if (hours != 0 || days != 0 || weeks != 0)
{
if (days !=0 || weeks != 0)
{
if (weeks != 0)
{
snprintf (buffer, bsize, "%dw %dd %dh %dm %ds", weeks, days, hours, minutes, seconds);
}
else
{
snprintf (buffer, bsize, "%dd %dh %dm %ds", days, hours, minutes, seconds);
}
}
else
{
snprintf (buffer, bsize, "%dh %dm %ds", hours, minutes, seconds);
}
}
else
{
snprintf (buffer, bsize, "%dm %ds", minutes, seconds);
}
}
format_output ("Uptime", buffer, format);
strcat (sysinfo, "\017 ");
strncat (sysinfo, buffer, bsize - strlen (buffer));
if (announce)
{
hexchat_commandf (ph, "SAY %s", sysinfo);
}
else
{
hexchat_printf (ph, "%s", sysinfo);
}
return HEXCHAT_EAT_ALL;
}
static int
print_os (int announce, char* format)
{
char buffer[bsize];
char user[bsize];
char host[bsize];
char kernel[bsize];
if (xs_parse_os (user, host, kernel) != 0)
{
hexchat_printf (ph, "%s\tERROR in parse_os()", name);
return HEXCHAT_EAT_ALL;
}
snprintf (buffer, bsize, "%s@%s, %s", user, host, kernel);
format_output ("OS", buffer, format);
if (announce)
{
hexchat_commandf (ph, "SAY %s", buffer);
}
else
{
hexchat_printf (ph, "%s", buffer);
}
return HEXCHAT_EAT_ALL;
}
static int
print_distro (int announce, char* format)
{
char name[bsize];
if (xs_parse_distro (name) != 0)
{
hexchat_printf (ph, "%s\tERROR in parse_distro()!", name);
return HEXCHAT_EAT_ALL;
}
format_output("Distro", name, format);
if (announce)
{
hexchat_commandf (ph, "SAY %s", name);
}
else
{
hexchat_printf (ph, "%s", name);
}
return HEXCHAT_EAT_ALL;
}
static int
print_cpu (int announce, char* format)
{
char model[bsize];
char vendor[bsize];
char cache[bsize];
char buffer[bsize];
unsigned int count;
double freq;
int giga = 0;
if (xs_parse_cpu (model, vendor, &freq, cache, &count) != 0)
{
hexchat_printf (ph, "%s\tERROR in parse_cpu()", name);
return HEXCHAT_EAT_ALL;
}
if (freq > 1000)
{
freq /= 1000;
giga = 1;
}
if (giga)
{
snprintf (buffer, bsize, "%u x %s (%s) @ %.2fGHz w/ %s L2 Cache", count, model, vendor, freq, cache);
}
else
{
snprintf (buffer, bsize, "%u x %s (%s) @ %.0fMHz w/ %s L2 Cache", count, model, vendor, freq, cache);
}
format_output ("CPU", buffer, format);
if (announce)
{
hexchat_commandf (ph, "SAY %s", buffer);
}
else
{
hexchat_printf (ph, "%s", buffer);
}
return HEXCHAT_EAT_ALL;
}
static int
print_ram (int announce, char* format)
{
unsigned long long mem_total;
unsigned long long mem_free;
unsigned long long swap_total;
unsigned long long swap_free;
char string[bsize];
if (xs_parse_meminfo (&mem_total, &mem_free, 0) == 1)
{
hexchat_printf (ph, "%s\tERROR in parse_meminfo!", name);
return HEXCHAT_EAT_ALL;
}
if (xs_parse_meminfo (&swap_total, &swap_free, 1) == 1)
{
hexchat_printf (ph, "%s\tERROR in parse_meminfo!", name);
return HEXCHAT_EAT_ALL;
}
snprintf (string, bsize, "%s - %s", pretty_freespace ("Physical", &mem_free, &mem_total), pretty_freespace ("Swap", &swap_free, &swap_total));
format_output ("RAM", string, format);
if (announce)
{
hexchat_commandf (ph, "SAY %s", string);
}
else
{
hexchat_printf (ph, "%s", string);
}
return HEXCHAT_EAT_ALL;
}
static int
print_disk (int announce, char* format)
{
char string[bsize] = {0,};
#if 0
if (*word == '\0')
{
if (xs_parse_df (NULL, string))
{
hexchat_printf (ph, "ERROR in parse_df");
return HEXCHAT_EAT_ALL;
}
}
else
{
if (xs_parse_df (*word, string))
{
hexchat_printf (ph, "ERROR in parse_df");
return HEXCHAT_EAT_ALL;
}
}
#endif
if (xs_parse_df (NULL, string))
{
hexchat_printf (ph, "%s\tERROR in parse_df", name);
return HEXCHAT_EAT_ALL;
}
format_output ("Disk", string, format);
if (announce)
{
hexchat_commandf (ph, "SAY %s", string);
}
else
{
hexchat_printf (ph, "%s", string);
}
return HEXCHAT_EAT_ALL;
}
static int
print_vga (int announce, char* format)
{
char vid_card[bsize];
char agp_bridge[bsize];
char buffer[bsize];
int ret;
if ((ret = xs_parse_video (vid_card)) != 0)
{
hexchat_printf (ph, "%s\tERROR in parse_video! %d", name, ret);
return HEXCHAT_EAT_ALL;
}
if (xs_parse_agpbridge (agp_bridge) != 0)
{
snprintf (buffer, bsize, "%s", vid_card);
}
else
{
snprintf (buffer, bsize, "%s @ %s", vid_card, agp_bridge);
}
format_output ("VGA", buffer, format);
if (announce)
{
hexchat_commandf (ph, "SAY %s", buffer);
}
else
{
hexchat_printf (ph, "%s", buffer);
}
return HEXCHAT_EAT_ALL;
}
static int
print_sound (int announce, char* format)
{
char sound[bsize];
if (xs_parse_sound (sound) != 0)
{
hexchat_printf (ph, "%s\tERROR in parse_asound()!", name);
return HEXCHAT_EAT_ALL;
}
format_output ("Sound", sound, format);
if (announce)
{
hexchat_commandf (ph, "SAY %s", sound);
}
else
{
hexchat_printf (ph, "%s", sound);
}
return HEXCHAT_EAT_ALL;
}
static int
print_ethernet (int announce, char* format)
{
char ethernet_card[bsize];
if (xs_parse_ether (ethernet_card))
{
strncpy (ethernet_card, "None found", bsize);
}
format_output ("Ethernet", ethernet_card, format);
if (announce)
{
hexchat_commandf (ph, "SAY %s", ethernet_card);
}
else
{
hexchat_printf (ph, "%s", ethernet_card);
}
return HEXCHAT_EAT_ALL;
}
static int
print_uptime (int announce, char* format)
{
char buffer[bsize];
int weeks;
int days;
int hours;
int minutes;
int seconds;
if (xs_parse_uptime (&weeks, &days, &hours, &minutes, &seconds))
{
hexchat_printf (ph, "%s\tERROR in parse_uptime()", name);
return HEXCHAT_EAT_ALL;
}
if (minutes != 0 || hours != 0 || days != 0 || weeks != 0)
{
if (hours != 0 || days != 0 || weeks != 0)
{
if (days !=0 || weeks != 0)
{
if (weeks != 0)
{
snprintf (buffer, bsize, "%dw %dd %dh %dm %ds", weeks, days, hours, minutes, seconds);
}
else
{
snprintf (buffer, bsize, "%dd %dh %dm %ds", days, hours, minutes, seconds);
}
}
else
{
snprintf (buffer, bsize, "%dh %dm %ds", hours, minutes, seconds);
}
}
else
{
snprintf (buffer, bsize, "%dm %ds", minutes, seconds);
}
}
format_output ("Uptime", buffer, format);
if (announce)
{
hexchat_commandf (ph, "SAY %s", buffer);
}
else
{
hexchat_printf (ph, "%s", buffer);
}
return HEXCHAT_EAT_ALL;
}
static int
netdata_cb (char *word[], char *word_eol[], void *userdata)
{
char netdata[bsize];
char format[bsize];
unsigned long long bytes_recv;
unsigned long long bytes_sent;
if (*word[2] == '\0')
{
hexchat_printf (ph, "%s\tYou must specify a network device (e.g. /NETDATA eth0)!", name);
return HEXCHAT_EAT_ALL;
}
if (xs_parse_netdev (word[2], &bytes_recv, &bytes_sent) != 0)
{
hexchat_printf (ph, "%s\tERROR in parse_netdev", name);
return HEXCHAT_EAT_ALL;
}
bytes_recv /= 1024;
bytes_sent /= 1024;
snprintf (netdata, bsize, "%s: %.1f MB Received, %.1f MB Sent", word[2], (double)bytes_recv/1024.0, (double)bytes_sent/1024.0);
hexchat_pluginpref_get_str (ph, "format", format);
format_output ("Netdata", netdata, format);
if (hexchat_list_int (ph, NULL, "type") >= 2)
{
hexchat_commandf (ph, "SAY %s", netdata);
}
else
{
hexchat_printf (ph, "%s", netdata);
}
return HEXCHAT_EAT_ALL;
}
static int
netstream_cb (char *word[], char *word_eol[], void *userdata)
{
char netstream[bsize];
char mag_r[5];
char mag_s[5];
char format[bsize];
unsigned long long bytes_recv;
unsigned long long bytes_sent;
unsigned long long bytes_recv_p;
unsigned long long bytes_sent_p;
struct timespec ts = {1, 0};
if (*word[2] == '\0')
{
hexchat_printf (ph, "%s\tYou must specify a network device (e.g. /NETSTREAM eth0)!", name);
return HEXCHAT_EAT_ALL;
}
if (xs_parse_netdev(word[2], &bytes_recv, &bytes_sent) != 0)
{
hexchat_printf (ph, "%s\tERROR in parse_netdev", name);
return HEXCHAT_EAT_ALL;
}
while (nanosleep (&ts, &ts) < 0);
if (xs_parse_netdev(word[2], &bytes_recv_p, &bytes_sent_p) != 0)
{
hexchat_printf (ph, "%s\tERROR in parse_netdev", name);
return HEXCHAT_EAT_ALL;
}
bytes_recv = (bytes_recv_p - bytes_recv);
bytes_sent = (bytes_sent_p - bytes_sent);
if (bytes_recv > 1024)
{
bytes_recv /= 1024;
snprintf (mag_r, 5, "KB/s");
}
else
{
snprintf (mag_r, 5, "B/s");
}
if (bytes_sent > 1024)
{
bytes_sent /= 1024;
snprintf (mag_s, 5, "KB/s");
}
else
{
snprintf (mag_s, 5, "B/s");
}
snprintf (netstream, bsize, "%s: Receiving %llu %s, Sending %llu %s", word[2], bytes_recv, mag_r, bytes_sent, mag_s);
hexchat_pluginpref_get_str (ph, "format", format);
format_output ("Netstream", netstream, format);
if (hexchat_list_int (ph, NULL, "type") >= 2)
{
hexchat_commandf (ph, "SAY %s", netstream);
}
else
{
hexchat_printf (ph, "%s", netstream);
}
return HEXCHAT_EAT_ALL;
}
static void
list_settings ()
{
char list[512];
char buffer[512];
char* token;
hexchat_pluginpref_list (ph, list);
hexchat_printf (ph, "%s\tCurrent Settings:", name);
token = strtok (list, ",");
while (token != NULL)
{
hexchat_pluginpref_get_str (ph, token, buffer);
hexchat_printf (ph, "%s\t%s: %s\n", name, token, buffer);
token = strtok (NULL, ",");
}
}
static void
reset_settings ()
{
hexchat_pluginpref_set_str (ph, "pciids", DEFAULT_PCIIDS);
hexchat_pluginpref_set_str (ph, "format", DEFAULT_FORMAT);
hexchat_pluginpref_set_int (ph, "percent", DEFAULT_PERCENT);
hexchat_pluginpref_set_int (ph, "announce", DEFAULT_ANNOUNCE);
}
static int
sysinfo_cb (char *word[], char *word_eol[], void *userdata)
{
error_printed = 0;
int announce = sysinfo_get_announce ();
int offset = 0;
int buffer;
char format[bsize];
if (!hexchat_pluginpref_get_str (ph, "format", format))
{
hexchat_printf (ph, "%s\tError reading config file!", name);
return HEXCHAT_EAT_ALL;
}
/* Cannot send to server tab */
if (hexchat_list_int (ph, NULL, "type") == 1)
{
announce = 0;
}
/* Allow overriding global announce setting */
if (!strcmp ("-e", word[2]))
{
announce = 0;
offset++;
}
else if (!strcmp ("-o", word[2]))
{
announce = 1;
offset++;
}
if (!g_ascii_strcasecmp ("HELP", word[2+offset]))
{
hexchat_printf (ph, "%s", sysinfo_help);
return HEXCHAT_EAT_ALL;
}
else if (!g_ascii_strcasecmp ("LIST", word[2+offset]))
{
list_settings ();
return HEXCHAT_EAT_ALL;
}
else if (!g_ascii_strcasecmp ("SET", word[2+offset]))
{
if (!g_ascii_strcasecmp ("", word_eol[4+offset]))
{
hexchat_printf (ph, "%s\tEnter a value!\n", name);
return HEXCHAT_EAT_ALL;
}
if (!g_ascii_strcasecmp ("format", word[3+offset]))
{
hexchat_pluginpref_set_str (ph, "format", word_eol[4+offset]);
hexchat_printf (ph, "%s\tformat is set to: %s\n", name, word_eol[4+offset]);
}
else if (!g_ascii_strcasecmp ("percent", word[3+offset]))
{
buffer = atoi (word[4+offset]); /* don't use word_eol, numbers must not contain spaces */
if (buffer > 0 && buffer < INT_MAX)
{
hexchat_pluginpref_set_int (ph, "percent", buffer);
hexchat_printf (ph, "%s\tpercent is set to: %d\n", name, buffer);
}
else
{
hexchat_printf (ph, "%s\tInvalid input!\n", name);
}
}
else if (!g_ascii_strcasecmp ("announce", word[3+offset]))
{
buffer = atoi (word[4+offset]); /* don't use word_eol, numbers must not contain spaces */
if (buffer > 0)
{
hexchat_pluginpref_set_int (ph, "announce", 1);
hexchat_printf (ph, "%s\tannounce is set to: On\n", name);
}
else
{
hexchat_pluginpref_set_int (ph, "announce", 0);
hexchat_printf (ph, "%s\tannounce is set to: Off\n", name);
}
}
else if (!g_ascii_strcasecmp ("pciids", word[3+offset]))
{
hexchat_pluginpref_set_str (ph, "pciids", word_eol[4+offset]);
hexchat_printf (ph, "%s\tpciids is set to: %s\n", name, word_eol[4+offset]);
}
else
{
hexchat_printf (ph, "%s\tInvalid variable name! Use 'pciids', 'format' or 'percent'!\n", name);
return HEXCHAT_EAT_ALL;
}
return HEXCHAT_EAT_ALL;
}
else if (!g_ascii_strcasecmp ("RESET", word[2+offset]))
{
reset_settings ();
hexchat_printf (ph, "%s\tSettings have been restored to defaults.\n", name);
return HEXCHAT_EAT_ALL;
}
else if (!g_ascii_strcasecmp ("OS", word[2+offset]))
{
print_os (announce, format);
return HEXCHAT_EAT_ALL;
}
else if (!g_ascii_strcasecmp ("DISTRO", word[2+offset]))
{
print_distro (announce, format);
return HEXCHAT_EAT_ALL;
}
else if (!g_ascii_strcasecmp ("CPU", word[2+offset]))
{
print_cpu (announce, format);
return HEXCHAT_EAT_ALL;
}
else if (!g_ascii_strcasecmp ("RAM", word[2+offset]))
{
print_ram (announce, format);
return HEXCHAT_EAT_ALL;
}
else if (!g_ascii_strcasecmp ("DISK", word[2+offset]))
{
print_disk (announce, format);
return HEXCHAT_EAT_ALL;
}
else if (!g_ascii_strcasecmp ("VGA", word[2+offset]))
{
print_vga (announce, format);
return HEXCHAT_EAT_ALL;
}
else if (!g_ascii_strcasecmp ("SOUND", word[2+offset]))
{
print_sound (announce, format);
return HEXCHAT_EAT_ALL;
}
else if (!g_ascii_strcasecmp ("ETHERNET", word[2+offset]))
{
print_ethernet (announce, format);
return HEXCHAT_EAT_ALL;
}
else if (!g_ascii_strcasecmp ("UPTIME", word[2+offset]))
{
print_uptime (announce, format);
return HEXCHAT_EAT_ALL;
}
else if (!g_ascii_strcasecmp ("", word[2+offset]))
{
print_summary (announce, format);
return HEXCHAT_EAT_ALL;
}
else
{
hexchat_printf (ph, "%s", sysinfo_help);
return HEXCHAT_EAT_ALL;
}
}
int
hexchat_plugin_init (hexchat_plugin *plugin_handle, char **plugin_name, char **plugin_desc, char **plugin_version, char *arg)
{
char buffer[bsize];
ph = plugin_handle;
*plugin_name = name;
*plugin_desc = desc;
*plugin_version = version;
hexchat_hook_command (ph, "SYSINFO", HEXCHAT_PRI_NORM, sysinfo_cb, sysinfo_help, NULL);
hexchat_hook_command (ph, "NETDATA", HEXCHAT_PRI_NORM, netdata_cb, NULL, NULL);
hexchat_hook_command (ph, "NETSTREAM", HEXCHAT_PRI_NORM, netstream_cb, NULL, NULL);
/* this is required for the very first run */
if (hexchat_pluginpref_get_str (ph, "pciids", buffer) == 0)
{
hexchat_pluginpref_set_str (ph, "pciids", DEFAULT_PCIIDS);
}
if (hexchat_pluginpref_get_str (ph, "format", buffer) == 0)
{
hexchat_pluginpref_set_str (ph, "format", DEFAULT_FORMAT);
}
if (hexchat_pluginpref_get_int (ph, "percent") == -1)
{
hexchat_pluginpref_set_int (ph, "percent", DEFAULT_PERCENT);
}
if (hexchat_pluginpref_get_int (ph, "announce") == -1)
{
hexchat_pluginpref_set_int (ph, "announce", DEFAULT_ANNOUNCE);
}
hexchat_command (ph, "MENU ADD \"Window/Send System Info\" \"SYSINFO\"");
hexchat_printf (ph, "%s plugin loaded\n", name);
return 1;
}
int
hexchat_plugin_deinit (void)
{
hexchat_command (ph, "MENU DEL \"Window/Display System Info\"");
hexchat_printf (ph, "%s plugin unloaded\n", name);
return 1;
}

View File

@ -20,260 +20,50 @@
* THE SOFTWARE.
*/
#include <windows.h>
#include <wininet.h>
#include <glib.h>
#include <winsparkle.h>
#include "hexchat-plugin.h"
#define DEFAULT_DELAY 30 /* 30 seconds */
#define DEFAULT_FREQ 360 /* 6 hours */
#define DOWNLOAD_URL "http://dl.hexchat.net/hexchat"
#define APPCAST_URL "https://dl.hexchat.net/appcast.xml"
static hexchat_plugin *ph; /* plugin handle */
static char name[] = "Update Checker";
static char desc[] = "Check for HexChat updates automatically";
static char version[] = "4.0";
static const char upd_help[] = "Update Checker Usage:\n /UPDCHK, check for HexChat updates\n /UPDCHK SET delay|freq, set startup delay or check frequency\n";
static char*
check_version ()
{
HINTERNET hOpen, hConnect, hResource;
hOpen = InternetOpen (TEXT ("Update Checker"),
INTERNET_OPEN_TYPE_PRECONFIG,
NULL,
NULL,
0);
if (!hOpen)
{
return "Unknown";
}
hConnect = InternetConnect (hOpen,
TEXT ("raw.github.com"),
INTERNET_DEFAULT_HTTPS_PORT,
NULL,
NULL,
INTERNET_SERVICE_HTTP,
0,
0);
if (!hConnect)
{
InternetCloseHandle (hOpen);
return "Unknown";
}
hResource = HttpOpenRequest (hConnect,
TEXT ("GET"),
TEXT ("/hexchat/hexchat/master/win32/version.txt"),
TEXT ("HTTP/1.0"),
NULL,
NULL,
INTERNET_FLAG_SECURE | INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_RELOAD | INTERNET_FLAG_NO_AUTH,
0);
if (!hResource)
{
InternetCloseHandle (hConnect);
InternetCloseHandle (hOpen);
return "Unknown";
}
else
{
static char buffer[1024];
char infobuffer[32];
int statuscode;
DWORD dwRead;
DWORD infolen = sizeof(infobuffer);
HttpAddRequestHeaders (hResource, TEXT ("Connection: close\r\n"), -1L, HTTP_ADDREQ_FLAG_ADD); /* workaround for GC bug */
HttpSendRequest (hResource, NULL, 0, NULL, 0);
while (InternetReadFile (hResource, buffer, 1023, &dwRead))
{
if (dwRead == 0)
{
break;
}
buffer[dwRead] = 0;
}
HttpQueryInfo(hResource,
HTTP_QUERY_STATUS_CODE,
&infobuffer,
&infolen,
NULL);
InternetCloseHandle (hResource);
InternetCloseHandle (hConnect);
InternetCloseHandle (hOpen);
statuscode = atoi(infobuffer);
if (statuscode == 200)
return buffer;
else
return "Unknown";
}
}
static char version[] = "5.0";
static const char upd_help[] = "Update Checker Usage:\n /UPDCHK, check for HexChat updates\n";
static int
print_version (char *word[], char *word_eol[], void *userdata)
check_cmd (char *word[], char *word_eol[], void *userdata)
{
char *version;
int prevbuf;
int convbuf;
win_sparkle_check_update_with_ui ();
if (!g_ascii_strcasecmp ("HELP", word[2]))
{
hexchat_printf (ph, "%s", upd_help);
return HEXCHAT_EAT_HEXCHAT;
}
else if (!g_ascii_strcasecmp ("SET", word[2]))
{
if (!g_ascii_strcasecmp ("", word_eol[4]))
{
hexchat_printf (ph, "%s\tEnter a value!\n", name);
return HEXCHAT_EAT_HEXCHAT;
}
if (!g_ascii_strcasecmp ("delay", word[3]))
{
convbuf = atoi (word[4]); /* don't use word_eol, numbers must not contain spaces */
if (convbuf > 0 && convbuf < INT_MAX)
{
prevbuf = hexchat_pluginpref_get_int (ph, "delay");
hexchat_pluginpref_set_int (ph, "delay", convbuf);
hexchat_printf (ph, "%s\tUpdate check startup delay is set to %d seconds (from %d).\n", name, convbuf, prevbuf);
}
else
{
hexchat_printf (ph, "%s\tInvalid input!\n", name);
}
}
else if (!g_ascii_strcasecmp ("freq", word[3]))
{
convbuf = atoi (word[4]); /* don't use word_eol, numbers must not contain spaces */
if (convbuf > 0 && convbuf < INT_MAX)
{
prevbuf = hexchat_pluginpref_get_int (ph, "freq");
hexchat_pluginpref_set_int (ph, "freq", convbuf);
hexchat_printf (ph, "%s\tUpdate check frequency is set to %d minutes (from %d).\n", name, convbuf, prevbuf);
}
else
{
hexchat_printf (ph, "%s\tInvalid input!\n", name);
}
}
else
{
hexchat_printf (ph, "%s\tInvalid variable name! Use 'delay' or 'freq'!\n", name);
return HEXCHAT_EAT_HEXCHAT;
}
return HEXCHAT_EAT_HEXCHAT;
}
else if (!g_ascii_strcasecmp ("", word[2]))
{
version = check_version ();
if (strcmp (version, hexchat_get_info (ph, "version")) == 0)
{
hexchat_printf (ph, "%s\tYou have the latest version of HexChat installed!\n", name);
}
else if (strcmp (version, "Unknown") == 0)
{
hexchat_printf (ph, "%s\tUnable to check for HexChat updates!\n", name);
}
else
{
#ifdef _WIN64 /* use this approach, the wProcessorArchitecture method always returns 0 (=x86) for some reason */
hexchat_printf (ph, "%s:\tA HexChat update is available! You can download it from here:\n%s/HexChat%%20%s%%20x64.exe\n", name, DOWNLOAD_URL, version);
#else
hexchat_printf (ph, "%s:\tA HexChat update is available! You can download it from here:\n%s/HexChat%%20%s%%20x86.exe\n", name, DOWNLOAD_URL, version);
#endif
}
return HEXCHAT_EAT_HEXCHAT;
}
else
{
hexchat_printf (ph, "%s", upd_help);
return HEXCHAT_EAT_HEXCHAT;
}
}
static int
print_version_quiet (void *userdata)
{
char *version = check_version ();
/* if it's not the current version AND not network error */
if (!(strcmp (version, hexchat_get_info (ph, "version")) == 0) && !(strcmp (version, "Unknown") == 0))
{
#ifdef _WIN64 /* use this approach, the wProcessorArchitecture method always returns 0 (=x86) for plugins for some reason */
hexchat_printf (ph, "%s\tA HexChat update is available! You can download it from here:\n%s/HexChat%%20%s%%20x64.exe\n", name, DOWNLOAD_URL, version);
#else
hexchat_printf (ph, "%s\tA HexChat update is available! You can download it from here:\n%s/HexChat%%20%s%%20x86.exe\n", name, DOWNLOAD_URL, version);
#endif
/* print update url once, then stop the timer */
return 0;
}
/* keep checking */
return 1;
}
static int
delayed_check (void *userdata)
{
int freq = hexchat_pluginpref_get_int (ph, "freq");
/* only start the timer if there's no update available during startup */
if (print_version_quiet (NULL))
{
/* check for updates, every 6 hours by default */
hexchat_hook_timer (ph, freq * 1000 * 60, print_version_quiet, NULL);
}
return 0; /* run delayed_check() only once */
return HEXCHAT_EAT_ALL;
}
int
hexchat_plugin_init (hexchat_plugin *plugin_handle, char **plugin_name, char **plugin_desc, char **plugin_version, char *arg)
{
int delay;
ph = plugin_handle;
*plugin_name = name;
*plugin_desc = desc;
*plugin_version = version;
/* these are required for the very first run */
delay = hexchat_pluginpref_get_int (ph, "delay");
if (delay == -1)
{
delay = DEFAULT_DELAY;
hexchat_pluginpref_set_int (ph, "delay", DEFAULT_DELAY);
}
win_sparkle_set_appcast_url (APPCAST_URL);
win_sparkle_init ();
if (hexchat_pluginpref_get_int (ph, "freq") == -1)
{
hexchat_pluginpref_set_int (ph, "freq", DEFAULT_FREQ);
}
hexchat_hook_command (ph, "UPDCHK", HEXCHAT_PRI_NORM, print_version, upd_help, NULL);
hexchat_hook_timer (ph, delay * 1000, delayed_check, NULL);
hexchat_hook_command (ph, "UPDCHK", HEXCHAT_PRI_NORM, check_cmd, upd_help, NULL);
hexchat_command (ph, "MENU -ishare\\download.png ADD \"Help/Check for Updates\" \"UPDCHK\"");
hexchat_printf (ph, "%s plugin loaded\n", name);
return 1; /* return 1 for success */
return 1;
}
int
hexchat_plugin_deinit (void)
{
win_sparkle_cleanup ();
hexchat_command (ph, "MENU DEL \"Help/Check for updates\"");
hexchat_printf (ph, "%s plugin unloaded\n", name);
return 1;

View File

@ -1,7 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Label="Configuration">
<PlatformToolset>v120</PlatformToolset>
<PlatformToolset>v140</PlatformToolset>
<ConfigurationType>DynamicLibrary</ConfigurationType>
</PropertyGroup>
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Release|Win32">
@ -19,80 +20,33 @@
<RootNamespace>upd</RootNamespace>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="..\..\win32\hexchat.props" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="..\..\win32\hexchat.props" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="..\..\win32\hexchat.props" />
<PropertyGroup>
<TargetName>hcupd</TargetName>
<OutDir>$(HexChatBin)</OutDir>
<IntDir>$(HexChatObj)$(ProjectName)\</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental>
<TargetName>hcupd</TargetName>
<OutDir>$(HexChatBin)</OutDir>
<IntDir>$(HexChatObj)$(ProjectName)\</IntDir>
<OutDir>$(HexChatRel)plugins\</OutDir>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<PrecompiledHeader>
</PrecompiledHeader>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;UPD_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<AdditionalIncludeDirectories>..\..\src\common;$(Glib);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>..\..\src\common;$(WinSparklePath);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<ModuleDefinitionFile>upd.def</ModuleDefinitionFile>
<AdditionalDependencies>$(DepLibs);%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(DepsRoot)\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>$(DepLibs);WinSparkle.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(DepsRoot)\lib;$(WinSparklePath);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<PrecompiledHeader>
</PrecompiledHeader>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;_WIN64;_AMD64_;NDEBUG;_WINDOWS;_USRDLL;UPD_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<AdditionalIncludeDirectories>..\..\src\common;$(Glib);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>..\..\src\common;$(WinSparklePath);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<ModuleDefinitionFile>upd.def</ModuleDefinitionFile>
<AdditionalDependencies>$(DepLibs);%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(DepsRoot)\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>$(DepLibs);WinSparkle.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(DepsRoot)\lib;$(WinSparklePath);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
@ -102,6 +56,4 @@
<ClCompile Include="upd.c" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
</Project>

View File

@ -13,6 +13,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <glib.h>
#include "hexchat-plugin.h"
@ -21,163 +22,127 @@
static hexchat_plugin *ph; /* plugin handle */
BOOL winamp_found = FALSE;
int status = 0;
/* Slightly modified from X-Chat's log_escape_strcpy */
static char *
song_strcpy (char *dest, char *src)
{
while (*src)
{
*dest = *src;
dest++;
src++;
if (*src == '%')
{
dest[0] = '%';
dest++;
}
}
dest[0] = 0;
return dest - 1;
}
static int
winamp(char *word[], char *word_eol[], void *userdata)
{
HWND hwndWinamp = FindWindowW(L"Winamp v1.x",NULL);
char current_play[2048], *p;
char p_esc[2048];
char cur_esc[2048];
char truc[2048];
HWND hwndWinamp = FindWindow("Winamp v1.x",NULL);
if (hwndWinamp)
if (hwndWinamp)
{
{
if (!stricmp("PAUSE", word[2]))
if (!stricmp("PAUSE", word[2]))
{
if (SendMessage(hwndWinamp,WM_USER, 0, 104))
{
if (SendMessage(hwndWinamp,WM_USER, 0, 104))
{
SendMessage(hwndWinamp, WM_COMMAND, 40046, 0);
SendMessage(hwndWinamp, WM_COMMAND, 40046, 0);
if (SendMessage(hwndWinamp, WM_USER, 0, 104) == PLAYING)
hexchat_printf(ph, "Winamp: playing");
else
hexchat_printf(ph, "Winamp: paused");
}
}
else
if (!stricmp("STOP", word[2]))
{
SendMessage(hwndWinamp, WM_COMMAND, 40047, 0);
hexchat_printf(ph, "Winamp: stopped");
}
else
if (!stricmp("PLAY", word[2]))
{
SendMessage(hwndWinamp, WM_COMMAND, 40045, 0);
hexchat_printf(ph, "Winamp: playing");
}
else
if (!stricmp("NEXT", word[2]))
{
SendMessage(hwndWinamp, WM_COMMAND, 40048, 0);
hexchat_printf(ph, "Winamp: next playlist entry");
}
else
if (!stricmp("PREV", word[2]))
{
SendMessage(hwndWinamp, WM_COMMAND, 40044, 0);
hexchat_printf(ph, "Winamp: previous playlist entry");
}
else
if (!stricmp("START", word[2]))
{
SendMessage(hwndWinamp, WM_COMMAND, 40154, 0);
hexchat_printf(ph, "Winamp: playlist start");
}
else
if (!word_eol[2][0])
{
GetWindowText(hwndWinamp, current_play, sizeof(current_play));
if (strchr(current_play, '-'))
{
p = current_play + strlen(current_play) - 8;
while (p >= current_play)
{
if (!strnicmp(p, "- Winamp", 8)) break;
p--;
}
if (p >= current_play) p--;
while (p >= current_play && *p == ' ') p--;
*++p=0;
p = strchr(current_play, '.') + 1;
song_strcpy(p_esc, p);
song_strcpy(cur_esc, current_play);
if (p)
{
sprintf(truc, "me is now playing:%s", p_esc);
}
else
{
sprintf(truc, "me is now playing:%s", cur_esc);
}
hexchat_commandf(ph, truc);
}
else hexchat_print(ph, "Winamp: Nothing being played.");
if (SendMessage(hwndWinamp, WM_USER, 0, 104) == PLAYING)
hexchat_printf(ph, "Winamp: playing");
else
hexchat_printf(ph, "Winamp: paused");
}
else
hexchat_printf(ph, "Usage: /WINAMP [PAUSE|PLAY|STOP|NEXT|PREV|START]\n");
}
}
else if (!stricmp("STOP", word[2]))
{
SendMessage(hwndWinamp, WM_COMMAND, 40047, 0);
hexchat_printf(ph, "Winamp: stopped");
}
else if (!stricmp("PLAY", word[2]))
{
SendMessage(hwndWinamp, WM_COMMAND, 40045, 0);
hexchat_printf(ph, "Winamp: playing");
}
else if (!stricmp("NEXT", word[2]))
{
SendMessage(hwndWinamp, WM_COMMAND, 40048, 0);
hexchat_printf(ph, "Winamp: next playlist entry");
}
else if (!stricmp("PREV", word[2]))
{
SendMessage(hwndWinamp, WM_COMMAND, 40044, 0);
hexchat_printf(ph, "Winamp: previous playlist entry");
}
else if (!stricmp("START", word[2]))
{
SendMessage(hwndWinamp, WM_COMMAND, 40154, 0);
hexchat_printf(ph, "Winamp: playlist start");
}
else if (!word_eol[2][0])
{
wchar_t wcurrent_play[2048];
char *current_play, *p;
int len = GetWindowTextW(hwndWinamp, wcurrent_play, G_N_ELEMENTS(wcurrent_play));
current_play = g_utf16_to_utf8 (wcurrent_play, len, NULL, NULL, NULL);
if (!current_play)
{
hexchat_print (ph, "Winamp: Error getting song information.");
return HEXCHAT_EAT_ALL;
}
if (strchr(current_play, '-'))
{
/* Remove any trailing text and whitespace */
p = current_play + strlen(current_play) - 8;
while (p >= current_play)
{
if (!strnicmp(p, "- Winamp", 8))
break;
p--;
}
if (p >= current_play)
p--;
while (p >= current_play && *p == ' ')
p--;
*++p = '\0';
/* Ignore any leading track number */
p = strstr (current_play, ". ");
if (p)
p += 2;
else
p = current_play;
if (*p != '\0')
hexchat_commandf (ph, "me is now playing: %s", p);
else
hexchat_print (ph, "Winamp: No song information found.");
g_free (current_play);
}
else
hexchat_print(ph, "Winamp: Nothing being played.");
}
else
hexchat_printf(ph, "Usage: /WINAMP [PAUSE|PLAY|STOP|NEXT|PREV|START]\n");
}
else
{
hexchat_print(ph, "Winamp not found.\n");
hexchat_print(ph, "Winamp not found.\n");
}
return HEXCHAT_EAT_ALL;
}
int
hexchat_plugin_init(hexchat_plugin *plugin_handle,
char **plugin_name,
char **plugin_desc,
char **plugin_version,
char *arg)
char **plugin_name,
char **plugin_desc,
char **plugin_version,
char *arg)
{
/* we need to save this for use with any hexchat_* functions */
ph = plugin_handle;
*plugin_name = "Winamp";
*plugin_desc = "Winamp plugin for HexChat";
*plugin_version = "0.5";
*plugin_version = "0.6";
hexchat_hook_command (ph, "WINAMP", HEXCHAT_PRI_NORM, winamp, "Usage: /WINAMP [PAUSE|PLAY|STOP|NEXT|PREV|START] - control Winamp or show what's currently playing", 0);
hexchat_command (ph, "MENU -ishare\\music.png ADD \"Window/Display Current Song (Winamp)\" \"WINAMP\"");
hexchat_print (ph, "Winamp plugin loaded\n");
return 1; /* return 1 for success */
return 1; /* return 1 for success */
}
int

View File

@ -1,7 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Label="Configuration">
<PlatformToolset>v120</PlatformToolset>
<PlatformToolset>v140</PlatformToolset>
<ConfigurationType>DynamicLibrary</ConfigurationType>
</PropertyGroup>
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Release|Win32">
@ -19,76 +20,31 @@
<RootNamespace>winamp</RootNamespace>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="..\..\win32\hexchat.props" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="..\..\win32\hexchat.props" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="..\..\win32\hexchat.props" />
<PropertyGroup>
<TargetName>hcwinamp</TargetName>
<OutDir>$(HexChatBin)</OutDir>
<IntDir>$(HexChatObj)$(ProjectName)\</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental>
<TargetName>hcwinamp</TargetName>
<OutDir>$(HexChatBin)</OutDir>
<IntDir>$(HexChatObj)$(ProjectName)\</IntDir>
<OutDir>$(HexChatRel)plugins\</OutDir>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<PrecompiledHeader>
</PrecompiledHeader>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;WINAMP_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<AdditionalIncludeDirectories>..\..\src\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<ModuleDefinitionFile>winamp.def</ModuleDefinitionFile>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<PrecompiledHeader>
</PrecompiledHeader>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;_WIN64;_AMD64_;NDEBUG;_WINDOWS;_USRDLL;WINAMP_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<AdditionalIncludeDirectories>..\..\src\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup>
<ClCompile>
<AdditionalIncludeDirectories>$(DepsRoot)\include;$(Glib);..\..\src\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<ModuleDefinitionFile>winamp.def</ModuleDefinitionFile>
<AdditionalDependencies>$(DepLibs);%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(DepsRoot)\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
@ -98,6 +54,4 @@
<ClCompile Include="winamp.c" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
</Project>

View File

@ -10,6 +10,7 @@ src/common/inbound.c
src/common/notify.c
src/common/outbound.c
src/common/plugin.c
src/common/plugin-identd.c
src/common/plugin-timer.c
src/common/server.c
src/common/servlist.c
@ -31,6 +32,7 @@ src/fe-gtk/joind.c
src/fe-gtk/maingui.c
src/fe-gtk/menu.c
src/fe-gtk/notifygui.c
src/fe-gtk/plugin-notification.c
src/fe-gtk/plugin-tray.c
src/fe-gtk/plugingui.c
src/fe-gtk/rawlog.c
@ -41,3 +43,4 @@ src/fe-gtk/textgui.c
src/fe-gtk/urlgrab.c
src/fe-gtk/userlistgui.c
src/fe-text/fe-text.c
plugins/sysinfo/sysinfo.c

2670
po/af.po

File diff suppressed because it is too large Load Diff

2672
po/am.po

File diff suppressed because it is too large Load Diff

2686
po/ast.po

File diff suppressed because it is too large Load Diff

2676
po/az.po

File diff suppressed because it is too large Load Diff

2692
po/be.po

File diff suppressed because it is too large Load Diff

2686
po/bg.po

File diff suppressed because it is too large Load Diff

2825
po/ca.po

File diff suppressed because it is too large Load Diff

2717
po/cs.po

File diff suppressed because it is too large Load Diff

2860
po/da.po

File diff suppressed because it is too large Load Diff

3132
po/de.po

File diff suppressed because it is too large Load Diff

2793
po/el.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More