Heiko Hund | 22 May 18:42
Favicon
Gravatar

Re: [Translation Question] Traditional Chinese

On Thursday 17 May 2012 19:06:06 Yi-Wen Cheng wrote:
> I just finished both of files for translating to traditional chinese.

Took me a little while, but I just finished integrating it into the GUI. Don't 
know what .lang file is for, but I suppose it's another project you contribute 
translation to. The .rc file is now part of the official OpenVPN-GUI. Thanks 
for your efforts!

> Btw,how can I see the new GUI of traditional chinese on my laptop?

I released a new snapshot binary. You should be able to download it once it's 
spread across the Sourceforge download mirrors at 
http://sf.net/projects/openvpn-gui/files/Snapshot%20Binaries/2012-05-22/

Will you do the translation to Simplified Chinese as well? Is so, please base 
it on the openvpn-gui-res-zh-hant.rc file in the repository. I made some 
changes to the one you sent.

Thanks again
Heiko
--

-- 
Heiko Hund | Software Engineer | Tel +49-721-25516-237 | Fax -200
SOPHOS NSG | Amalienbadstr. 41 Bau 52 | 76227 Karlsruhe | Germany

------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
(Continue reading)

Alon Bar-Lev | 21 May 13:04
Picon
Gravatar

[PATCH] build: check minimum polarssl version

Pre 1.1 is unsupported, API was changed.

Signed-off-by: Alon Bar-Lev <alon.barlev <at> gmail.com>
---
 configure.ac |   21 +++++++++++++++++++++
 1 files changed, 21 insertions(+), 0 deletions(-)

diff --git a/configure.ac b/configure.ac
index 4592727..5ace128 100644
--- a/configure.ac
+++ b/configure.ac
@@ -743,6 +743,27 @@ if test -z "${POLARSSL_LIBS}"; then
 	)
 fi

+if test "${with_crypto_library}" = "polarssl" ; then
+	AC_MSG_CHECKING([polarssl version])
+	old_CFLAGS="${CFLAGS}"
+	CFLAGS="${POLARSSL_CFLAGS} ${CFLAGS}"
+	AC_COMPILE_IFELSE(
+		[AC_LANG_PROGRAM(
+			[[
+#include <polarssl/version.h>
+			]],
+			[[
+#if POLARSSL_VERSION_NUMBER <= 0x01010000
+#error invalid version
+#endif
+			]]
+		)],
(Continue reading)

Yi-Wen Cheng | 17 May 11:06
Picon
Picon

Re: [Translation Question] Traditional Chinese

Hi,I just finished both of files for translating to traditional chinese.
 
The attachments are the files I provide.
 
Btw,how can I see the new GUI of traditional chinese on my laptop?
 
Thanks
 
Regards
 
YiWen
 
On 05/14/12, Heiko Hund <heiko.hund <at> sophos.com> wrote:
Hi Yi-Wen

On Monday 14 May 2012 09:37:24 Yi-Wen Cheng wrote:
> Could I get the "res_openvpn-gui-res-xx.rc" of simplified chinese?

So far nobody has done the translation to Simplyfied Chinese. If you would do
it in parallel while translating into Traditional Chinese you'd be some kind
of hero! =)

> Shall I just translate all Engilsh sentences in English rc file and save to
> another rc file?

Yes, just grab the English version, save it as openvpn-gui-res-zh-hant.rc (or
zh-hans for simplified) and translate it. Make sure to use UTF-8 encoding for
the file. When you're done simply post the result here and I will add it to
the official repository.

Regards
Heiko
--
Heiko Hund | Software Engineer | Tel +49-721-25516-237 | Fax -200
SOPHOS NSG | Amalienbadstr. 41 Bau 52 | 76227 Karlsruhe | Germany

 
Attachment (openvpn-gui-res-zh.rc): application/octet-stream, 17 KiB
# this is a language file for Vistalizator
# compatible versions: 2.30
# author: froggie
# save this file in Unicode or UTF to preserve special characters
# put this file into program's "Languages" subfolder to have it loaded automatically at program's startup
# (it will be silently skipped if there is a built-in language with the same "EnglishName" value in its header)
# after approval, this translation can become a new buit-in language amongst others and will be included in
a pack of all languages available for download
# English is a fallback language for missing lines (built in program)
# "|" represents a newline character (only messages 043, 084-096, 100 and 600-800: otherwise it is ignored
as not expected/allowed), e.g. "Line1.|Line2.|Line3."
# leading/trailing spaces are trimmed: e.g. "001 =  System configuration" is the same as "001=System configuration"
# use quotes to keep leading/trailing spaces in the message: e.g. 081=" or "
# put "" instead of a translated message if you want to get a blank message, e.g. 123=""
# some messages are limited in length to prevent caption overflow of that particular GUI component
# %1, %2, %3 and %4 represent a dynamic parameter (should not be omitted) resolved at runtime, e.g.
"175=Installing Windows Vista update: %1..."
# additionally, languages' names can have multiple forms, e.g. in German: "300=Dänisch; dänisch;
dänischer; dänische; dänisches"
# there can be up to 9 forms, the specific one can be chosen like this: e.g. "240=Loading %1#3 language pack."
or "Current LIP language: %1#4 on %2#2."

[Header]
# the following 2 lines are mandatory, "EnglishName" value must be unique, it is case insensitive
EnglishName=Chinese (Traditional)
NativeName=中文(繁體)
# set True if applicable (Arabic, Hebrew and similar languages), can be omitted=False
RightToLeft=False

[Main window]
001=系統配置
002=已安裝的語言
003=系統:
004=原始語言:
005=現行語言:
006=新語言:
007=退出
008=關於
009=幫助
010=添加語言
011=更改語言
012=移動語言
013=更新語言
014=語言
015=類型
016=模式
017=內部
018=快速
019=未定
# a legend below the table of installed languages
020=依靠 MUI* 的 LIP 語言已安裝
# "Current Language" label value
# e.g. "Spanish (should be upgraded to SP1)"
021=%1 (應該更新到 SP%2)
# e.g. "Catalan: on Spanish"
022=%1:使用%2
# e.g. "Spanish"
023=%1
# "New Language" label value
# e.g. "Spanish (should be upgraded to SP1)"
024=%1 (應該更新到 SP%2)
# e.g. "Catalan: on Spanish"
025=%1:使用%2
# e.g. "Spanish"
026=%1
# "Original Language" label value, always MUI
# e.g. "Spanish"
027=%1
# a language name in the table of installed languages (main window)
# e.g. "Spanish"
028=%1

[Program's menu]
030=語言
031=幫助
032=添加...
033=輸出所有...
034=顯示幫助
035=關於 Vistalizator

[About dialog]
040=關於 Vistalizator
041=Windows Vista 和 Windows 7 定位工具
042=Copyright © 2008-2010 by froggie
# 1 newline character can be used
043=如果您發現本工具值得捐款
044=請單擊捐款

[Help dialog]
# window title
050=幫助内容

[Parent languages dialog]
# e.g. "Choose parent language for Catalan"
051=選擇%1的父語言
052=可用的語言
# OK button
053=確定
# Cancel button
054=取消
# a parent language name: caption of a checkbox
# e.g. "Spanish"
055=%1

[Dialog with language packs loaded]
060=安裝語言
061=安裝語言
062=取消安裝過程
063=寂靜安裝
064=* 單擊單元更改安裝模式或(取消)選擇安裝的語言
065=* 單擊單元(取消)選擇安裝的語言
066=MUI 語言包: 提供所有界面的翻譯
067=LIP 語言包: 提供普通界面的翻譯,需要 MUI 父語言
068=快速模式: 使用本程序的安裝程序裝語言。
# Windows Vista 32-bit
069=内部模式 (測試於 MUI): 使用 Windows 内部安裝程序裝語言。
# Windows 7
070=内部模式: 使用 Windows 内部安裝程序裝語言。
# Windows Vista 64-bit
071=内部模式 (不可用): 使用 Windows 内部安裝程序裝語言。
072=語言包已加載: 沒有選擇安裝
# e.g. "Spanish language pack loaded: not selected for installation"
073=%1語言包已加載: 沒有選擇安裝
# "Spanish language pack loaded: selected for installation"
074=%1語言包已加載: 已選擇安裝
# e.g. "Language packs loaded, selected for installation: 5"
075=語言包已加載,已選擇安裝: %1
# a language name in the table of loaded languages (window with language packs loaded)
# e.g. "Spanish"
076=%1
077=安裝
078=是
079=否
# line delimiter, e.g. "French|and|Spanish"
080=和
# word delimiter, e.g. "French or Spanish"; quotes used to keep leading/trailing spaces (won't be used)
081="或"
# line delimiter, e.g. "French|or|Spanish"
082=或
# e.g. "Catalan language cannot be installed using Internal mode. To install it the following must be met:"
084=%1不可使用内部模式安裝。需要安裝,您必需满足下列要求:
# e.g. "Spanish parent language is the current display language."
085=%1父語言是現行顯示語言。
# e.g. "One of these parent languages is the current display language: French or Spanish."
# a newline character can be used, %1 is a list of languages separated by message #081 (" or ")
086=其中一種父語言是現行的顯示語言: %1。
# e.g. "Spanish parent language has been installed in Internal mode and is the current display language."
087=已經在内部模式中安裝%1父語言,本語言是現行的顯示語言。
# e.g. "One of these parent languages has been installed in Internal mode and is the current display
language: French or Spanish."
# a newline character can be used, %1 is a list of languages separated by message #081 (" or
")
088=已經在内部模式中安裝其中的父語言,本語言是現行的顯示語言: %1。
# 32-bit Windows Vista
089=MUI
語言的内部安裝模式使用Windows的安裝程序,只能在您的系统中運行一次!|為了在本模式中安裝多
MUI 語言種類,需要加載盡可能多的MUI語言,然後更改模式到内部。|請注意,LIP語言沒有本限制,但如果要使用内部模式中安裝LIP語言,您需要先安裝MUI父語言。
# 64-bit Windows Vista
090=MUI
語言的内部安裝模式使用Windows的安裝程序,只能在您的系统中運行一次!|為了在本模式中安裝多
MUI 語言種類,需要加載盡可能多的MUI語言,然後更改模式到内部。
# e.g. "Catalan LIP language will use Spanish as the parent language."
091=%1 LIP 語言需要用%2為父語言。
# e.g. "Catalan LIP language uses Spanish as the parent language, but it is not selected for installation."
092=%1 LIP 語言需要用%2為父語言,但沒有選擇安裝。
# e.g. "Catalan LIP language can use these parent languages: French or Spanish."
# a newline character can be used, %2 is a list of languages separated by message #081 (" or ")
093=%1 LIP 語言可以使用這些父語言: %2。
# e.g. "Catalan LIP language can use these parent languages: French or Spanish, but it is not selected for installation."
# a newline character can be used, %2 is a list of languages separated by message #081 (" or ")
094=%1 LIP 語言可以使用這些父語言: %2,但沒有選擇安裝。
# e.g. "Spanish language will be upgraded to be Windows Vista SP1 compatible."
095=%1會被更新為%2 SP%3兼容。
096=%1沒有選擇更新到%2 SP%3。
# LIP language as part of a list, e.g. "Basque, Catalan and Luxembourgish", items separated by message #098
and #099
097=%1
# a separator to a list of LIP languages (e.g. "Basque, Catalan and Luxembourgish"); quotes used to keep
leading/trailing spaces (won't be used)
098="、"
# a separator to a list of LIP languages (e.g. "Basque, Catalan and Luxembourgish"); quotes used to keep
leading/trailing spaces (won't be used)
# for the last item
099="和"
# e.g. "Upon installing Spanish MUI, LIP languages requiring this parent language can be installed:"
100=安裝%1 MUI时,可以安裝需要本父語言的LIP語言:
101=選擇安裝%1
102=沒有選擇安裝%1
# tooltip message for "Silent installation" checkbox 
103=After completing the installation, user is not asked to change to the new language (batch mode).

[Button "Add languages" FileOpen dialog]
# FileOpen dialog title
120=打開Windows語言包
# file extension filter
# e.g. "langpacks (*.exe, *.cab, *.mlc)", 32-bit Windows
121=語言包
# e.g. "language packs (*.exe, *.cab)", 64-bit Windows
122=語言包
# e.g. "MUI language packs (*.exe)" or "MUI language packs (*.cab)"
123=MUI 語言包
# e.g. "LIP language packs (*.mlc)"
124=LIP 語言包

[Button "Update languages" FileOpen dialog]
# FileOpen dialog title
125=打開Windows update文件
# e.g. "Windows updates (*.msu, *.exe)"
126=Windows updates

[Menu->Languages->Add... FileOpen dialog]
# FileOpen dialog title
127=打開本程序的語言文件
# e.g. "language files (*.lang)"
128=語言文件
# e.g. "all files (*.*)"
129=所有文件

[Menu->Languages->Export All... SelectFolder dialog]
130=選擇保存語言的文件夾

[Statusbar messages]
# e.g. "Press Add languages and open Windows language pack(s). Download links can be found in Help."
# %1 = message #010 ("Add languages")
150=按 %1 然後打開Windows語言包。幫助有下載鏈接。
151=正在退出程序...
# e.g. "Loading language pack: lp_en-us.exe"
152=正在加載語言包: %1
# e.g. "Loading language pack 2 of 3: lp_en-us.exe"
153=正在加載語言包 %1 共 %2: %3
# e.g. "Language pack loaded: English"
154=語言包已加載: %1
155=沒有加載語言包。請再試一次。
# e.g. "Number of language packs loaded: 3"
156=已加載的語言包的數量: %1
# e.g. "Express installation: Installing Spanish language..."
157=快速安裝: 正在安裝%1...
# e.g. "Express installation: Upgrading Spanish language..."
158=快速安裝: 正在更新%1...
# e.g. "Express installation: Processing language 1 of 3..."
159=快速安裝: 正在處理語言 %1 共 %2...
160=解壓語言包錯誤!請再試一次。
# e.g "Spanish language was not installed correctly. Please contact author to get help."
161=沒有正確地安裝%1。請與作者聯繫,尋求幫助。
# e.g. "Spanish language was installed successfully."
162=%1已成功安裝。
# e.g. "Spanish language was upgraded successfully to SP1."
163=%1已成功更新到 SP1。
164=%1已成功更新到 SP2。
165=%1已成功更新到 SP3。
# e.g "Display language was changed to: Spanish."
166=顯示語言已更改為: %1。
# e.g "Display language was changed to: Catalan. Its parent language was set to: Spanish."
167=顯示語言已更改為: %1。父語言已定為: %2.
# e.g. "Display language reverted to current language: Spanish."
168=顯示語言已回復到現行語言: %1。
# e.g. "Spanish language was added to the list of installed languages."
169=%1已添加到安裝語言的目錄。
# e.g. "Internal installation: Installing Spanish language..."
170=内部安裝: 正在安裝%1...
# e.g. "Internal installation: Installing 3 languages..."
171=内部安裝: 正在安裝%1種語言...
172=用户取消内部安裝過程。
173=内部安裝失敗。
174=所有語言已成功安裝
# e.g "Installing Windows Vista update: KB123456..."
175=正在安裝 Windows Vista 更新: %1...
176=解壓更新文件錯誤! 請再試一次。
# e.g. "Windows Vista update "KB940157" was installed successfully."
177=Windows Vista "%1" 更新已成功安裝。
# e.g. "Installing Windows update: Windows Update Agent v123..."
178=正在安裝 Windows update: %1...
# e.g. "Windows update "Windows Update Agent v123" was installed successfully."
179=Windows update "%1" 已成功安裝。
# e.g "Installing Windows 7 update: KB123456..."
180=正在安裝 Windows 7 更新: %1...
# e.g. "Windows 7 update "KB123456" was installed successfully."
181=Windows 7 "%1" 更新已成功安裝
# e.g. "Removing Spanish language..."
182=正在移動%1...
# e.g. "Uninstalling English language..."
183=正在卸載%1...
184=卸載失敗。
# e.g. "English language was uninstalled successfully."
185=%1已成功卸載。
# e.g. "English language was removed successfully."
186=%1已成功移動。
# e.g. "Spanish language was uninstalled. Display language reverted to current language: English."
187=%1已成功卸載。顯示語言已回復為現行語言: %2。
# e.g. "Spanish language was removed. Display language reverted to current language: English."
188=%1已移動。顯示語言已回復為現行語言: %2。
189=正在檢測重要的更新...
# e.g."Loading Windows Vista update: KB123456.msu"
190=正在加載 Windows Vista 更新: %1
# e.g."Loading Windows 7 update: KB123456.msu"
191=正在加載 Windows 7 更新: %1
# e.g. "Languages need to be upgraded to SP1 before installing Windows update: KB123456."
192=需要更新語言到 SP%1,才能安裝 Windows update: %2。
193=需要更新語言到 SP%1,才能安裝 “Windows Update Agent”。
194=用户取消 Windows update 的安裝過程
195=用户取消 Windows Update 的安裝過程
# e.g. "Loading program's language file: Spanish.lang"
196=正在加載程序的語言包: %1

[Progress dialog]
# e.g. "Loading Spanish language pack"
240=正在加載%1語言包
241=正在確認文件的完整性...
# e.g. "Express installation: Installing Spanish"
242=快速安裝: 正在安裝%1
# e.g. "Express installation: Spanish is being upgraded to SP1"
243=快速安裝: 正在更新%1至 SP1
244=快速安裝: 正在更新%1至 SP2
245=快速安裝: 正在更新%1至 SP3
# e.g. "Internal installation: Installing Spanish"
246=内部安裝: 正在安裝%1
# e.g. "Internal installation: Installing 3 languages"
247=内部安裝: 正在安裝%1種語言
248=正在擴大語言包... (過程 1/4)
249=正在解壓語言包... (過程 2/4)
250=正在删除臨時文件... (過程 3/4)
251=正在更新註冊表設定... (過程 4/4)
252=正在準備内部安裝
253=請稍候...
# e.g. "This may take up to 30 minutes, please wait..."
254=本過程可能佔用約%1分钟的时间,請稍候...
255=正在安裝 Windows Vista 更新
256=這個在加載文件...
# e.g. "Updating Spanish language..."
257=正在更新%1...
258=正在删除臨時文件...
259=正在安裝 Windows 7 更新
# e.g. "Removing Spanish"
260=正在移動%1
261=正在删除語言包...
# e.g. "Uninstalling Spanish"
262=正在卸載%1
263=正在加載 Windows 語言包
264=正在轉換文件...

[Windows Vista MUI languages]
# different forms of a particular language (leading/trailing spaces are ignored), separated by ";"
# e.g. in German: "300=Dänisch; dänisch; dänischer; dänische; dänisches"
# there can be up to 9 forms, the specific form can be chosen like this: e.g. "240=Loading %1#2 language pack"
# if not specified or non-existent the first form is used: i.e. "240=Loading %1 language pack"
300=丹麥語
301=德語
302=英語
303=西班牙語
304=芬蘭語
305=法語
306=意大利語
307=日語
308=韓國語
309=挪威語
310=荷蘭語
311=葡萄牙語 (巴西)
312=俄語
313=瑞典語
314=中文 (簡体)
315=中文 (繁体)
316=阿拉伯語
317=保加利亞語
318=捷克語
319=希臘語
320=爱沙尼亞語
321=希伯來語
322=克羅地亞語
323=匈牙利語
324=立陶宛語
325=拉脱维亞語
326=波瀾語
327=葡萄牙語 (葡萄牙)
328=羅馬尼亞語
329=斯洛伐克語
330=斯洛文尼亞語
331=塞爾维亞語 (拉丁語)
332=泰語
333=土耳其語
334=烏克蘭語
335=中文 (臺灣)

[Windows Vista LIP languages]
350=阿薩姆語
351=孟加拉語
352=波斯尼亞語(西里爾)
353=波斯尼亞(拉丁)
354=加泰罗尼亞語
355=威爾士
356=巴斯克
357=加利西亞語
358=古吉拉特語
359=印地語
360=印尼語
361=冰島語
362=哈撒克語
363=坎納達語
364=孔卡尼語
365=吉爾吉斯語
366=馬其頓語
367=馬來亞語
368=馬拉語
369=馬來語
370=挪威文(耐諾斯克挪威語)
371=奧里雅語
372=旁遮普語
373=阿爾巴尼亞語
374=塞爾维亞語(西里爾)
375=泰米爾語
376=韃靼語
377=烏茲别克語(拉丁)
378=越南語
379=因纽特語
380=馬來語(文莱)
381=泰卢固語
382=格鲁吉亞語
383=阿塞拜疆語
384=亞美尼亞
385=南非荷兰語
386=塞索托語
387=科萨語
388=祖鲁語
389=卢森堡語
390=菲律宾語
391=孟加拉語(孟加拉国)
392=塞兹瓦纳語
393=老挝語
394=高棉語
395=波斯語
396=伊博語
397=约鲁巴語
398=豪萨語(拉丁)
399=马耳他語
400=僧伽罗語
401=Maori
402=Urdu
403=Nepali
404=Quechua

[Windows 7 MUI languages]
450=丹麦語
451=德語
452=英語
453=西班牙語
454=芬兰語
455=法語
456=意大利語
457=日語
458=韩国語
459=挪威語
460=荷兰語
461=葡萄牙語 (巴西)
462=俄語
463=瑞典語
464=中文 (简体)
465=中文 (繁体)
466=阿拉伯語
467=保加利亞語
468=捷克語
469=希腊語
470=爱沙尼亞語
471=希伯来語
472=克罗地亞語
473=匈牙利語
474=立陶宛語
475=拉脱维亞語
476=波兰語
477=葡萄牙語 (葡萄牙)
478=罗马尼亞語
479=斯洛伐克語
480=斯洛文尼亞語
481=塞爾维亞語 (拉丁語)
482=泰語
483=土耳其語
484=乌克兰語
485=中文 (台湾)

[Windows 7 LIP languages]
500=印地語
501=加泰罗尼亞語
502=塞爾维亞語(西里爾)
503=冰岛語
504=威爾士
505=越南語
506=挪威文(耐諾斯克挪威語)
507=波斯語
508=巴斯克
509=加利西亞語
510=古吉拉特語
511=阿萨姆與
512=印尼語
513=哈撒克語
514=坎納達語
515=馬來亞語
516=馬拉語
517=奧里雅語
518=阿爾巴尼亞語
519=泰米爾語
520=泰卢固語

[Information/warning/error messages in a system dialog]
600=命令行参數:||/? - 幫助窗口|/h - 幫助窗口|/c -
在程序的文件夾中保存語言組態|/p - 顯示内部安裝過程
601=應用變化需要註銷。|繼續之前,請您保存所有的工作!
602=應用變化需要重新起動您的系统。|繼續之前,請您保存所有的工作!
603=這不是 Windows 的語言包!
604=64-bit Windows 不支持 LIP 語言包。
605=文件類型錯誤! 請使用其它文件。
606=加載語言包錯誤!||請確認語言包已經成功下載:|使用 MD5 檢查器檢查他的完整性。
607=無法識别的語言區域設置: 不支持本語言或文件已損壞。|請使用
Vistalizator 的最新版本或打開另一個文件。
608=本語言包不可用於 Windows Vista 或 Windows 7。
609=本語言包只能用於 Windows Vista。|您用的是 Windows 7 操作系统。
610=本語言包只能用於 Windows 7。|您用的是 Windows Vista 操作系统。
611=不是 Windows 語言包! 請使用另一個文件。
# e.g. "To install Catalan language one of the required parent MUI languages must be installed
first:|Spanish or French"
# %2 is a list of languages separated by message #081 (" or ")
612=安裝%1需要先安裝其中一種 MUI 父語言:|%2
# e.g. "To install Albanian language the required parent MUI language must be installed first: English."
613=安裝%1需要先安裝 MUI 父語言: %2.
# e.g. "This language pack is for 32-bit Windows Vista only.|You have a 64-bit operating system."
614=本語言包僅能用於 32-bit %1。|您擁有的是 64-bit 操作系统。
615=本語言包僅能用於 64-bit %1。|您擁有的是 32-bit 操作系统。
616=此語言包僅與 Windows Vista RTM 兼容。|您擁有的是包含 SP1 的 Windows Vista。
617=此語言包僅與 Windows Vista RTM 兼容。|您擁有的是包含 SP2 的 Windows Vista。
618=此語言包僅與 Windows Vista RTM 兼容。|您擁有的是包含 SP3 的 Windows Vista。
619=此語言包與 Windows Vista RTM 或 SP1 兼容。|您擁有的是包含 SP2 的 Windows Vista。
620=此語言包與 Windows Vista RTM 或 SP1 兼容。|您擁有的是包含 SP3 的 Windows Vista。
621=此語言包與 Windows Vista RTM、SP1 或 SP2 兼容。|您擁有的是包含 SP3 的 Windows Vista。
622=此語言包僅與 Windows 7 RTM 兼容。|您擁有的是包含 SP1 的 Windows 7。
623=此語言包僅與 Windows 7 RTM 兼容。|您擁有的是包含 SP2 的 Windows 7。
624=此語言包僅與 Windows 7 RTM 兼容。|您擁有的是包含 SP3 的 Windows 7。
625=此語言包與 Windows 7 RTM 或 SP1 兼容。|您擁有的是包含 SP2 的 Windows 7。
626=此語言包與 Windows 7 RTM 或 SP1 兼容。|您擁有的是包含 SP3 的 Windows 7。
627=此語言包與 Windows 7 RTM、SP1 或 SP2 兼容。|您擁有的是包含 SP3 的 Windows 7。
# e.g. "Spanish language is already installed.|Please try another one."
628=%1已安裝。|請再試别的語言。
# e.g. "Spanish language is already installed.|Skipping..."
629=%1已安裝。|省略中...
# e.g. "Spanish was installed on Windows Vista RTM. You should upgrade it to SP1, but it is currently
used.|Please change to another language, restart Windows and try again."
# %2 can be "Windows Vista" or "Windows 7", %3 can be RTM/SP1/SP2, %3 can be RTM/SP1/SP2/SP3
630=%1已安裝在%2 %3上。您應該更新至%4,可文件正在被利用中。|請更換另外一種語言、重新啟動Windows,然後再試一次。
# e.g. "Spanish was installed on Windows 7 SP1. Do you want to upgrade it to be SP2 compatible?"
631=%1已安裝在%2 %3上。您要更新到與%4兼容的版本吗?
# e.g. "You should upgrade SPanish language to SP1 as soon as possible."
632=您應該盡快更新%1至%2。
# e.g. Spanish language pack is already loaded.|Skipping...
633=已經加載%1的語言包。省略中...
634=錯誤: 更新Windows註冊表失敗!
# e.g. "Done! Do you want to make Spanish language the new display language?"
635=成功! 您需要更改顯示語言為%1吗?
# e.g. "Spanish should be upgraded to SP1."
636=應該更新%1至SP1。
637=應該更新%1至SP2。
638=應該更新%1至SP3。
639=退出程序註銷,使更改生效。
# e.g. "You may need to update the new language:|Press the Update languages button to finalize the
installation.||Then exit program to restart the system for the changes to take effect."
# %1 = message #013 ("Update languages")
640=您可能要更新新語言種類:|單擊 %1 按鈕完成安裝。||然後退出程序重新啟動系统,以使更改生效。
# e.g. "You can find Spanish language in the list of installed languages. Select it and press the Change
language button to activate it.||Always check that Windows Update is functioning after starting to use
the new language! See details in Help."
# %2 = message #011 ("Change
language")
641=您可以在已安裝語言的表格上發現%1。需要激活本語言,選取語言然後單擊
%2 按鈕。||請随时檢查Windows Update在安裝新語言之後,是否正常運行!請阅讀幫助文件了解详细信息。
642=内部安裝失敗! 由於本功能為試用功能,成功是無法保证的。您可以用快速安裝模式。
643=内部安裝失敗!
由於本功能為試用功能,成功是無法保证的。您可以用快速安裝模式。|或许,您可以重新使用
/p 参數運行 Vistalizator查看關於安裝過程或任何錯誤的信息。
644=退出程序重新啟動系统,以使更改生效。
# e.g. "You may need to update the new language:|Press the Update languages button to finalize the installation."
# %1 = message #013 ("Update languages")
645=您可能需要更新新語言:|單擊 %1 按鈕完成安裝。
646=您可能需要更新新語言:|單擊 %1 按鈕完成安裝。
647=加載文件錯誤!||請確認所有Windows更新文件已完整下載:|用 MD5 檢查器確認文件完整性。
# e.g. This language has been installed before installing Service Pack 2 for Windows Vista.|It can be used
but should be upgraded to SP2 as soon as possible. You can do this by installing SP2 Spanish language
pack.||Do you really want to change language?
648=本語言是在安裝%2的Service Pack
%1之前所安裝的。|語言还可以使用,可應該盡快更改至SP%1。您可以通過安裝
SP%1 %3語言包来更新語言。||您是否確定您要更改語言?
# e.g. "Spanish should be upgraded to SP1."
649=應該更新%1至SP1。
650=應該更新%1至SP2。
651=應該更新%1至SP3。
# e.g. "Ooops, cannot find any parent language for Catalan!|Install French or Spanish first to be able to
change display language to Catalan."
# %2 is a list of languages separated by message #081 (" or ") if more than 1 language is applicaple
652=找不到任何%1的父語言!|安裝%2以能够更改顯示語言為%1。

[Message dialogs: Update languages Button]
653=沒有在快速模式中安裝的MUI語言:|沒有需要安裝的Windows update。
654=沒有需要安裝的Windows update。
# e.g. "The current version of your Windows Update Agent (6.0.6000.16386) is not supported..."
655=不支持您的 Windows Update Agent (%1) 的版本。請確認您有最新的Vistalizator。|如果您的版本是最新的,並遇到錯誤,請與作者聯繫。
656=不能驗證您的Windows Update Agent (%1)的版本。請確認您有最新的Vistalizator。|如果您的版本是最新的,並遇到錯誤,請與作者聯繫。
# %1 is e.g. Windows Udate Agent v123|Windows Search 4.0
657=沒有需要安裝的Windows update。|現在支持這些更新:||%1
658=沒有需要安裝的Windows update。|現在支持這些更新:||%1
659=需要安裝此Windows update:|(下載鏈接在幫助文件中)||%1
660=需要安裝此Windows update:|(下載鏈接在幫助文件中)||%1
661=不受支持的文件格式 (需要 EXE 或 MSU)! 請試用其它文件。
662=檔案標題讀取錯誤!不是Windows update或者不支持此文件。|請試用其它文件。
663=包裝讀取錯誤!|確認文件已完整下載。
664=無法識别Windows update的結構 (32位/64位)。
665=此更新僅適用於Windows Vista。|您擁有的是Windows 7操作系统。
666=此更新僅適用於Windows 7。|您擁有的是Windows Vista操作系统。
667=此更新僅適用於32位Windows Vista。|您擁有的是64位操作系统。
668=此更新僅適用於64位Windows Vista。|您擁有的是32位操作系统。
669=此更新僅適用於32位Windows 7。|您擁有的是64位操作系统。
670=此更新僅適用於64位Windows 7。|您擁有的是32位操作系统。
671=不是Windows update或者不支持此文件!|請試用其它文件。
672=Windows update文件處理錯誤:無法識别的版本
673=不支持本Windows update。|很可能不需要安裝。
# e.g. "Integrity validation failed for 32-bit Windows update: KB123456.|Make sure the file
downloaded properly."
674=32位Windows update的完整性驗證失敗: %1。|確認文件已完整下載
675=64位Windows update的完整性驗證失敗: %1。|確認文件已完整下載
# e.g. "Spanish"
676=由於系统在使用一些文件,無法更新現行語言(%1)。|請更改語言、重新啟動Windows然後再試一次。
677=由於系统在使用一些文件,無法更新現行語言(%1)。處理過程將跳過此語言...|請更改語言、重新啟動Windows然後再試一次。
# e.g. "Parent language (Spanish) of the current language (Catalan) cannot be updated..."
678=由於系统在使用一些文件,無法更新現行語言(%2)的父語言(%1)|請更改語言、重新啟動Windows然後再試一次。
679=由於系统在使用一些文件,無法更新現行語言(%2)的父語言(%1)。處理過程將跳過此語言...|請更改語言、重新啟動Windows然後再試一次。
# e.g. "Windows update KB123456 doesn't need to be applied to any language."
680=Windows update %1對任何語言沒有效應。
# MUI language as part of a list, e.g. "Spanish" or "French, Spanish", items separated by message #682 (", ")
681=%1
# a separator to a list of languages (e.g. "French, Spanish, German"); quotes used to keep
leading/trailing spaces (won't be used)
682="、"
# e.g. "KB940157 (Windows Search 4.0) for languages:" or "Windows Update Agent (v7.2.6001.788) for languages:"
# a list of languages follows (an item form specified by message #681) after the sentence, separated by
message #682 (", ") if there are too many items (on separate lines otherwise)
683=適用於這些語言的%1 (%2):
# e.g. "Windows update KB123456 can be applied to the following language after its upgrade to SP1: Spanish."
684=Windows update %1更新到SP%2後可以應用於這些語言: %3。
# a list of languages follows (an item form specified by message #681) after the sentence, separated by
message #682 (", ") if there are too many items (on separate lines otherwise)
685=Windows update %1更新到SP%2後可以應用於下列語言:||
# e.g. "Windows update KB123456 will be applied to the following language: Spanish."
686=Windows update %1將應用於這些語言: %2。
# a list of languages follows (an item form specified by message #681) after the sentence, separated by
message #682 (", ") if there are too many items (on separate lines otherwise)
687=Windows update %1 將應用於下列語言:||
688=這不是Windows Update Agent安裝程序或不支持本文件。|請使用其它文件。
689=加載文件中遇到内部錯誤。
# e.g. "This version (7.3.6002.123) of Windows Update Agent is not supported."
690=不支持Windows Update Agent的此版本(%1)。
# e.g. "Integrity validation failed for: Windows Update Agent v7.2.6001.788 for 32-bit Windows.|Make
sure the file downloaded properly."
691=完整性驗證失敗在於: 適用於32位Windows的Windows Update Agent v%1。|請確認文件已完整下載。
692=完整性驗證失敗在於: 適用於64位Windows的Windows Update Agent v%1。|請確認文件已完整下載。
# e.g. "This version of Windows Update Agent (v7.3.6002.123) differs from that required: 7.2.6001.788."
693=Windows Update Agent (v%1) 的版本與需要的版本有所不同: %2.
694=Windows Update Agent (v%1) 的版本與需要的版本有所不同
# e.g. "Windows Update Agent v7.2.6001.788 doesn't need to be applied to any language."
695=Windows Update Agent v%1對任何語言沒有效應。
# e.g. "Windows Update Agent v7.2.6001.788 can be applied to the following language after its upgrade to
SP1: Spanish."
696=Windows Update Agent v%1更新到SP%2後可以應用於這些語言: %3。
# a list of languages follows (an item form specified by message #681) after the sentence, separated by
message #682 (", ") if there are too many items (on separate lines otherwise)
697=Windows Update Agent v%1更新到SP%2後可以應用於下列語言:||
# e.g. "Windows Update Agent v7.2.6001.788 will be applied to the following language: Spanish."
698=Windows Update Agent v%1將應用於這些語言: %2。
# a list of languages follows (an item form specified by message #681) after the sentence, separated by
message #682 (", ") if there are too many items (on separate lines otherwise)
699=Windows Update Agent v%1將應用於下列語言:||

[Message dialogs: Remove language Button]
# "Catalan: no alternative parent language"
700=%1:沒有供選擇的父語言
# MUI language as part of a list, e.g. "(not installed) Spanish" or "(not installed) French or (not
installed) Spanish", the list is then a supplement of message #703
701=(沒安裝)%1
# MUI language as part of a list, e.g. "Spanish" or "French or Spanish", the list is then a supplement of
message #703
702=%1
# e.g. "Catalan: (not installed) French or (not installed) Spanish" or "Catalan: French or Spanish"
# %2 can be message #701 and/or #702
703=%1: %2
# e.g. "Spanish can be removed as the dependent Catalan language can use French as an alternative parent language."
704=可以移動%1,因為有關的%2可以用%3為供選的父語言。
# e.g. "Croatian can be removed as the dependent Bosnian (latin) language can use English or Serbian
(latin) as alternative parent languages."
705=可以移動%1,因為有關的%2可以用%3為供選的父語言。
# e.g. "English can be removed as all dependent LIP languages can use other installed languages as
alternative parent languages:||"
# "Azeri: Russian"
# "Luxembourgish: French"
# "Bosnian (cyrillic): Croatian or Serbian (latin)"
706=可以移動%1,因為有關的LIP語言可以用其他已安裝的語言為供選語言:||%2
# e.g. "Spanish cannot be removed as there is a dependent LIP language installed:||Catalan: (not
installed) French||First remove this LIP language or install its alternative parent language(s) and
then try again."
707=不可以移動%1,因為有其它已安裝的有關的LIP語言:||%2||首先要移動此LIP語言或安裝其它父語言,然後再試一次。
# e.g. "English cannot be removed as the dependent Albanian language can't use another alternative parent
language.||Remove this LIP language first and try again."
708=不可以移動%1,因為有關的%2不能用其它的父語言。||首先要移動此LIP語言,然後再試一次。
# e.g. "English cannot be removed as there are dependent LIP languages without an alternative parent language:||
# "Albanian: no alternative parent language"
# "Azeri: (not installed) Russian"
# "First remove all LIP languages without an alternative parent language and/or install alternative
parent languages and then try again."
709=不可以移動%1,因為有關的LIP沒有其它可選的父語言:||%2||首先要移動此LIP語言或安裝其它父語言,然後再試一次。
# e.g. "English cannot be removed as there are dependent LIP languages without an alternative parent language:||
# "Albanian: no alternative parent language"
# "Armenian: no alternative parent language"
# "First remove all LIP languages and then try again."
710=不可以移動%1,因為有關的LIP沒有其它可選的父語言:||%2||首先要移動此LIP語言,然後再試一次。
# e.g. "English is the parent language of the new display language: Albanian.|Removing it will revert
the display language back to current language: Catalan on Spanish."
711=%1是新顯示語言的父語言: %2。|移動語言會回復顯示語言到此語言:%4上的%3。
# e.g. "English is the parent language of the new display language: Albanian.|Removing it will revert
the display language back to current language: Spanish."
712=%1是新顯示語言的父語言: %2。|移動語言會回復顯示語言到此語言:%3。
# e.g "Do you really want to uninstall English language?"
# applies to Internal languages: will be uninstalled by Windows installer
713=您是否確定需要移動%1?
# applies to Express languages: will be removed by Vistalizator
714=您是否確定需要移動%1?
# e.g. "Do you really want to uninstall Spanish language?|Uninstalling it will revert the display
language back to current language: Catalan on Spanish."
715=您是否確定需要移動%1?|移動語言會回復顯示語言到此語言:%3上的%2。
716=您是否確定需要移動%1?|移動語言會回復顯示語言到此語言:%3上的%2。
# e.g. "Do you really want to uninstall Spanish language?|Uninstalling it will revert the display
language back to current language: English."
717=您是否確定需要移動%1?|移動語言會回復顯示語言到此語言: %2。
718=您是否確定需要移動%1?|移動語言會回復顯示語言到此語言: %2。
719=卸載失敗!
720=您可能要重新啟動系统,完成卸載過程。
721=請注意,Windows不會更新在快速模式中安裝的MUI語言。查看幫助文件了解使用Vistalizator更新語言的方法。|虽然是實驗用的MUI語言的功能,您應該先試用内部安裝
# e.g. "Not enough free space on disk C: for temporary data.|At least 500 MB is required. Free some disk
space and try again."
722=%1:磁碟的空間不足臨時資料|最少需要%2 MB的空间。請釋放一些磁碟空間,然後再試一次。
# e.g. "Your system should be upgraded to the latest Service Pack for Windows Vista, which is SP2 at the
moment. You can use Windows Update or download a standalone Service Pack package (download link can be
found in Help).|Note that it is suggested to change back to the original language (English) or another
Internal language to make sure the Service Pack will be installed successfully.
723=您的系统將被更新最新%1的Service
Pack,現在為SP%2。您可以使用Windows Update或下載独立Service Pack安裝包
(下載連接在幫助文件中)。|請注意,建議您先更改顯示語言設為原始語言
(%3) 或其它内部語言,確認Service Pack成功安裝。
# a checkbox message in a window with the above message
724=不要再顯示此信息。
# e.g. "A language with English name "Spanish" is already loaded.|This file will be skipped from processing."
725=已加載英語名稱為 “%1” 的語言。|此文件在處理過程中將被跳過。
# e.g. "All language files exported successfully to:|C:\Program Files\Vistalizator\Languages"
726=所有語言文件已輸出至:|%1
727=Note that MUI languages installed in Express mode are not kept up to date by Windows. See Help for
details how to update them by Vistalizator itself.|You are encouraged to try Internal installation first.
------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
Openvpn-devel mailing list
Openvpn-devel <at> lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openvpn-devel
Samuli Seppänen | 16 May 13:27
Favicon

Pre-2.3-alpha2 Windows installers now available

Hi all,

Here are the first fully-functional Windows installers built (by me)
with Alon's new cross-compilation environment (a.k.a. "generic"
buildsystem):

<http://build.openvpn.net/downloads/snapshots/openvpn-install-2.3_master-I000_master-i686.exe>
<http://build.openvpn.net/downloads/snapshots/openvpn-install-2.3_master-I000_master-x86_64.exe>

The installers and executables and libraries in them have been signed
with a self-signed test certificate. This means that Windows Vista/7
64-bit will refuse to install the (self-signed) TAP-drivers, unless this
CA certificate is in the system keystore:

<http://build.openvpn.net/downloads/openvpntestca-cert.cer>

This certificate can be imported using Microsoft management console
(mmc.exe):

- Add  the "Certificates" snap-in
- Go to "Trusted root certificates"
- Right-click "Certificates"
- Select "All tasks" -> "Import"

After this you can run the OpenVPN installer and it should just work. A
version of OpenVPN signed with paid-for certificate is coming soonish.
That one will work on any supported Windows version without jumping
through these hoops.

Have fun (and please report back any issues you find),

--

-- 
Samuli Seppänen
Community Manager
OpenVPN Technologies, Inc

irc freenode net: mattock

------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
Alon Bar-Lev | 16 May 09:17
Picon
Gravatar

eurephia plugin

Hello David,

I guess this is yours:
---
 *  Additions for eurephia plugin done by:
 *         David Sommerseth <dazo <at> users.sourceforge.net> Copyright (C) 2009
---

Looking at the code the eurephia plugin only do the following:
---
#ifdef ENABLE_PLUGIN_EUREPHIA
  /* export X509 cert SHA1 fingerprint */
  {
    unsigned char *sha1_hash = x509_get_sha1_hash(peer_cert, &gc);

    openvpn_snprintf (envname, sizeof(envname), "tls_digest_%d", cert_depth);
    setenv_str (es, envname, format_hex_ex(sha1_hash, SHA_DIGEST_LENGTH, 0, 1,
                                          ":", &gc));
  }
#endif
---

Can you please explain what this plugin is and why just remove the conditional?

Thanks,
Alon.

------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
Alon Bar-Lev | 16 May 00:21
Picon
Gravatar

[PATCH] cleanup: update .gitignore

Signed-off-by: Alon Bar-Lev <alon.barlev <at> gmail.com>
---
 .gitignore |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

diff --git a/.gitignore b/.gitignore
index 9f546a3..f762089 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,5 @@
 *.[oa]
+*.l[oa]
 *.dll
 *.exe
 *.exe.*
@@ -17,6 +18,7 @@ Release
 Debug
 Win32-Output
 .deps
+.libs
 Makefile
 Makefile.in
 aclocal.m4
--

-- 
1.7.3.4

------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
Alon Bar-Lev | 15 May 00:42
Picon
Gravatar

[PATCH] build: integrate plugins build into core build

As disucssed[1], keep plugins in repository.

1, Proper automake/libtool build.

2. Move example plugins to samples/sample-plugins.

3. Plugins are installed at LIBDIR/openvpn/plugins.

[1] http://comments.gmane.org/gmane.network.openvpn.devel/6436

Signed-off-by: Alon Bar-Lev <alon.barlev <at> gmail.com>
---
 configure.ac                            |   63 +++++++
 distro/rpm/openvpn.spec.in              |   47 +-----
 doc/Makefile.am                         |    5 +-
 doc/README.plugins                      |   47 +++++
 sample/Makefile.am                      |    1 +
 sample/sample-plugins/defer/README      |   16 ++
 sample/sample-plugins/defer/build       |   15 ++
 sample/sample-plugins/defer/simple.c    |  305 +++++++++++++++++++++++++++++++
 sample/sample-plugins/defer/simple.def  |    6 +
 sample/sample-plugins/defer/winbuild    |   18 ++
 sample/sample-plugins/log/build         |   15 ++
 sample/sample-plugins/log/log.c         |  184 +++++++++++++++++++
 sample/sample-plugins/log/log_v3.c      |  247 +++++++++++++++++++++++++
 sample/sample-plugins/log/winbuild      |   18 ++
 sample/sample-plugins/simple/README     |   16 ++
 sample/sample-plugins/simple/build      |   15 ++
 sample/sample-plugins/simple/simple.c   |  120 ++++++++++++
 sample/sample-plugins/simple/simple.def |    6 +
 sample/sample-plugins/simple/winbuild   |   18 ++
 src/Makefile.am                         |    5 +-
 src/plugins/Makefile.am                 |   15 ++
 src/plugins/README                      |   47 -----
 src/plugins/auth-pam/Makefile           |   32 ----
 src/plugins/auth-pam/Makefile.am        |   27 +++
 src/plugins/auth-pam/README             |   74 --------
 src/plugins/auth-pam/README.auth-pam    |   74 ++++++++
 src/plugins/auth-pam/auth-pam.c         |   18 +-
 src/plugins/auth-pam/auth-pam.exports   |    4 +
 src/plugins/auth-pam/pamdl.c            |    8 +-
 src/plugins/auth-pam/pamdl.h            |    4 +-
 src/plugins/defer/README                |   16 --
 src/plugins/defer/build                 |   15 --
 src/plugins/defer/simple.c              |  305 -------------------------------
 src/plugins/defer/simple.def            |    6 -
 src/plugins/defer/winbuild              |   18 --
 src/plugins/down-root/Makefile          |   18 --
 src/plugins/down-root/Makefile.am       |   23 +++
 src/plugins/down-root/README            |   29 ---
 src/plugins/down-root/README.down-root  |   29 +++
 src/plugins/down-root/down-root.c       |    6 +-
 src/plugins/down-root/down-root.exports |    4 +
 src/plugins/examples/README             |   16 --
 src/plugins/examples/build              |   15 --
 src/plugins/examples/log.c              |  184 -------------------
 src/plugins/examples/log_v3.c           |  247 -------------------------
 src/plugins/examples/simple.c           |  120 ------------
 src/plugins/examples/simple.def         |    6 -
 src/plugins/examples/winbuild           |   18 --
 48 files changed, 1317 insertions(+), 1228 deletions(-)
 create mode 100644 doc/README.plugins
 create mode 100644 sample/sample-plugins/defer/README
 create mode 100755 sample/sample-plugins/defer/build
 create mode 100644 sample/sample-plugins/defer/simple.c
 create mode 100755 sample/sample-plugins/defer/simple.def
 create mode 100755 sample/sample-plugins/defer/winbuild
 create mode 100755 sample/sample-plugins/log/build
 create mode 100644 sample/sample-plugins/log/log.c
 create mode 100644 sample/sample-plugins/log/log_v3.c
 create mode 100755 sample/sample-plugins/log/winbuild
 create mode 100644 sample/sample-plugins/simple/README
 create mode 100755 sample/sample-plugins/simple/build
 create mode 100644 sample/sample-plugins/simple/simple.c
 create mode 100755 sample/sample-plugins/simple/simple.def
 create mode 100755 sample/sample-plugins/simple/winbuild
 create mode 100644 src/plugins/Makefile.am
 delete mode 100644 src/plugins/README
 delete mode 100755 src/plugins/auth-pam/Makefile
 create mode 100644 src/plugins/auth-pam/Makefile.am
 delete mode 100644 src/plugins/auth-pam/README
 create mode 100644 src/plugins/auth-pam/README.auth-pam
 create mode 100644 src/plugins/auth-pam/auth-pam.exports
 delete mode 100644 src/plugins/defer/README
 delete mode 100755 src/plugins/defer/build
 delete mode 100644 src/plugins/defer/simple.c
 delete mode 100755 src/plugins/defer/simple.def
 delete mode 100755 src/plugins/defer/winbuild
 delete mode 100755 src/plugins/down-root/Makefile
 create mode 100644 src/plugins/down-root/Makefile.am
 delete mode 100644 src/plugins/down-root/README
 create mode 100644 src/plugins/down-root/README.down-root
 create mode 100644 src/plugins/down-root/down-root.exports
 delete mode 100644 src/plugins/examples/README
 delete mode 100755 src/plugins/examples/build
 delete mode 100644 src/plugins/examples/log.c
 delete mode 100644 src/plugins/examples/log_v3.c
 delete mode 100644 src/plugins/examples/simple.c
 delete mode 100755 src/plugins/examples/simple.def
 delete mode 100755 src/plugins/examples/winbuild

diff --git a/configure.ac b/configure.ac
index 4592727..c1fa12e 100644
--- a/configure.ac
+++ b/configure.ac
 <at>  <at>  -194,6 +194,27  <at>  <at>  AC_ARG_ENABLE(
 )
 
 AC_ARG_ENABLE(
+	[plugin-auth-pam],
+	[AS_HELP_STRING([--disable-plugin-auth-pam], [disable auth-pam plugin  <at> <: <at> default=yes <at> :> <at> ])],
+	,
+	[enable_plugin_auth_pam="yes"]
+)
+
+AC_ARG_ENABLE(
+	[plugin-down-root],
+	[AS_HELP_STRING([--disable-plugin-down-root], [disable down-root plugin  <at> <: <at> default=yes <at> :> <at> ])],
+	,
+	[enable_plugin_down_root="yes"]
+)
+
+AC_ARG_ENABLE(
+	[pam-dlopen],
+	[AS_HELP_STRING([--enable-pam-dlopen], [dlopen libpam  <at> <: <at> default=no <at> :> <at> ])],
+	,
+	[enable_pam_dlopen="no"]
+)
+
+AC_ARG_ENABLE(
 	[strict],
 	[AS_HELP_STRING([--enable-strict], [enable strict compiler warnings (debugging option)  <at> <: <at> default=no <at> :> <at> ])],
 	,
 <at>  <at>  -258,6 +279,14  <at>  <at>  AC_ARG_WITH(
 	[with_crypto_library="openssl"]
 )
 
+AC_ARG_WITH(
+	[plugindir],
+	[AS_HELP_STRING([--with-plugindir], [plugin directory  <at> <: <at> default=LIBDIR/openvpn <at> :> <at> ])],
+	,
+	[with_plugindir="\$(libdir)/openvpn/plugins"]
+)
+
+
 AC_DEFINE_UNQUOTED([TARGET_ALIAS], ["${host}"], [A string representing our host])
 case "$host" in
 	*-*-linux*)
 <at>  <at>  -622,6 +651,16  <at>  <at>  AC_CHECK_LIB(
 )
 AC_SUBST([SELINUX_LIBS])
 
+AC_ARG_VAR([LIBPAM_CFLAGS], [C compiler flags for libpam])
+AC_ARG_VAR([LIBPAM_LIBS], [linker flags for libpam])
+if test -z "${LIBPAM_LIBS}"; then
+	AC_CHECK_LIB(
+		[pam],
+		[pam_start],
+		[LIBPAM_LIBS="-lpam"]
+	)
+fi
+
 case "${with_mem_check}" in
 	valgrind)
 		AC_CHECK_HEADER(
 <at>  <at>  -871,6 +910,9  <at>  <at>  if test "${enable_plugins}" = "yes"; then
 	OPTIONAL_DL_LIBS="${DL_LIBS}"
 	AC_DEFINE([ENABLE_PLUGIN], [1], [Enable systemd support])
 	test "${enable_eurephia}" = "yes" && AC_DEFINE([ENABLE_EUREPHIA], [1], [Enable support for the eurephia plug-in])
+else
+	enable_plugin_auth_pam="no"
+	enable_plugin_down_root="no"
 fi
 
 if test "${enable_iproute2}" = "yes"; then
 <at>  <at>  -922,6 +964,17  <at>  <at>  if test "${WIN32}" = "yes"; then
 	test -z "${MAN2HTML}" && AC_MSG_ERROR([man2html is required for win32])
 fi
 
+if test "${enable_plugin_auth_pam}" = "yes"; then
+	PLUGIN_AUTH_PAM_CFLAGS="${LIBPAM_CFLAGS}"
+	if test "${enable_pam_dlopen}" = "yes"; then
+		AC_DEFINE([USE_PAM_DLOPEN], [1], [dlopen libpam])
+		PLUGIN_AUTH_PAM_LIBS="${DL_LIBS}"
+	else
+		test -z "${LIBPAM_LIBS}" && AC_MSG_ERROR([libpam required but missing])
+		PLUGIN_AUTH_PAM_LIBS="${LIBPAM_LIBS}"
+	fi
+fi
+
 CONFIGURE_DEFINES="`set | grep '^enable_.*=' ; set | grep '^with_.*='`"
 AC_DEFINE_UNQUOTED([CONFIGURE_DEFINES], ["`echo ${CONFIGURE_DEFINES}`"], [Configuration settings])
 
 <at>  <at>  -944,10 +997,17  <at>  <at>  AC_SUBST([OPTIONAL_LZO_LIBS])
 AC_SUBST([OPTIONAL_PKCS11_HELPER_CFLAGS])
 AC_SUBST([OPTIONAL_PKCS11_HELPER_LIBS])
 
+AC_SUBST([PLUGIN_AUTH_PAM_CFLAGS])
+AC_SUBST([PLUGIN_AUTH_PAM_LIBS])
+
 AM_CONDITIONAL([WIN32], [test "${WIN32}" = "yes"])
 AM_CONDITIONAL([GIT_CHECKOUT], [test "${GIT_CHECKOUT}" = "yes"])
+AM_CONDITIONAL([ENABLE_PLUGIN_AUTH_PAM], [test "${enable_plugin_auth_pam}" = "yes"])
+AM_CONDITIONAL([ENABLE_PLUGIN_DOWN_ROOT], [test "${enable_plugin_down_root}" = "yes"])
 
+plugindir="${with_plugindir}"
 sampledir="\$(docdir)/sample"
+AC_SUBST([plugindir])
 AC_SUBST([sampledir])
 
 AC_CONFIG_FILES([
 <at>  <at>  -964,6 +1024,9  <at>  <at>  AC_CONFIG_FILES([
 	src/compat/Makefile
 	src/openvpn/Makefile
 	src/openvpnserv/Makefile
+	src/plugins/Makefile
+	src/plugins/auth-pam/Makefile
+	src/plugins/down-root/Makefile
 	tests/Makefile
 	sample/Makefile
 	doc/Makefile
diff --git a/distro/rpm/openvpn.spec.in b/distro/rpm/openvpn.spec.in
index 3c316bf..20a8c89 100644
--- a/distro/rpm/openvpn.spec.in
+++ b/distro/rpm/openvpn.spec.in
 <at>  <at>  -83,13 +83,6  <at>  <at>  Development support for OpenVPN.
 %endif
 
 #
-# Should we build the auth-pam module?
-#
-
-%define build_auth_pam 1
-%{?without_pam:%define build_auth_pam 0}
-
-#
 # Other definitions
 #
 
 <at>  <at>  -108,20 +101,9  <at>  <at>  Development support for OpenVPN.
 	--docdir="%{_docdir}/%{name}-%{version}" \
 	%{?with_password_save:--enable-password-save} \
 	%{!?without_lzo:--enable-lzo} \
-	%{?with_pkcs11:--enable-pkcs11}
-%__make
-
-# Build down-root plugin
-pushd src/plugins/down-root
+	%{?with_pkcs11:--enable-pkcs11} \
+	%{?without_pam:--disable-plugin-auth-pam}
 %__make
-popd
-
-# Build auth-pam plugin
-%if %{build_auth_pam}
-pushd src/plugins/auth-pam
-%__make
-popd
-%endif
 
 #
 # Installation section
 <at>  <at>  -143,29 +125,8  <at>  <at>  popd
 # Install /etc/openvpn
 %__install -c -d -m 755 "%{buildroot}/etc/%{name}"
 
-#
-# Build /usr/share/openvpn
-#
-
-%__mkdir_p %{buildroot}%{_datadir}/%{name}
-
-#
-# Install the plugins
-#
-
-%__mkdir_p "%{buildroot}%{_datadir}/%{name}/plugins/lib"
-
-for pi in auth-pam down-root; do
-  %__mv -f src/plugins/$pi/README src/plugins/README.$pi
-  if [ -e src/plugins/$pi/openvpn-$pi.so ]; then
-    %__install -c -m 755 src/plugins/$pi/openvpn-$pi.so "%{buildroot}%{_datadir}/openvpn/plugins/lib/openvpn-$pi.so"
-  fi
-done
-
-%__mv -f src/plugins/README src/plugins/README.plugins
-
 # Install extra %doc stuff
-cp -r AUTHORS ChangeLog NEWS contrib/ sample/ src/plugins/README.* \
+cp -r AUTHORS ChangeLog NEWS contrib/ sample/ \
 	"%{buildroot}/%{_docdir}/%{name}-%{version}"
 
 #
 <at>  <at>  -218,7 +179,7  <at>  <at>  fi
 %defattr(-,root,root)
 %{_mandir}
 %{_sbindir}/%{name}
-%{_datadir}/%{name}
+%{_libdir}/%{name}
 %{_docdir}/%{name}-%{version}
 %dir /etc/%{name}
 %if "%{VENDOR}" == "SuSE"
diff --git a/doc/Makefile.am b/doc/Makefile.am
index 46687b2..d33e1ed 100644
--- a/doc/Makefile.am
+++ b/doc/Makefile.am
 <at>  <at>  -17,8 +17,11  <at>  <at>  CLEANFILES = openvpn.8.html
 dist_doc_DATA = \
 	management-notes.txt
 
+dist_noinst_DATA = \
+	README.plugins
+
 if WIN32
-dist_noinst_DATA = openvpn.8
+dist_noinst_DATA += openvpn.8
 nodist_html_DATA = openvpn.8.html
 openvpn.8.html: $(srcdir)/openvpn.8
 	$(MAN2HTML) < $(srcdir)/openvpn.8 > openvpn.8.html
diff --git a/doc/README.plugins b/doc/README.plugins
new file mode 100644
index 0000000..6e490c5
--- /dev/null
+++ b/doc/README.plugins
 <at>  <at>  -0,0 +1,47  <at>  <at> 
+OpenVPN Plugins
+---------------
+
+Starting with OpenVPN 2.0-beta17, compiled plugin modules are
+supported on any *nix OS which includes libdl or on Windows.
+One or more modules may be loaded into OpenVPN using
+the --plugin directive, and each plugin module is capable of
+intercepting any of the script callbacks which OpenVPN supports:
+
+(1) up
+(2) down
+(3) route-up
+(4) ipchange
+(5) tls-verify
+(6) auth-user-pass-verify
+(7) client-connect
+(8) client-disconnect
+(9) learn-address
+
+See the openvpn-plugin.h file in the top-level directory of the
+OpenVPN source distribution for more detailed information
+on the plugin interface.
+
+Included Plugins
+----------------
+
+auth-pam -- Authenticate using PAM and a split privilege
+            execution model which functions even if
+            root privileges or the execution environment
+            have been altered with --user/--group/--chroot.
+            Tested on Linux only.
+
+down-root -- Enable the running of down scripts with root privileges
+             even if --user/--group/--chroot have been used
+             to drop root privileges or change the execution
+             environment.  Not applicable on Windows.
+
+examples -- A simple example that demonstrates a portable
+            plugin, i.e. one which can be built for *nix
+            or Windows from the same source.
+
+Building Plugins
+----------------
+
+cd to the top-level directory of a plugin, and use the
+"make" command to build it.  The examples plugin is
+built using a build script, not a makefile.
diff --git a/sample/Makefile.am b/sample/Makefile.am
index 8e35bfc..be30c88 100644
--- a/sample/Makefile.am
+++ b/sample/Makefile.am
 <at>  <at>  -13,6 +13,7  <at>  <at>  MAINTAINERCLEANFILES = \
 	$(srcdir)/Makefile.in
 
 EXTRA_DIST = \
+	sample-plugins \
 	sample-config-files \
 	sample-windows \
 	sample-keys \
diff --git a/sample/sample-plugins/defer/README b/sample/sample-plugins/defer/README
new file mode 100644
index 0000000..d8990f8
--- /dev/null
+++ b/sample/sample-plugins/defer/README
 <at>  <at>  -0,0 +1,16  <at>  <at> 
+OpenVPN plugin examples.
+
+Examples provided:
+
+simple.c -- using the --auth-user-pass-verify callback,
+            test deferred authentication.
+
+To build:
+
+  ./build simple (Linux/BSD/etc.)
+  ./winbuild simple (MinGW on Windows)
+
+To use in OpenVPN, add to config file:
+
+  plugin simple.so (Linux/BSD/etc.)
+  plugin simple.dll (MinGW on Windows)
diff --git a/sample/sample-plugins/defer/build b/sample/sample-plugins/defer/build
new file mode 100755
index 0000000..0612c08
--- /dev/null
+++ b/sample/sample-plugins/defer/build
 <at>  <at>  -0,0 +1,15  <at>  <at> 
+#!/bin/sh
+
+#
+# Build an OpenVPN plugin module on *nix.  The argument should
+# be the base name of the C source file (without the .c).
+#
+
+# This directory is where we will look for openvpn-plugin.h
+CPPFLAGS="${CPPFLAGS:--I../../../include}"
+
+CC="${CC:-gcc}"
+CFLAGS="${CFLAGS:--O2 -Wall -g}"
+
+$CC $CPPFLAGS $CFLAGS -fPIC -c $1.c && \
+$CC $CFLAGS -fPIC -shared ${LDFLAS} -Wl,-soname,$1.so -o $1.so $1.o -lc
diff --git a/sample/sample-plugins/defer/simple.c b/sample/sample-plugins/defer/simple.c
new file mode 100644
index 0000000..6539865
--- /dev/null
+++ b/sample/sample-plugins/defer/simple.c
 <at>  <at>  -0,0 +1,305  <at>  <at> 
+/*
+ *  OpenVPN -- An application to securely tunnel IP networks
+ *             over a single TCP/UDP port, with support for SSL/TLS-based
+ *             session authentication and key exchange,
+ *             packet encryption, packet authentication, and
+ *             packet compression.
+ *
+ *  Copyright (C) 2002-2010 OpenVPN Technologies, Inc. <sales <at> openvpn.net>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License version 2
+ *  as published by the Free Software Foundation.
+ *
+ *  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 (see the file COPYING included with this
+ *  distribution); if not, write to the Free Software Foundation, Inc.,
+ *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+/*
+ * This file implements a simple OpenVPN plugin module which
+ * will test deferred authentication and packet filtering.
+ * 
+ * Will run on Windows or *nix.
+ *
+ * Sample usage:
+ *
+ * setenv test_deferred_auth 20
+ * setenv test_packet_filter 10
+ * plugin plugin/defer/simple.so
+ *
+ * This will enable deferred authentication to occur 20
+ * seconds after the normal TLS authentication process,
+ * and will cause a packet filter file to be generated 10
+ * seconds after the initial TLS negotiation, using
+ * {common-name}.pf as the source.
+ *
+ * Sample packet filter configuration:
+ *
+ * [CLIENTS DROP]
+ * +otherclient
+ * [SUBNETS DROP]
+ * +10.0.0.0/8
+ * -10.10.0.8
+ * [END]
+ *
+ * See the README file for build instructions.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "openvpn-plugin.h"
+
+/* bool definitions */
+#define bool int
+#define true 1
+#define false 0
+
+/*
+ * Our context, where we keep our state.
+ */
+
+struct plugin_context {
+  int test_deferred_auth;
+  int test_packet_filter;
+};
+
+struct plugin_per_client_context {
+  int n_calls;
+  bool generated_pf_file;
+};
+
+/*
+ * Given an environmental variable name, search
+ * the envp array for its value, returning it
+ * if found or NULL otherwise.
+ */
+static const char *
+get_env (const char *name, const char *envp[])
+{
+  if (envp)
+    {
+      int i;
+      const int namelen = strlen (name);
+      for (i = 0; envp[i]; ++i)
+	{
+	  if (!strncmp (envp[i], name, namelen))
+	    {
+	      const char *cp = envp[i] + namelen;
+	      if (*cp == '=')
+		return cp + 1;
+	    }
+	}
+    }
+  return NULL;
+}
+
+/* used for safe printf of possible NULL strings */
+static const char *
+np (const char *str)
+{
+  if (str)
+    return str;
+  else
+    return "[NULL]";
+}
+
+static int
+atoi_null0 (const char *str)
+{
+  if (str)
+    return atoi (str);
+  else
+    return 0;
+}
+
+OPENVPN_EXPORT openvpn_plugin_handle_t
+openvpn_plugin_open_v1 (unsigned int *type_mask, const char *argv[], const char *envp[])
+{
+  struct plugin_context *context;
+
+  printf ("FUNC: openvpn_plugin_open_v1\n");
+
+  /*
+   * Allocate our context
+   */
+  context = (struct plugin_context *) calloc (1, sizeof (struct plugin_context));
+
+  context->test_deferred_auth = atoi_null0 (get_env ("test_deferred_auth", envp));
+  printf ("TEST_DEFERRED_AUTH %d\n", context->test_deferred_auth);
+
+  context->test_packet_filter = atoi_null0 (get_env ("test_packet_filter", envp));
+  printf ("TEST_PACKET_FILTER %d\n", context->test_packet_filter);
+
+  /*
+   * Which callbacks to intercept.
+   */
+  *type_mask =
+    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_UP) |
+    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_DOWN) |
+    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_ROUTE_UP) |
+    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_IPCHANGE) |
+    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_TLS_VERIFY) |
+    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_AUTH_USER_PASS_VERIFY) |
+    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_CLIENT_CONNECT_V2) |
+    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_CLIENT_DISCONNECT) |
+    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_LEARN_ADDRESS) |
+    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_TLS_FINAL) |
+    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_ENABLE_PF);
+
+  return (openvpn_plugin_handle_t) context;
+}
+
+static int
+auth_user_pass_verify (struct plugin_context *context, struct plugin_per_client_context *pcc, const char *argv[], const char *envp[])
+{
+  if (context->test_deferred_auth)
+    {
+      /* get username/password from envp string array */
+      const char *username = get_env ("username", envp);
+      const char *password = get_env ("password", envp);
+
+      /* get auth_control_file filename from envp string array*/
+      const char *auth_control_file = get_env ("auth_control_file", envp);
+
+      printf ("DEFER u='%s' p='%s' acf='%s'\n",
+	      np(username),
+	      np(password),
+	      np(auth_control_file));
+
+      /* Authenticate asynchronously in n seconds */
+      if (auth_control_file)
+	{
+	  char buf[256];
+	  int auth = 2;
+	  sscanf (username, "%d", &auth);
+	  snprintf (buf, sizeof(buf), "( sleep %d ; echo AUTH %s %d ; echo %d >%s ) &",
+		    context->test_deferred_auth,
+		    auth_control_file,
+		    auth,
+		    pcc->n_calls < auth,
+		    auth_control_file);
+	  printf ("%s\n", buf);
+	  system (buf);
+	  pcc->n_calls++;
+	  return OPENVPN_PLUGIN_FUNC_DEFERRED;
+	}
+      else
+	return OPENVPN_PLUGIN_FUNC_ERROR;
+    }
+  else
+    return OPENVPN_PLUGIN_FUNC_SUCCESS;
+}
+
+static int
+tls_final (struct plugin_context *context, struct plugin_per_client_context *pcc, const char *argv[], const char *envp[])
+{
+  if (context->test_packet_filter)
+    {
+      if (!pcc->generated_pf_file)
+	{
+	  const char *pff = get_env ("pf_file", envp);
+	  const char *cn = get_env ("username", envp);
+	  if (pff && cn)
+	    {
+	      char buf[256];
+	      snprintf (buf, sizeof(buf), "( sleep %d ; echo PF %s/%s ; cp \"%s.pf\" \"%s\" ) &",
+			context->test_packet_filter, cn, pff, cn, pff);
+	      printf ("%s\n", buf);
+	      system (buf);
+	      pcc->generated_pf_file = true;
+	      return OPENVPN_PLUGIN_FUNC_SUCCESS;
+	    }
+	  else
+	    return OPENVPN_PLUGIN_FUNC_ERROR;
+	}
+      else
+	return OPENVPN_PLUGIN_FUNC_ERROR;
+    }
+  else
+    return OPENVPN_PLUGIN_FUNC_SUCCESS;
+}
+
+OPENVPN_EXPORT int
+openvpn_plugin_func_v2 (openvpn_plugin_handle_t handle,
+			const int type,
+			const char *argv[],
+			const char *envp[],
+			void *per_client_context,
+			struct openvpn_plugin_string_list **return_list)
+{
+  struct plugin_context *context = (struct plugin_context *) handle;
+  struct plugin_per_client_context *pcc = (struct plugin_per_client_context *) per_client_context;
+  switch (type)
+    {
+    case OPENVPN_PLUGIN_UP:
+      printf ("OPENVPN_PLUGIN_UP\n");
+      return OPENVPN_PLUGIN_FUNC_SUCCESS;
+    case OPENVPN_PLUGIN_DOWN:
+      printf ("OPENVPN_PLUGIN_DOWN\n");
+      return OPENVPN_PLUGIN_FUNC_SUCCESS;
+    case OPENVPN_PLUGIN_ROUTE_UP:
+      printf ("OPENVPN_PLUGIN_ROUTE_UP\n");
+      return OPENVPN_PLUGIN_FUNC_SUCCESS;
+    case OPENVPN_PLUGIN_IPCHANGE:
+      printf ("OPENVPN_PLUGIN_IPCHANGE\n");
+      return OPENVPN_PLUGIN_FUNC_SUCCESS;
+    case OPENVPN_PLUGIN_TLS_VERIFY:
+      printf ("OPENVPN_PLUGIN_TLS_VERIFY\n");
+      return OPENVPN_PLUGIN_FUNC_SUCCESS;
+    case OPENVPN_PLUGIN_AUTH_USER_PASS_VERIFY:
+      printf ("OPENVPN_PLUGIN_AUTH_USER_PASS_VERIFY\n");
+      return auth_user_pass_verify (context, pcc, argv, envp);
+    case OPENVPN_PLUGIN_CLIENT_CONNECT_V2:
+      printf ("OPENVPN_PLUGIN_CLIENT_CONNECT_V2\n");
+      return OPENVPN_PLUGIN_FUNC_SUCCESS;
+    case OPENVPN_PLUGIN_CLIENT_DISCONNECT:
+      printf ("OPENVPN_PLUGIN_CLIENT_DISCONNECT\n");
+      return OPENVPN_PLUGIN_FUNC_SUCCESS;
+    case OPENVPN_PLUGIN_LEARN_ADDRESS:
+      printf ("OPENVPN_PLUGIN_LEARN_ADDRESS\n");
+      return OPENVPN_PLUGIN_FUNC_SUCCESS;
+    case OPENVPN_PLUGIN_TLS_FINAL:
+      printf ("OPENVPN_PLUGIN_TLS_FINAL\n");
+      return tls_final (context, pcc, argv, envp);
+    case OPENVPN_PLUGIN_ENABLE_PF:
+      printf ("OPENVPN_PLUGIN_ENABLE_PF\n");
+      if (context->test_packet_filter)
+	return OPENVPN_PLUGIN_FUNC_SUCCESS;
+      else
+	return OPENVPN_PLUGIN_FUNC_ERROR;
+    default:
+      printf ("OPENVPN_PLUGIN_?\n");
+      return OPENVPN_PLUGIN_FUNC_ERROR;
+    }
+}
+
+OPENVPN_EXPORT void *
+openvpn_plugin_client_constructor_v1 (openvpn_plugin_handle_t handle)
+{
+  printf ("FUNC: openvpn_plugin_client_constructor_v1\n");
+  return calloc (1, sizeof (struct plugin_per_client_context));
+}
+
+OPENVPN_EXPORT void
+openvpn_plugin_client_destructor_v1 (openvpn_plugin_handle_t handle, void *per_client_context)
+{
+  printf ("FUNC: openvpn_plugin_client_destructor_v1\n");
+  free (per_client_context);
+}
+
+OPENVPN_EXPORT void
+openvpn_plugin_close_v1 (openvpn_plugin_handle_t handle)
+{
+  struct plugin_context *context = (struct plugin_context *) handle;
+  printf ("FUNC: openvpn_plugin_close_v1\n");
+  free (context);
+}
diff --git a/sample/sample-plugins/defer/simple.def b/sample/sample-plugins/defer/simple.def
new file mode 100755
index 0000000..a87507d
--- /dev/null
+++ b/sample/sample-plugins/defer/simple.def
 <at>  <at>  -0,0 +1,6  <at>  <at> 
+LIBRARY   OpenVPN_PLUGIN_SAMPLE
+DESCRIPTION "Sample OpenVPN plug-in module."
+EXPORTS
+   openvpn_plugin_open_v1    <at> 1
+   openvpn_plugin_func_v1    <at> 2
+   openvpn_plugin_close_v1   <at> 3
diff --git a/sample/sample-plugins/defer/winbuild b/sample/sample-plugins/defer/winbuild
new file mode 100755
index 0000000..82927d9
--- /dev/null
+++ b/sample/sample-plugins/defer/winbuild
 <at>  <at>  -0,0 +1,18  <at>  <at> 
+#
+# Build an OpenVPN plugin module on Windows/MinGW.
+# The argument should be the base name of the C source file
+# (without the .c).
+#
+
+# This directory is where we will look for openvpn-plugin.h
+INCLUDE="-I../../../build"
+
+CC_FLAGS="-O2 -Wall"
+
+gcc -DBUILD_DLL $CC_FLAGS $INCLUDE -c $1.c
+gcc --disable-stdcall-fixup -mdll -DBUILD_DLL -o junk.tmp -Wl,--base-file,base.tmp $1.o
+rm junk.tmp
+dlltool --dllname $1.dll --base-file base.tmp --output-exp temp.exp --input-def $1.def
+rm base.tmp
+gcc --enable-stdcall-fixup -mdll -DBUILD_DLL -o $1.dll $1.o -Wl,temp.exp
+rm temp.exp
diff --git a/sample/sample-plugins/log/build b/sample/sample-plugins/log/build
new file mode 100755
index 0000000..bbb05f7
--- /dev/null
+++ b/sample/sample-plugins/log/build
 <at>  <at>  -0,0 +1,15  <at>  <at> 
+#!/bin/sh
+
+#
+# Build an OpenVPN plugin module on *nix.  The argument should
+# be the base name of the C source file (without the .c).
+#
+
+# This directory is where we will look for openvpn-plugin.h
+CPPFLAGS="${CPPFLAGS:--I../../..}"
+
+CC="${CC:-gcc}"
+CFLAGS="${CFLAGS:--O2 -Wall -g}"
+
+$CC $CPPFLAGS $CFLAGS -fPIC -c $1.c && \
+$CC $CFLAGS -fPIC -shared $LDFLAGS -Wl,-soname,$1.so -o $1.so $1.o -lc
diff --git a/sample/sample-plugins/log/log.c b/sample/sample-plugins/log/log.c
new file mode 100644
index 0000000..1cc4650
--- /dev/null
+++ b/sample/sample-plugins/log/log.c
 <at>  <at>  -0,0 +1,184  <at>  <at> 
+/*
+ *  OpenVPN -- An application to securely tunnel IP networks
+ *             over a single TCP/UDP port, with support for SSL/TLS-based
+ *             session authentication and key exchange,
+ *             packet encryption, packet authentication, and
+ *             packet compression.
+ *
+ *  Copyright (C) 2002-2010 OpenVPN Technologies, Inc. <sales <at> openvpn.net>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License version 2
+ *  as published by the Free Software Foundation.
+ *
+ *  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 (see the file COPYING included with this
+ *  distribution); if not, write to the Free Software Foundation, Inc.,
+ *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+/*
+ * This plugin is similar to simple.c, except it also logs extra information
+ * to stdout for every plugin method called by OpenVPN.
+ *
+ * See the README file for build instructions.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "openvpn-plugin.h"
+
+/*
+ * Our context, where we keep our state.
+ */
+struct plugin_context {
+  const char *username;
+  const char *password;
+};
+
+/*
+ * Given an environmental variable name, search
+ * the envp array for its value, returning it
+ * if found or NULL otherwise.
+ */
+static const char *
+get_env (const char *name, const char *envp[])
+{
+  if (envp)
+    {
+      int i;
+      const int namelen = strlen (name);
+      for (i = 0; envp[i]; ++i)
+	{
+	  if (!strncmp (envp[i], name, namelen))
+	    {
+	      const char *cp = envp[i] + namelen;
+	      if (*cp == '=')
+		return cp + 1;
+	    }
+	}
+    }
+  return NULL;
+}
+
+OPENVPN_EXPORT openvpn_plugin_handle_t
+openvpn_plugin_open_v1 (unsigned int *type_mask, const char *argv[], const char *envp[])
+{
+  struct plugin_context *context;
+
+  /*
+   * Allocate our context
+   */
+  context = (struct plugin_context *) calloc (1, sizeof (struct plugin_context));
+
+  /*
+   * Set the username/password we will require.
+   */
+  context->username = "foo";
+  context->password = "bar";
+
+  /*
+   * Which callbacks to intercept.
+   */
+  *type_mask =
+    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_UP) |
+    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_DOWN) |
+    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_ROUTE_UP) |
+    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_IPCHANGE) |
+    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_TLS_VERIFY) |
+    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_AUTH_USER_PASS_VERIFY) |
+    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_CLIENT_CONNECT_V2) |
+    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_CLIENT_DISCONNECT) |
+    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_LEARN_ADDRESS) |
+    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_TLS_FINAL);
+
+  return (openvpn_plugin_handle_t) context;
+}
+
+void
+show (const int type, const char *argv[], const char *envp[])
+{
+  size_t i;
+  switch (type)
+    {
+    case OPENVPN_PLUGIN_UP:
+      printf ("OPENVPN_PLUGIN_UP\n");
+      break;
+    case OPENVPN_PLUGIN_DOWN:
+      printf ("OPENVPN_PLUGIN_DOWN\n");
+      break;
+    case OPENVPN_PLUGIN_ROUTE_UP:
+      printf ("OPENVPN_PLUGIN_ROUTE_UP\n");
+      break;
+    case OPENVPN_PLUGIN_IPCHANGE:
+      printf ("OPENVPN_PLUGIN_IPCHANGE\n");
+      break;
+    case OPENVPN_PLUGIN_TLS_VERIFY:
+      printf ("OPENVPN_PLUGIN_TLS_VERIFY\n");
+      break;
+    case OPENVPN_PLUGIN_AUTH_USER_PASS_VERIFY:
+      printf ("OPENVPN_PLUGIN_AUTH_USER_PASS_VERIFY\n");
+      break;
+    case OPENVPN_PLUGIN_CLIENT_CONNECT_V2:
+      printf ("OPENVPN_PLUGIN_CLIENT_CONNECT_V2\n");
+      break;
+    case OPENVPN_PLUGIN_CLIENT_DISCONNECT:
+      printf ("OPENVPN_PLUGIN_CLIENT_DISCONNECT\n");
+      break;
+    case OPENVPN_PLUGIN_LEARN_ADDRESS:
+      printf ("OPENVPN_PLUGIN_LEARN_ADDRESS\n");
+      break;
+    case OPENVPN_PLUGIN_TLS_FINAL:
+      printf ("OPENVPN_PLUGIN_TLS_FINAL\n");
+      break;
+    default:
+      printf ("OPENVPN_PLUGIN_?\n");
+      break;
+    }
+
+  printf ("ARGV\n");
+  for (i = 0; argv[i] != NULL; ++i)
+    printf ("%d '%s'\n", (int)i, argv[i]);
+
+  printf ("ENVP\n");
+  for (i = 0; envp[i] != NULL; ++i)
+    printf ("%d '%s'\n", (int)i, envp[i]);
+}
+
+OPENVPN_EXPORT int
+openvpn_plugin_func_v1 (openvpn_plugin_handle_t handle, const int type, const char *argv[], const char *envp[])
+{
+  struct plugin_context *context = (struct plugin_context *) handle;
+
+  show (type, argv, envp);
+
+  /* check entered username/password against what we require */
+  if (type == OPENVPN_PLUGIN_AUTH_USER_PASS_VERIFY)
+    {
+      /* get username/password from envp string array */
+      const char *username = get_env ("username", envp);
+      const char *password = get_env ("password", envp);
+
+      if (username && !strcmp (username, context->username)
+	  && password && !strcmp (password, context->password))
+	return OPENVPN_PLUGIN_FUNC_SUCCESS;
+      else
+	return OPENVPN_PLUGIN_FUNC_ERROR;
+    }
+  else
+    return OPENVPN_PLUGIN_FUNC_SUCCESS;
+}
+
+OPENVPN_EXPORT void
+openvpn_plugin_close_v1 (openvpn_plugin_handle_t handle)
+{
+  struct plugin_context *context = (struct plugin_context *) handle;
+  free (context);
+}
diff --git a/sample/sample-plugins/log/log_v3.c b/sample/sample-plugins/log/log_v3.c
new file mode 100644
index 0000000..742c756
--- /dev/null
+++ b/sample/sample-plugins/log/log_v3.c
 <at>  <at>  -0,0 +1,247  <at>  <at> 
+/*
+ *  OpenVPN -- An application to securely tunnel IP networks
+ *             over a single TCP/UDP port, with support for SSL/TLS-based
+ *             session authentication and key exchange,
+ *             packet encryption, packet authentication, and
+ *             packet compression.
+ *
+ *  Copyright (C) 2002-2009 OpenVPN Technologies, Inc. <sales <at> openvpn.net>
+ *  Copyright (C) 2010 David Sommerseth <dazo <at> users.sourceforge.net>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License version 2
+ *  as published by the Free Software Foundation.
+ *
+ *  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 (see the file COPYING included with this
+ *  distribution); if not, write to the Free Software Foundation, Inc.,
+ *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+/*
+ * This plugin is similar to simple.c, except it also logs extra information
+ * to stdout for every plugin method called by OpenVPN.  The only difference
+ * between this (log_v3.c) and log.c is that this module uses the v3 plug-in
+ * API.
+ *
+ * See the README file for build instructions.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#define ENABLE_SSL
+
+#include "openvpn-plugin.h"
+
+/*
+ * Our context, where we keep our state.
+ */
+struct plugin_context {
+  const char *username;
+  const char *password;
+};
+
+/*
+ * Given an environmental variable name, search
+ * the envp array for its value, returning it
+ * if found or NULL otherwise.
+ */
+static const char *
+get_env (const char *name, const char *envp[])
+{
+  if (envp)
+    {
+      int i;
+      const int namelen = strlen (name);
+      for (i = 0; envp[i]; ++i)
+	{
+	  if (!strncmp (envp[i], name, namelen))
+	    {
+	      const char *cp = envp[i] + namelen;
+	      if (*cp == '=')
+		return cp + 1;
+	    }
+	}
+    }
+  return NULL;
+}
+
+OPENVPN_EXPORT int
+openvpn_plugin_open_v3 (const int v3structver,
+                        struct openvpn_plugin_args_open_in const *args,
+                        struct openvpn_plugin_args_open_return *ret)
+{
+  struct plugin_context *context = NULL;
+
+  /* Check that we are API compatible */
+  if( v3structver != OPENVPN_PLUGINv3_STRUCTVER ) {
+    return OPENVPN_PLUGIN_FUNC_ERROR;
+  }
+
+  /*  Which callbacks to intercept.  */
+  ret->type_mask =
+    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_UP) |
+    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_DOWN) |
+    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_ROUTE_UP) |
+    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_IPCHANGE) |
+    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_TLS_VERIFY) |
+    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_AUTH_USER_PASS_VERIFY) |
+    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_CLIENT_CONNECT_V2) |
+    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_CLIENT_DISCONNECT) |
+    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_LEARN_ADDRESS) |
+    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_TLS_FINAL);
+
+
+  /* Allocate our context */
+  context = (struct plugin_context *) calloc (1, sizeof (struct plugin_context));
+
+  /* Set the username/password we will require. */
+  context->username = "foo";
+  context->password = "bar";
+
+  /* Point the global context handle to our newly created context */
+  ret->handle = (void *) context;
+
+  return OPENVPN_PLUGIN_FUNC_SUCCESS;
+}
+
+void
+show (const int type, const char *argv[], const char *envp[])
+{
+  size_t i;
+  switch (type)
+    {
+    case OPENVPN_PLUGIN_UP:
+      printf ("OPENVPN_PLUGIN_UP\n");
+      break;
+    case OPENVPN_PLUGIN_DOWN:
+      printf ("OPENVPN_PLUGIN_DOWN\n");
+      break;
+    case OPENVPN_PLUGIN_ROUTE_UP:
+      printf ("OPENVPN_PLUGIN_ROUTE_UP\n");
+      break;
+    case OPENVPN_PLUGIN_IPCHANGE:
+      printf ("OPENVPN_PLUGIN_IPCHANGE\n");
+      break;
+    case OPENVPN_PLUGIN_TLS_VERIFY:
+      printf ("OPENVPN_PLUGIN_TLS_VERIFY\n");
+      break;
+    case OPENVPN_PLUGIN_AUTH_USER_PASS_VERIFY:
+      printf ("OPENVPN_PLUGIN_AUTH_USER_PASS_VERIFY\n");
+      break;
+    case OPENVPN_PLUGIN_CLIENT_CONNECT_V2:
+      printf ("OPENVPN_PLUGIN_CLIENT_CONNECT_V2\n");
+      break;
+    case OPENVPN_PLUGIN_CLIENT_DISCONNECT:
+      printf ("OPENVPN_PLUGIN_CLIENT_DISCONNECT\n");
+      break;
+    case OPENVPN_PLUGIN_LEARN_ADDRESS:
+      printf ("OPENVPN_PLUGIN_LEARN_ADDRESS\n");
+      break;
+    case OPENVPN_PLUGIN_TLS_FINAL:
+      printf ("OPENVPN_PLUGIN_TLS_FINAL\n");
+      break;
+    default:
+      printf ("OPENVPN_PLUGIN_?\n");
+      break;
+    }
+
+  printf ("ARGV\n");
+  for (i = 0; argv[i] != NULL; ++i)
+    printf ("%d '%s'\n", (int)i, argv[i]);
+
+  printf ("ENVP\n");
+  for (i = 0; envp[i] != NULL; ++i)
+    printf ("%d '%s'\n", (int)i, envp[i]);
+}
+
+static void
+x509_print_info (X509 *x509crt)
+{
+  int i, n;
+  int fn_nid;
+  ASN1_OBJECT *fn;
+  ASN1_STRING *val;
+  X509_NAME *x509_name;
+  X509_NAME_ENTRY *ent;
+  const char *objbuf;
+  unsigned char *buf;
+
+  x509_name = X509_get_subject_name (x509crt);
+  n = X509_NAME_entry_count (x509_name);
+  for (i = 0; i < n; ++i)
+    {
+      ent = X509_NAME_get_entry (x509_name, i);
+      if (!ent)
+	continue;
+      fn = X509_NAME_ENTRY_get_object (ent);
+      if (!fn)
+	continue;
+      val = X509_NAME_ENTRY_get_data (ent);
+      if (!val)
+	continue;
+      fn_nid = OBJ_obj2nid (fn);
+      if (fn_nid == NID_undef)
+	continue;
+      objbuf = OBJ_nid2sn (fn_nid);
+      if (!objbuf)
+	continue;
+      buf = (unsigned char *)1; /* bug in OpenSSL 0.9.6b ASN1_STRING_to_UTF8 requires this workaround */
+      if (ASN1_STRING_to_UTF8 (&buf, val) <= 0)
+	continue;
+
+      printf("X509 %s: %s\n", objbuf, (char *)buf);
+      OPENSSL_free (buf);
+    }
+}
+
+
+
+OPENVPN_EXPORT int
+openvpn_plugin_func_v3 (const int version,
+                        struct openvpn_plugin_args_func_in const *args,
+                        struct openvpn_plugin_args_func_return *retptr)
+{
+  struct plugin_context *context = (struct plugin_context *) args->handle;
+
+  printf("\nopenvpn_plugin_func_v3() :::::>> ");
+  show (args->type, args->argv, args->envp);
+
+  /* Dump some X509 information if we're in the TLS_VERIFY phase */
+  if ((args->type == OPENVPN_PLUGIN_TLS_VERIFY) && args->current_cert ) {
+    printf("---- X509 Subject information ----\n");
+    printf("Certificate depth: %i\n", args->current_cert_depth);
+    x509_print_info(args->current_cert);
+    printf("----------------------------------\n");
+  }
+
+  /* check entered username/password against what we require */
+  if (args->type == OPENVPN_PLUGIN_AUTH_USER_PASS_VERIFY)
+    {
+      /* get username/password from envp string array */
+      const char *username = get_env ("username", args->envp);
+      const char *password = get_env ("password", args->envp);
+
+      if (username && !strcmp (username, context->username)
+	  && password && !strcmp (password, context->password))
+	return OPENVPN_PLUGIN_FUNC_SUCCESS;
+      else
+	return OPENVPN_PLUGIN_FUNC_ERROR;
+    }
+  else
+    return OPENVPN_PLUGIN_FUNC_SUCCESS;
+}
+
+OPENVPN_EXPORT void
+openvpn_plugin_close_v1 (openvpn_plugin_handle_t handle)
+{
+  struct plugin_context *context = (struct plugin_context *) handle;
+  free (context);
+}
diff --git a/sample/sample-plugins/log/winbuild b/sample/sample-plugins/log/winbuild
new file mode 100755
index 0000000..decf05f
--- /dev/null
+++ b/sample/sample-plugins/log/winbuild
 <at>  <at>  -0,0 +1,18  <at>  <at> 
+#
+# Build an OpenVPN plugin module on Windows/MinGW.
+# The argument should be the base name of the C source file
+# (without the .c).
+#
+
+# This directory is where we will look for openvpn-plugin.h
+INCLUDE="-I../../../include"
+
+CC_FLAGS="-O2 -Wall"
+
+gcc -DBUILD_DLL $CC_FLAGS $INCLUDE -c $1.c
+gcc --disable-stdcall-fixup -mdll -DBUILD_DLL -o junk.tmp -Wl,--base-file,base.tmp $1.o
+rm junk.tmp
+dlltool --dllname $1.dll --base-file base.tmp --output-exp temp.exp --input-def $1.def
+rm base.tmp
+gcc --enable-stdcall-fixup -mdll -DBUILD_DLL -o $1.dll $1.o -Wl,temp.exp
+rm temp.exp
diff --git a/sample/sample-plugins/simple/README b/sample/sample-plugins/simple/README
new file mode 100644
index 0000000..4400cd3
--- /dev/null
+++ b/sample/sample-plugins/simple/README
 <at>  <at>  -0,0 +1,16  <at>  <at> 
+OpenVPN plugin examples.
+
+Examples provided:
+
+simple.c -- using the --auth-user-pass-verify callback, verify
+            that the username/password is "foo"/"bar".
+
+To build:
+
+  ./build simple (Linux/BSD/etc.)
+  ./winbuild simple (MinGW on Windows)
+
+To use in OpenVPN, add to config file:
+
+  plugin simple.so (Linux/BSD/etc.)
+  plugin simple.dll (MinGW on Windows)
diff --git a/sample/sample-plugins/simple/build b/sample/sample-plugins/simple/build
new file mode 100755
index 0000000..bbb05f7
--- /dev/null
+++ b/sample/sample-plugins/simple/build
 <at>  <at>  -0,0 +1,15  <at>  <at> 
+#!/bin/sh
+
+#
+# Build an OpenVPN plugin module on *nix.  The argument should
+# be the base name of the C source file (without the .c).
+#
+
+# This directory is where we will look for openvpn-plugin.h
+CPPFLAGS="${CPPFLAGS:--I../../..}"
+
+CC="${CC:-gcc}"
+CFLAGS="${CFLAGS:--O2 -Wall -g}"
+
+$CC $CPPFLAGS $CFLAGS -fPIC -c $1.c && \
+$CC $CFLAGS -fPIC -shared $LDFLAGS -Wl,-soname,$1.so -o $1.so $1.o -lc
diff --git a/sample/sample-plugins/simple/simple.c b/sample/sample-plugins/simple/simple.c
new file mode 100644
index 0000000..f26d89f
--- /dev/null
+++ b/sample/sample-plugins/simple/simple.c
 <at>  <at>  -0,0 +1,120  <at>  <at> 
+/*
+ *  OpenVPN -- An application to securely tunnel IP networks
+ *             over a single TCP/UDP port, with support for SSL/TLS-based
+ *             session authentication and key exchange,
+ *             packet encryption, packet authentication, and
+ *             packet compression.
+ *
+ *  Copyright (C) 2002-2010 OpenVPN Technologies, Inc. <sales <at> openvpn.net>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License version 2
+ *  as published by the Free Software Foundation.
+ *
+ *  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 (see the file COPYING included with this
+ *  distribution); if not, write to the Free Software Foundation, Inc.,
+ *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+/*
+ * This file implements a simple OpenVPN plugin module which
+ * will examine the username/password provided by a client,
+ * and make an accept/deny determination.  Will run
+ * on Windows or *nix.
+ *
+ * See the README file for build instructions.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "openvpn-plugin.h"
+
+/*
+ * Our context, where we keep our state.
+ */
+struct plugin_context {
+  const char *username;
+  const char *password;
+};
+
+/*
+ * Given an environmental variable name, search
+ * the envp array for its value, returning it
+ * if found or NULL otherwise.
+ */
+static const char *
+get_env (const char *name, const char *envp[])
+{
+  if (envp)
+    {
+      int i;
+      const int namelen = strlen (name);
+      for (i = 0; envp[i]; ++i)
+	{
+	  if (!strncmp (envp[i], name, namelen))
+	    {
+	      const char *cp = envp[i] + namelen;
+	      if (*cp == '=')
+		return cp + 1;
+	    }
+	}
+    }
+  return NULL;
+}
+
+OPENVPN_EXPORT openvpn_plugin_handle_t
+openvpn_plugin_open_v1 (unsigned int *type_mask, const char *argv[], const char *envp[])
+{
+  struct plugin_context *context;
+
+  /*
+   * Allocate our context
+   */
+  context = (struct plugin_context *) calloc (1, sizeof (struct plugin_context));
+
+  /*
+   * Set the username/password we will require.
+   */
+  context->username = "foo";
+  context->password = "bar";
+
+  /*
+   * We are only interested in intercepting the
+   * --auth-user-pass-verify callback.
+   */
+  *type_mask = OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_AUTH_USER_PASS_VERIFY);
+
+  return (openvpn_plugin_handle_t) context;
+}
+
+OPENVPN_EXPORT int
+openvpn_plugin_func_v1 (openvpn_plugin_handle_t handle, const int type, const char *argv[], const char *envp[])
+{
+  struct plugin_context *context = (struct plugin_context *) handle;
+
+  /* get username/password from envp string array */
+  const char *username = get_env ("username", envp);
+  const char *password = get_env ("password", envp);
+
+  /* check entered username/password against what we require */
+  if (username && !strcmp (username, context->username)
+      && password && !strcmp (password, context->password))
+    return OPENVPN_PLUGIN_FUNC_SUCCESS;
+  else
+    return OPENVPN_PLUGIN_FUNC_ERROR;
+}
+
+OPENVPN_EXPORT void
+openvpn_plugin_close_v1 (openvpn_plugin_handle_t handle)
+{
+  struct plugin_context *context = (struct plugin_context *) handle;
+  free (context);
+}
diff --git a/sample/sample-plugins/simple/simple.def b/sample/sample-plugins/simple/simple.def
new file mode 100755
index 0000000..a87507d
--- /dev/null
+++ b/sample/sample-plugins/simple/simple.def
 <at>  <at>  -0,0 +1,6  <at>  <at> 
+LIBRARY   OpenVPN_PLUGIN_SAMPLE
+DESCRIPTION "Sample OpenVPN plug-in module."
+EXPORTS
+   openvpn_plugin_open_v1    <at> 1
+   openvpn_plugin_func_v1    <at> 2
+   openvpn_plugin_close_v1   <at> 3
diff --git a/sample/sample-plugins/simple/winbuild b/sample/sample-plugins/simple/winbuild
new file mode 100755
index 0000000..decf05f
--- /dev/null
+++ b/sample/sample-plugins/simple/winbuild
 <at>  <at>  -0,0 +1,18  <at>  <at> 
+#
+# Build an OpenVPN plugin module on Windows/MinGW.
+# The argument should be the base name of the C source file
+# (without the .c).
+#
+
+# This directory is where we will look for openvpn-plugin.h
+INCLUDE="-I../../../include"
+
+CC_FLAGS="-O2 -Wall"
+
+gcc -DBUILD_DLL $CC_FLAGS $INCLUDE -c $1.c
+gcc --disable-stdcall-fixup -mdll -DBUILD_DLL -o junk.tmp -Wl,--base-file,base.tmp $1.o
+rm junk.tmp
+dlltool --dllname $1.dll --base-file base.tmp --output-exp temp.exp --input-def $1.def
+rm base.tmp
+gcc --enable-stdcall-fixup -mdll -DBUILD_DLL -o $1.dll $1.o -Wl,temp.exp
+rm temp.exp
diff --git a/src/Makefile.am b/src/Makefile.am
index b894977..c04468a 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
 <at>  <at>  -12,7 +12,4  <at>  <at> 
 MAINTAINERCLEANFILES = \
 	$(srcdir)/Makefile.in
 
-EXTRA_DIST = \
-	plugins
-
-SUBDIRS = compat openvpn openvpnserv
+SUBDIRS = compat openvpn openvpnserv plugins
diff --git a/src/plugins/Makefile.am b/src/plugins/Makefile.am
new file mode 100644
index 0000000..17b72b9
--- /dev/null
+++ b/src/plugins/Makefile.am
 <at>  <at>  -0,0 +1,15  <at>  <at> 
+#
+#  OpenVPN -- An application to securely tunnel IP networks
+#             over a single UDP port, with support for SSL/TLS-based
+#             session authentication and key exchange,
+#             packet encryption, packet authentication, and
+#             packet compression.
+#
+#  Copyright (C) 2002-2010 OpenVPN Technologies, Inc. <sales <at> openvpn.net>
+#  Copyright (C) 2006-2012 Alon Bar-Lev <alon.barlev <at> gmail.com>
+#
+
+MAINTAINERCLEANFILES = \
+	$(srcdir)/Makefile.in
+
+SUBDIRS = auth-pam down-root
diff --git a/src/plugins/README b/src/plugins/README
deleted file mode 100644
index 6e490c5..0000000
--- a/src/plugins/README
+++ /dev/null
 <at>  <at>  -1,47 +0,0  <at>  <at> 
-OpenVPN Plugins
----------------
-
-Starting with OpenVPN 2.0-beta17, compiled plugin modules are
-supported on any *nix OS which includes libdl or on Windows.
-One or more modules may be loaded into OpenVPN using
-the --plugin directive, and each plugin module is capable of
-intercepting any of the script callbacks which OpenVPN supports:
-
-(1) up
-(2) down
-(3) route-up
-(4) ipchange
-(5) tls-verify
-(6) auth-user-pass-verify
-(7) client-connect
-(8) client-disconnect
-(9) learn-address
-
-See the openvpn-plugin.h file in the top-level directory of the
-OpenVPN source distribution for more detailed information
-on the plugin interface.
-
-Included Plugins
-----------------
-
-auth-pam -- Authenticate using PAM and a split privilege
-            execution model which functions even if
-            root privileges or the execution environment
-            have been altered with --user/--group/--chroot.
-            Tested on Linux only.
-
-down-root -- Enable the running of down scripts with root privileges
-             even if --user/--group/--chroot have been used
-             to drop root privileges or change the execution
-             environment.  Not applicable on Windows.
-
-examples -- A simple example that demonstrates a portable
-            plugin, i.e. one which can be built for *nix
-            or Windows from the same source.
-
-Building Plugins
-----------------
-
-cd to the top-level directory of a plugin, and use the
-"make" command to build it.  The examples plugin is
-built using a build script, not a makefile.
diff --git a/src/plugins/auth-pam/Makefile b/src/plugins/auth-pam/Makefile
deleted file mode 100755
index c0b9c79..0000000
--- a/src/plugins/auth-pam/Makefile
+++ /dev/null
 <at>  <at>  -1,32 +0,0  <at>  <at> 
-#
-# Build the OpenVPN auth-pam plugin module.
-#
-
-# If PAM modules are not linked against libpam.so, set DLOPEN_PAM to 1. This
-# must be done on SUSE 9.1, at least.
-DLOPEN_PAM=0
-
-ifeq ($(DLOPEN_PAM),1)
-	LIBPAM=-ldl
-else
-	LIBPAM=-lpam
-endif
-
-# This directory is where we will look for openvpn-plugin.h
-CPPFLAGS=-I../../../include
-
-CC=gcc
-CFLAGS=-O2 -Wall
-DEFS = -DDLOPEN_PAM=$(DLOPEN_PAM)
-
-openvpn-auth-pam.so : auth-pam.o pamdl.o
-	$(CC) $(CFLAGS) -fPIC -shared $(LDFLAGS) -Wl,-soname,openvpn-auth-pam.so -o openvpn-auth-pam.so auth-pam.o pamdl.o -lc $(LIBPAM)
-
-auth-pam.o : auth-pam.c pamdl.h
-	$(CC) $(CPPFLAGS) $(CFLAGS) $(DEFS) -fPIC -c auth-pam.c
-
-pamdl.o : pamdl.c pamdl.h
-	$(CC) $(CPPFLAGS) $(CFLAGS) $(DEFS) -fPIC -c pamdl.c
-
-clean :
-	-rm -f *.o *.so
diff --git a/src/plugins/auth-pam/Makefile.am b/src/plugins/auth-pam/Makefile.am
new file mode 100644
index 0000000..701a749
--- /dev/null
+++ b/src/plugins/auth-pam/Makefile.am
 <at>  <at>  -0,0 +1,27  <at>  <at> 
+#
+#  OpenVPN (TM) PAM Auth Plugin -- OpenVPN Plugin
+#
+#  Copyright (C) 2012      Alon Bar-Lev <alon.barlev <at> gmail.com>
+#
+
+MAINTAINERCLEANFILES = \
+	$(srcdir)/Makefile.in
+
+AM_CFLAGS = \
+	-I$(top_srcdir)/include
+	$(PLUGIN_AUTH_PAM_CFLAGS)
+
+if ENABLE_PLUGIN_AUTH_PAM
+plugin_LTLIBRARIES = openvpn-plugin-auth-pam.la
+dist_doc_DATA = README.auth-pam
+endif
+
+openvpn_plugin_auth_pam_la_SOURCES = \
+	auth-pam.c \
+	pamdl.c  pamdl.h \
+	auth-pam.exports
+openvpn_plugin_auth_pam_la_LIBADD = \
+	$(PLUGIN_AUTH_PAM_LIBS)
+openvpn_plugin_auth_pam_la_LDFLAGS = $(AM_LDFLAGS) \
+	-export-symbols "$(srcdir)/auth-pam.exports" \
+	-module -shared -avoid-version -no-undefined
diff --git a/src/plugins/auth-pam/README b/src/plugins/auth-pam/README
deleted file mode 100644
index e123690..0000000
--- a/src/plugins/auth-pam/README
+++ /dev/null
 <at>  <at>  -1,74 +0,0  <at>  <at> 
-openvpn-auth-pam
-
-SYNOPSIS
-
-The openvpn-auth-pam module implements username/password
-authentication via PAM, and essentially allows any authentication
-method supported by PAM (such as LDAP, RADIUS, or Linux Shadow
-passwords) to be used with OpenVPN.  While PAM supports
-username/password authentication, this can be combined with X509
-certificates to provide two indepedent levels of authentication.
-
-This module uses a split privilege execution model which will
-function even if you drop openvpn daemon privileges using the user,
-group, or chroot directives.
-
-BUILD
-
-To build openvpn-auth-pam, you will need to have the pam-devel
-package installed.
-
-Build with the "make" command.  The module will be named
-openvpn-auth-pam.so
-
-USAGE
-
-To use this plugin module, add to your OpenVPN config file:
-
-  plugin openvpn-auth-pam.so service-type
-
-The required service-type parameter corresponds to
-the PAM service definition file usually found
-in /etc/pam.d.
-
-This plugin also supports the usage of a list of name/value
-pairs to answer PAM module queries.
-
-For example:
-
-  plugin openvpn-auth-pam.so "login login USERNAME password PASSWORD"
-
-tells auth-pam to (a) use the "login" PAM module, (b) answer a
-"login" query with the username given by the OpenVPN client, and
-(c) answer a "password" query with the password given by the
-OpenVPN client.  This provides flexibility in dealing with the different
-types of query strings which different PAM modules might generate.
-For example, suppose you were using a PAM module called
-"test" which queried for "name" rather than "login":
-
-  plugin openvpn-auth-pam.so "test name USERNAME password PASSWORD"
-
-While "USERNAME" "COMMONNAME" and "PASSWORD" are special strings which substitute
-to client-supplied values, it is also possible to name literal values
-to use as PAM module query responses.  For example, suppose that the
-login module queried for a third parameter, "domain" which
-is to be answered with the constant value "mydomain.com":
-
-  plugin openvpn-auth-pam.so "login login USERNAME password PASSWORD domain mydomain.com"
-
-The following OpenVPN directives can also influence
-the operation of this plugin:
-
-  client-cert-not-required
-  username-as-common-name
-
-Run OpenVPN with --verb 7 or higher to get debugging output from
-this plugin, including the list of queries presented by the
-underlying PAM module.  This is a useful debugging tool to figure
-out which queries a given PAM module is making, so that you can
-craft the appropriate plugin directive to answer it.
-
-CAVEATS
-
-This module will only work on *nix systems which support PAM,
-not Windows.
diff --git a/src/plugins/auth-pam/README.auth-pam b/src/plugins/auth-pam/README.auth-pam
new file mode 100644
index 0000000..e123690
--- /dev/null
+++ b/src/plugins/auth-pam/README.auth-pam
 <at>  <at>  -0,0 +1,74  <at>  <at> 
+openvpn-auth-pam
+
+SYNOPSIS
+
+The openvpn-auth-pam module implements username/password
+authentication via PAM, and essentially allows any authentication
+method supported by PAM (such as LDAP, RADIUS, or Linux Shadow
+passwords) to be used with OpenVPN.  While PAM supports
+username/password authentication, this can be combined with X509
+certificates to provide two indepedent levels of authentication.
+
+This module uses a split privilege execution model which will
+function even if you drop openvpn daemon privileges using the user,
+group, or chroot directives.
+
+BUILD
+
+To build openvpn-auth-pam, you will need to have the pam-devel
+package installed.
+
+Build with the "make" command.  The module will be named
+openvpn-auth-pam.so
+
+USAGE
+
+To use this plugin module, add to your OpenVPN config file:
+
+  plugin openvpn-auth-pam.so service-type
+
+The required service-type parameter corresponds to
+the PAM service definition file usually found
+in /etc/pam.d.
+
+This plugin also supports the usage of a list of name/value
+pairs to answer PAM module queries.
+
+For example:
+
+  plugin openvpn-auth-pam.so "login login USERNAME password PASSWORD"
+
+tells auth-pam to (a) use the "login" PAM module, (b) answer a
+"login" query with the username given by the OpenVPN client, and
+(c) answer a "password" query with the password given by the
+OpenVPN client.  This provides flexibility in dealing with the different
+types of query strings which different PAM modules might generate.
+For example, suppose you were using a PAM module called
+"test" which queried for "name" rather than "login":
+
+  plugin openvpn-auth-pam.so "test name USERNAME password PASSWORD"
+
+While "USERNAME" "COMMONNAME" and "PASSWORD" are special strings which substitute
+to client-supplied values, it is also possible to name literal values
+to use as PAM module query responses.  For example, suppose that the
+login module queried for a third parameter, "domain" which
+is to be answered with the constant value "mydomain.com":
+
+  plugin openvpn-auth-pam.so "login login USERNAME password PASSWORD domain mydomain.com"
+
+The following OpenVPN directives can also influence
+the operation of this plugin:
+
+  client-cert-not-required
+  username-as-common-name
+
+Run OpenVPN with --verb 7 or higher to get debugging output from
+this plugin, including the list of queries presented by the
+underlying PAM module.  This is a useful debugging tool to figure
+out which queries a given PAM module is making, so that you can
+craft the appropriate plugin directive to answer it.
+
+CAVEATS
+
+This module will only work on *nix systems which support PAM,
+not Windows.
diff --git a/src/plugins/auth-pam/auth-pam.c b/src/plugins/auth-pam/auth-pam.c
index e52f632..bd71792 100644
--- a/src/plugins/auth-pam/auth-pam.c
+++ b/src/plugins/auth-pam/auth-pam.c
 <at>  <at>  -26,12 +26,14  <at>  <at> 
  * OpenVPN plugin module to do PAM authentication using a split
  * privilege model.
  */
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
 
-#if DLOPEN_PAM
-#include <dlfcn.h>
-#include "pamdl.h"
-#else
 #include <security/pam_appl.h>
+
+#ifdef USE_PAM_DLOPEN
+#include "pamdl.h"
 #endif
 
 #include <stdio.h>
 <at>  <at>  -46,7 +48,7  <at>  <at> 
 #include <signal.h>
 #include <syslog.h>
 
-#include "openvpn-plugin.h"
+#include <openvpn-plugin.h>
 
 #define DEBUG(verb) ((verb) >= 4)
 
 <at>  <at>  -693,7 +695,7  <at>  <at>  pam_server (int fd, const char *service, int verb, const struct name_value_list
 {
   struct user_pass up;
   int command;
-#if DLOPEN_PAM
+#ifdef USE_PAM_DLOPEN
   static const char pam_so[] = "libpam.so";
 #endif
 
 <at>  <at>  -703,7 +705,7  <at>  <at>  pam_server (int fd, const char *service, int verb, const struct name_value_list
   if (DEBUG (verb))
     fprintf (stderr, "AUTH-PAM: BACKGROUND: INIT service='%s'\n", service);
 
-#if DLOPEN_PAM
+#ifdef USE_PAM_DLOPEN
   /*
    * Load PAM shared object
    */
 <at>  <at>  -794,7 +796,7  <at>  <at>  pam_server (int fd, const char *service, int verb, const struct name_value_list
     }
  done:
 
-#if DLOPEN_PAM
+#ifdef USE_PAM_DLOPEN
   dlclose_pam ();
 #endif
   if (DEBUG (verb))
diff --git a/src/plugins/auth-pam/auth-pam.exports b/src/plugins/auth-pam/auth-pam.exports
new file mode 100644
index 0000000..b07937c
--- /dev/null
+++ b/src/plugins/auth-pam/auth-pam.exports
 <at>  <at>  -0,0 +1,4  <at>  <at> 
+openvpn_plugin_open_v1
+openvpn_plugin_func_v1
+openvpn_plugin_close_v1
+openvpn_plugin_abort_v1
diff --git a/src/plugins/auth-pam/pamdl.c b/src/plugins/auth-pam/pamdl.c
index 8636a8e..26e9821 100644
--- a/src/plugins/auth-pam/pamdl.c
+++ b/src/plugins/auth-pam/pamdl.c
 <at>  <at>  -1,4 +1,8  <at>  <at> 
-#if DLOPEN_PAM
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifdef USE_PAM_DLOPEN
 /*
  * If you want to dynamically load libpam using dlopen() or something,
  * then dlopen( ' this shared object ' ); It takes care of exporting
 <at>  <at>  -73,7 +77,7  <at>  <at>  int pam_set_item(pam_handle_t *pamh, int item_type, const void *item)
     return real_pam_set_item(pamh, item_type, item);
 }
 
-int pam_get_item(pam_handle_t *pamh, int item_type, const void **item)
+int pam_get_item(const pam_handle_t *pamh, int item_type, const void **item)
 {
     int (*real_pam_get_item)(const pam_handle_t *, int, const void **);
     RESOLVE_PAM_FUNCTION(pam_get_item, int,
diff --git a/src/plugins/auth-pam/pamdl.h b/src/plugins/auth-pam/pamdl.h
index b10b035..12ba068 100644
--- a/src/plugins/auth-pam/pamdl.h
+++ b/src/plugins/auth-pam/pamdl.h
 <at>  <at>  -1,6 +1,4  <at>  <at> 
-#if DLOPEN_PAM
-#include <security/pam_appl.h>
-
+#ifdef USE_PAM_DLOPEN
 /* Dynamically load and unload the PAM library */
 int dlopen_pam (const char *so);
 void dlclose_pam (void);
diff --git a/src/plugins/defer/README b/src/plugins/defer/README
deleted file mode 100644
index d8990f8..0000000
--- a/src/plugins/defer/README
+++ /dev/null
 <at>  <at>  -1,16 +0,0  <at>  <at> 
-OpenVPN plugin examples.
-
-Examples provided:
-
-simple.c -- using the --auth-user-pass-verify callback,
-            test deferred authentication.
-
-To build:
-
-  ./build simple (Linux/BSD/etc.)
-  ./winbuild simple (MinGW on Windows)
-
-To use in OpenVPN, add to config file:
-
-  plugin simple.so (Linux/BSD/etc.)
-  plugin simple.dll (MinGW on Windows)
diff --git a/src/plugins/defer/build b/src/plugins/defer/build
deleted file mode 100755
index 0612c08..0000000
--- a/src/plugins/defer/build
+++ /dev/null
 <at>  <at>  -1,15 +0,0  <at>  <at> 
-#!/bin/sh
-
-#
-# Build an OpenVPN plugin module on *nix.  The argument should
-# be the base name of the C source file (without the .c).
-#
-
-# This directory is where we will look for openvpn-plugin.h
-CPPFLAGS="${CPPFLAGS:--I../../../include}"
-
-CC="${CC:-gcc}"
-CFLAGS="${CFLAGS:--O2 -Wall -g}"
-
-$CC $CPPFLAGS $CFLAGS -fPIC -c $1.c && \
-$CC $CFLAGS -fPIC -shared ${LDFLAS} -Wl,-soname,$1.so -o $1.so $1.o -lc
diff --git a/src/plugins/defer/simple.c b/src/plugins/defer/simple.c
deleted file mode 100644
index 6539865..0000000
--- a/src/plugins/defer/simple.c
+++ /dev/null
 <at>  <at>  -1,305 +0,0  <at>  <at> 
-/*
- *  OpenVPN -- An application to securely tunnel IP networks
- *             over a single TCP/UDP port, with support for SSL/TLS-based
- *             session authentication and key exchange,
- *             packet encryption, packet authentication, and
- *             packet compression.
- *
- *  Copyright (C) 2002-2010 OpenVPN Technologies, Inc. <sales <at> openvpn.net>
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License version 2
- *  as published by the Free Software Foundation.
- *
- *  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 (see the file COPYING included with this
- *  distribution); if not, write to the Free Software Foundation, Inc.,
- *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-/*
- * This file implements a simple OpenVPN plugin module which
- * will test deferred authentication and packet filtering.
- * 
- * Will run on Windows or *nix.
- *
- * Sample usage:
- *
- * setenv test_deferred_auth 20
- * setenv test_packet_filter 10
- * plugin plugin/defer/simple.so
- *
- * This will enable deferred authentication to occur 20
- * seconds after the normal TLS authentication process,
- * and will cause a packet filter file to be generated 10
- * seconds after the initial TLS negotiation, using
- * {common-name}.pf as the source.
- *
- * Sample packet filter configuration:
- *
- * [CLIENTS DROP]
- * +otherclient
- * [SUBNETS DROP]
- * +10.0.0.0/8
- * -10.10.0.8
- * [END]
- *
- * See the README file for build instructions.
- */
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-
-#include "openvpn-plugin.h"
-
-/* bool definitions */
-#define bool int
-#define true 1
-#define false 0
-
-/*
- * Our context, where we keep our state.
- */
-
-struct plugin_context {
-  int test_deferred_auth;
-  int test_packet_filter;
-};
-
-struct plugin_per_client_context {
-  int n_calls;
-  bool generated_pf_file;
-};
-
-/*
- * Given an environmental variable name, search
- * the envp array for its value, returning it
- * if found or NULL otherwise.
- */
-static const char *
-get_env (const char *name, const char *envp[])
-{
-  if (envp)
-    {
-      int i;
-      const int namelen = strlen (name);
-      for (i = 0; envp[i]; ++i)
-	{
-	  if (!strncmp (envp[i], name, namelen))
-	    {
-	      const char *cp = envp[i] + namelen;
-	      if (*cp == '=')
-		return cp + 1;
-	    }
-	}
-    }
-  return NULL;
-}
-
-/* used for safe printf of possible NULL strings */
-static const char *
-np (const char *str)
-{
-  if (str)
-    return str;
-  else
-    return "[NULL]";
-}
-
-static int
-atoi_null0 (const char *str)
-{
-  if (str)
-    return atoi (str);
-  else
-    return 0;
-}
-
-OPENVPN_EXPORT openvpn_plugin_handle_t
-openvpn_plugin_open_v1 (unsigned int *type_mask, const char *argv[], const char *envp[])
-{
-  struct plugin_context *context;
-
-  printf ("FUNC: openvpn_plugin_open_v1\n");
-
-  /*
-   * Allocate our context
-   */
-  context = (struct plugin_context *) calloc (1, sizeof (struct plugin_context));
-
-  context->test_deferred_auth = atoi_null0 (get_env ("test_deferred_auth", envp));
-  printf ("TEST_DEFERRED_AUTH %d\n", context->test_deferred_auth);
-
-  context->test_packet_filter = atoi_null0 (get_env ("test_packet_filter", envp));
-  printf ("TEST_PACKET_FILTER %d\n", context->test_packet_filter);
-
-  /*
-   * Which callbacks to intercept.
-   */
-  *type_mask =
-    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_UP) |
-    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_DOWN) |
-    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_ROUTE_UP) |
-    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_IPCHANGE) |
-    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_TLS_VERIFY) |
-    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_AUTH_USER_PASS_VERIFY) |
-    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_CLIENT_CONNECT_V2) |
-    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_CLIENT_DISCONNECT) |
-    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_LEARN_ADDRESS) |
-    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_TLS_FINAL) |
-    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_ENABLE_PF);
-
-  return (openvpn_plugin_handle_t) context;
-}
-
-static int
-auth_user_pass_verify (struct plugin_context *context, struct plugin_per_client_context *pcc, const char *argv[], const char *envp[])
-{
-  if (context->test_deferred_auth)
-    {
-      /* get username/password from envp string array */
-      const char *username = get_env ("username", envp);
-      const char *password = get_env ("password", envp);
-
-      /* get auth_control_file filename from envp string array*/
-      const char *auth_control_file = get_env ("auth_control_file", envp);
-
-      printf ("DEFER u='%s' p='%s' acf='%s'\n",
-	      np(username),
-	      np(password),
-	      np(auth_control_file));
-
-      /* Authenticate asynchronously in n seconds */
-      if (auth_control_file)
-	{
-	  char buf[256];
-	  int auth = 2;
-	  sscanf (username, "%d", &auth);
-	  snprintf (buf, sizeof(buf), "( sleep %d ; echo AUTH %s %d ; echo %d >%s ) &",
-		    context->test_deferred_auth,
-		    auth_control_file,
-		    auth,
-		    pcc->n_calls < auth,
-		    auth_control_file);
-	  printf ("%s\n", buf);
-	  system (buf);
-	  pcc->n_calls++;
-	  return OPENVPN_PLUGIN_FUNC_DEFERRED;
-	}
-      else
-	return OPENVPN_PLUGIN_FUNC_ERROR;
-    }
-  else
-    return OPENVPN_PLUGIN_FUNC_SUCCESS;
-}
-
-static int
-tls_final (struct plugin_context *context, struct plugin_per_client_context *pcc, const char *argv[], const char *envp[])
-{
-  if (context->test_packet_filter)
-    {
-      if (!pcc->generated_pf_file)
-	{
-	  const char *pff = get_env ("pf_file", envp);
-	  const char *cn = get_env ("username", envp);
-	  if (pff && cn)
-	    {
-	      char buf[256];
-	      snprintf (buf, sizeof(buf), "( sleep %d ; echo PF %s/%s ; cp \"%s.pf\" \"%s\" ) &",
-			context->test_packet_filter, cn, pff, cn, pff);
-	      printf ("%s\n", buf);
-	      system (buf);
-	      pcc->generated_pf_file = true;
-	      return OPENVPN_PLUGIN_FUNC_SUCCESS;
-	    }
-	  else
-	    return OPENVPN_PLUGIN_FUNC_ERROR;
-	}
-      else
-	return OPENVPN_PLUGIN_FUNC_ERROR;
-    }
-  else
-    return OPENVPN_PLUGIN_FUNC_SUCCESS;
-}
-
-OPENVPN_EXPORT int
-openvpn_plugin_func_v2 (openvpn_plugin_handle_t handle,
-			const int type,
-			const char *argv[],
-			const char *envp[],
-			void *per_client_context,
-			struct openvpn_plugin_string_list **return_list)
-{
-  struct plugin_context *context = (struct plugin_context *) handle;
-  struct plugin_per_client_context *pcc = (struct plugin_per_client_context *) per_client_context;
-  switch (type)
-    {
-    case OPENVPN_PLUGIN_UP:
-      printf ("OPENVPN_PLUGIN_UP\n");
-      return OPENVPN_PLUGIN_FUNC_SUCCESS;
-    case OPENVPN_PLUGIN_DOWN:
-      printf ("OPENVPN_PLUGIN_DOWN\n");
-      return OPENVPN_PLUGIN_FUNC_SUCCESS;
-    case OPENVPN_PLUGIN_ROUTE_UP:
-      printf ("OPENVPN_PLUGIN_ROUTE_UP\n");
-      return OPENVPN_PLUGIN_FUNC_SUCCESS;
-    case OPENVPN_PLUGIN_IPCHANGE:
-      printf ("OPENVPN_PLUGIN_IPCHANGE\n");
-      return OPENVPN_PLUGIN_FUNC_SUCCESS;
-    case OPENVPN_PLUGIN_TLS_VERIFY:
-      printf ("OPENVPN_PLUGIN_TLS_VERIFY\n");
-      return OPENVPN_PLUGIN_FUNC_SUCCESS;
-    case OPENVPN_PLUGIN_AUTH_USER_PASS_VERIFY:
-      printf ("OPENVPN_PLUGIN_AUTH_USER_PASS_VERIFY\n");
-      return auth_user_pass_verify (context, pcc, argv, envp);
-    case OPENVPN_PLUGIN_CLIENT_CONNECT_V2:
-      printf ("OPENVPN_PLUGIN_CLIENT_CONNECT_V2\n");
-      return OPENVPN_PLUGIN_FUNC_SUCCESS;
-    case OPENVPN_PLUGIN_CLIENT_DISCONNECT:
-      printf ("OPENVPN_PLUGIN_CLIENT_DISCONNECT\n");
-      return OPENVPN_PLUGIN_FUNC_SUCCESS;
-    case OPENVPN_PLUGIN_LEARN_ADDRESS:
-      printf ("OPENVPN_PLUGIN_LEARN_ADDRESS\n");
-      return OPENVPN_PLUGIN_FUNC_SUCCESS;
-    case OPENVPN_PLUGIN_TLS_FINAL:
-      printf ("OPENVPN_PLUGIN_TLS_FINAL\n");
-      return tls_final (context, pcc, argv, envp);
-    case OPENVPN_PLUGIN_ENABLE_PF:
-      printf ("OPENVPN_PLUGIN_ENABLE_PF\n");
-      if (context->test_packet_filter)
-	return OPENVPN_PLUGIN_FUNC_SUCCESS;
-      else
-	return OPENVPN_PLUGIN_FUNC_ERROR;
-    default:
-      printf ("OPENVPN_PLUGIN_?\n");
-      return OPENVPN_PLUGIN_FUNC_ERROR;
-    }
-}
-
-OPENVPN_EXPORT void *
-openvpn_plugin_client_constructor_v1 (openvpn_plugin_handle_t handle)
-{
-  printf ("FUNC: openvpn_plugin_client_constructor_v1\n");
-  return calloc (1, sizeof (struct plugin_per_client_context));
-}
-
-OPENVPN_EXPORT void
-openvpn_plugin_client_destructor_v1 (openvpn_plugin_handle_t handle, void *per_client_context)
-{
-  printf ("FUNC: openvpn_plugin_client_destructor_v1\n");
-  free (per_client_context);
-}
-
-OPENVPN_EXPORT void
-openvpn_plugin_close_v1 (openvpn_plugin_handle_t handle)
-{
-  struct plugin_context *context = (struct plugin_context *) handle;
-  printf ("FUNC: openvpn_plugin_close_v1\n");
-  free (context);
-}
diff --git a/src/plugins/defer/simple.def b/src/plugins/defer/simple.def
deleted file mode 100755
index a87507d..0000000
--- a/src/plugins/defer/simple.def
+++ /dev/null
 <at>  <at>  -1,6 +0,0  <at>  <at> 
-LIBRARY   OpenVPN_PLUGIN_SAMPLE
-DESCRIPTION "Sample OpenVPN plug-in module."
-EXPORTS
-   openvpn_plugin_open_v1    <at> 1
-   openvpn_plugin_func_v1    <at> 2
-   openvpn_plugin_close_v1   <at> 3
diff --git a/src/plugins/defer/winbuild b/src/plugins/defer/winbuild
deleted file mode 100755
index 82927d9..0000000
--- a/src/plugins/defer/winbuild
+++ /dev/null
 <at>  <at>  -1,18 +0,0  <at>  <at> 
-#
-# Build an OpenVPN plugin module on Windows/MinGW.
-# The argument should be the base name of the C source file
-# (without the .c).
-#
-
-# This directory is where we will look for openvpn-plugin.h
-INCLUDE="-I../../../build"
-
-CC_FLAGS="-O2 -Wall"
-
-gcc -DBUILD_DLL $CC_FLAGS $INCLUDE -c $1.c
-gcc --disable-stdcall-fixup -mdll -DBUILD_DLL -o junk.tmp -Wl,--base-file,base.tmp $1.o
-rm junk.tmp
-dlltool --dllname $1.dll --base-file base.tmp --output-exp temp.exp --input-def $1.def
-rm base.tmp
-gcc --enable-stdcall-fixup -mdll -DBUILD_DLL -o $1.dll $1.o -Wl,temp.exp
-rm temp.exp
diff --git a/src/plugins/down-root/Makefile b/src/plugins/down-root/Makefile
deleted file mode 100755
index e66c99a..0000000
--- a/src/plugins/down-root/Makefile
+++ /dev/null
 <at>  <at>  -1,18 +0,0  <at>  <at> 
-#
-# Build the OpenVPN down-root plugin module.
-#
-
-# This directory is where we will look for openvpn-plugin.h
-CPPFLAGS=-I../../../include
-
-CC=gcc
-CFLAGS=-O2 -Wall
-
-down-root.so : down-root.o
-	$(CC) $(CFLAGS) -fPIC -shared $(LDFLAGS) -Wl,-soname,openvpn-down-root.so -o openvpn-down-root.so down-root.o -lc
-
-down-root.o : down-root.c
-	$(CC) $(CPPFLAGS) $(CFLAGS) -fPIC -c down-root.c
-
-clean :
-	-rm -f *.o *.so
diff --git a/src/plugins/down-root/Makefile.am b/src/plugins/down-root/Makefile.am
new file mode 100644
index 0000000..064aa30
--- /dev/null
+++ b/src/plugins/down-root/Makefile.am
 <at>  <at>  -0,0 +1,23  <at>  <at> 
+#
+#  OpenVPN (TM) Down Root Plugin -- OpenVPN Plugin
+#
+#  Copyright (C) 2012      Alon Bar-Lev <alon.barlev <at> gmail.com>
+#
+
+MAINTAINERCLEANFILES = \
+	$(srcdir)/Makefile.in
+
+AM_CFLAGS = \
+	-I$(top_srcdir)/include
+
+if ENABLE_PLUGIN_DOWN_ROOT
+plugin_LTLIBRARIES = openvpn-plugin-down-root.la
+dist_doc_DATA = README.down-root
+endif
+
+openvpn_plugin_down_root_la_SOURCES = \
+	down-root.c \
+	down-root.exports
+openvpn_plugin_down_root_la_LDFLAGS = $(AM_LDFLAGS) \
+	-export-symbols "$(srcdir)/down-root.exports" \
+	-module -shared -avoid-version -no-undefined
diff --git a/src/plugins/down-root/README b/src/plugins/down-root/README
deleted file mode 100644
index d337ffe..0000000
--- a/src/plugins/down-root/README
+++ /dev/null
 <at>  <at>  -1,29 +0,0  <at>  <at> 
-down-root -- an OpenVPN Plugin Module
-
-SYNOPSIS
-
-The down-root module allows an OpenVPN configuration to
-call a down script with root privileges, even when privileges
-have been dropped using --user/--group/--chroot.
-
-This module uses a split privilege execution model which will
-fork() before OpenVPN drops root privileges, at the point where
-the --up script is usually called.  The module will then remain
-in a wait state until it receives a message from OpenVPN via
-pipe to execute the down script.  Thus, the down script will be
-run in the same execution environment as the up script.
-
-BUILD
-
-Build this module with the "make" command.  The plugin
-module will be named openvpn-down-root.so
-
-USAGE
-
-To use this module, add to your OpenVPN config file:
-
-  plugin openvpn-down-root.so "command ..."
-
-CAVEATS
-
-This module will only work on *nix systems, not Windows.
diff --git a/src/plugins/down-root/README.down-root b/src/plugins/down-root/README.down-root
new file mode 100644
index 0000000..d337ffe
--- /dev/null
+++ b/src/plugins/down-root/README.down-root
 <at>  <at>  -0,0 +1,29  <at>  <at> 
+down-root -- an OpenVPN Plugin Module
+
+SYNOPSIS
+
+The down-root module allows an OpenVPN configuration to
+call a down script with root privileges, even when privileges
+have been dropped using --user/--group/--chroot.
+
+This module uses a split privilege execution model which will
+fork() before OpenVPN drops root privileges, at the point where
+the --up script is usually called.  The module will then remain
+in a wait state until it receives a message from OpenVPN via
+pipe to execute the down script.  Thus, the down script will be
+run in the same execution environment as the up script.
+
+BUILD
+
+Build this module with the "make" command.  The plugin
+module will be named openvpn-down-root.so
+
+USAGE
+
+To use this module, add to your OpenVPN config file:
+
+  plugin openvpn-down-root.so "command ..."
+
+CAVEATS
+
+This module will only work on *nix systems, not Windows.
diff --git a/src/plugins/down-root/down-root.c b/src/plugins/down-root/down-root.c
index fced23b..d51d0e5 100644
--- a/src/plugins/down-root/down-root.c
+++ b/src/plugins/down-root/down-root.c
 <at>  <at>  -26,6 +26,10  <at>  <at> 
  * OpenVPN plugin module to do privileged down-script execution.
  */
 
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
 #include <stdio.h>
 #include <string.h>
 #include <unistd.h>
 <at>  <at>  -37,7 +41,7  <at>  <at> 
 #include <signal.h>
 #include <syslog.h>
 
-#include "openvpn-plugin.h"
+#include <openvpn-plugin.h>
 
 #define DEBUG(verb) ((verb) >= 7)
 
diff --git a/src/plugins/down-root/down-root.exports b/src/plugins/down-root/down-root.exports
new file mode 100644
index 0000000..b07937c
--- /dev/null
+++ b/src/plugins/down-root/down-root.exports
 <at>  <at>  -0,0 +1,4  <at>  <at> 
+openvpn_plugin_open_v1
+openvpn_plugin_func_v1
+openvpn_plugin_close_v1
+openvpn_plugin_abort_v1
diff --git a/src/plugins/examples/README b/src/plugins/examples/README
deleted file mode 100644
index 4400cd3..0000000
--- a/src/plugins/examples/README
+++ /dev/null
 <at>  <at>  -1,16 +0,0  <at>  <at> 
-OpenVPN plugin examples.
-
-Examples provided:
-
-simple.c -- using the --auth-user-pass-verify callback, verify
-            that the username/password is "foo"/"bar".
-
-To build:
-
-  ./build simple (Linux/BSD/etc.)
-  ./winbuild simple (MinGW on Windows)
-
-To use in OpenVPN, add to config file:
-
-  plugin simple.so (Linux/BSD/etc.)
-  plugin simple.dll (MinGW on Windows)
diff --git a/src/plugins/examples/build b/src/plugins/examples/build
deleted file mode 100755
index bbb05f7..0000000
--- a/src/plugins/examples/build
+++ /dev/null
 <at>  <at>  -1,15 +0,0  <at>  <at> 
-#!/bin/sh
-
-#
-# Build an OpenVPN plugin module on *nix.  The argument should
-# be the base name of the C source file (without the .c).
-#
-
-# This directory is where we will look for openvpn-plugin.h
-CPPFLAGS="${CPPFLAGS:--I../../..}"
-
-CC="${CC:-gcc}"
-CFLAGS="${CFLAGS:--O2 -Wall -g}"
-
-$CC $CPPFLAGS $CFLAGS -fPIC -c $1.c && \
-$CC $CFLAGS -fPIC -shared $LDFLAGS -Wl,-soname,$1.so -o $1.so $1.o -lc
diff --git a/src/plugins/examples/log.c b/src/plugins/examples/log.c
deleted file mode 100644
index 1cc4650..0000000
--- a/src/plugins/examples/log.c
+++ /dev/null
 <at>  <at>  -1,184 +0,0  <at>  <at> 
-/*
- *  OpenVPN -- An application to securely tunnel IP networks
- *             over a single TCP/UDP port, with support for SSL/TLS-based
- *             session authentication and key exchange,
- *             packet encryption, packet authentication, and
- *             packet compression.
- *
- *  Copyright (C) 2002-2010 OpenVPN Technologies, Inc. <sales <at> openvpn.net>
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License version 2
- *  as published by the Free Software Foundation.
- *
- *  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 (see the file COPYING included with this
- *  distribution); if not, write to the Free Software Foundation, Inc.,
- *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-/*
- * This plugin is similar to simple.c, except it also logs extra information
- * to stdout for every plugin method called by OpenVPN.
- *
- * See the README file for build instructions.
- */
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-
-#include "openvpn-plugin.h"
-
-/*
- * Our context, where we keep our state.
- */
-struct plugin_context {
-  const char *username;
-  const char *password;
-};
-
-/*
- * Given an environmental variable name, search
- * the envp array for its value, returning it
- * if found or NULL otherwise.
- */
-static const char *
-get_env (const char *name, const char *envp[])
-{
-  if (envp)
-    {
-      int i;
-      const int namelen = strlen (name);
-      for (i = 0; envp[i]; ++i)
-	{
-	  if (!strncmp (envp[i], name, namelen))
-	    {
-	      const char *cp = envp[i] + namelen;
-	      if (*cp == '=')
-		return cp + 1;
-	    }
-	}
-    }
-  return NULL;
-}
-
-OPENVPN_EXPORT openvpn_plugin_handle_t
-openvpn_plugin_open_v1 (unsigned int *type_mask, const char *argv[], const char *envp[])
-{
-  struct plugin_context *context;
-
-  /*
-   * Allocate our context
-   */
-  context = (struct plugin_context *) calloc (1, sizeof (struct plugin_context));
-
-  /*
-   * Set the username/password we will require.
-   */
-  context->username = "foo";
-  context->password = "bar";
-
-  /*
-   * Which callbacks to intercept.
-   */
-  *type_mask =
-    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_UP) |
-    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_DOWN) |
-    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_ROUTE_UP) |
-    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_IPCHANGE) |
-    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_TLS_VERIFY) |
-    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_AUTH_USER_PASS_VERIFY) |
-    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_CLIENT_CONNECT_V2) |
-    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_CLIENT_DISCONNECT) |
-    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_LEARN_ADDRESS) |
-    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_TLS_FINAL);
-
-  return (openvpn_plugin_handle_t) context;
-}
-
-void
-show (const int type, const char *argv[], const char *envp[])
-{
-  size_t i;
-  switch (type)
-    {
-    case OPENVPN_PLUGIN_UP:
-      printf ("OPENVPN_PLUGIN_UP\n");
-      break;
-    case OPENVPN_PLUGIN_DOWN:
-      printf ("OPENVPN_PLUGIN_DOWN\n");
-      break;
-    case OPENVPN_PLUGIN_ROUTE_UP:
-      printf ("OPENVPN_PLUGIN_ROUTE_UP\n");
-      break;
-    case OPENVPN_PLUGIN_IPCHANGE:
-      printf ("OPENVPN_PLUGIN_IPCHANGE\n");
-      break;
-    case OPENVPN_PLUGIN_TLS_VERIFY:
-      printf ("OPENVPN_PLUGIN_TLS_VERIFY\n");
-      break;
-    case OPENVPN_PLUGIN_AUTH_USER_PASS_VERIFY:
-      printf ("OPENVPN_PLUGIN_AUTH_USER_PASS_VERIFY\n");
-      break;
-    case OPENVPN_PLUGIN_CLIENT_CONNECT_V2:
-      printf ("OPENVPN_PLUGIN_CLIENT_CONNECT_V2\n");
-      break;
-    case OPENVPN_PLUGIN_CLIENT_DISCONNECT:
-      printf ("OPENVPN_PLUGIN_CLIENT_DISCONNECT\n");
-      break;
-    case OPENVPN_PLUGIN_LEARN_ADDRESS:
-      printf ("OPENVPN_PLUGIN_LEARN_ADDRESS\n");
-      break;
-    case OPENVPN_PLUGIN_TLS_FINAL:
-      printf ("OPENVPN_PLUGIN_TLS_FINAL\n");
-      break;
-    default:
-      printf ("OPENVPN_PLUGIN_?\n");
-      break;
-    }
-
-  printf ("ARGV\n");
-  for (i = 0; argv[i] != NULL; ++i)
-    printf ("%d '%s'\n", (int)i, argv[i]);
-
-  printf ("ENVP\n");
-  for (i = 0; envp[i] != NULL; ++i)
-    printf ("%d '%s'\n", (int)i, envp[i]);
-}
-
-OPENVPN_EXPORT int
-openvpn_plugin_func_v1 (openvpn_plugin_handle_t handle, const int type, const char *argv[], const char *envp[])
-{
-  struct plugin_context *context = (struct plugin_context *) handle;
-
-  show (type, argv, envp);
-
-  /* check entered username/password against what we require */
-  if (type == OPENVPN_PLUGIN_AUTH_USER_PASS_VERIFY)
-    {
-      /* get username/password from envp string array */
-      const char *username = get_env ("username", envp);
-      const char *password = get_env ("password", envp);
-
-      if (username && !strcmp (username, context->username)
-	  && password && !strcmp (password, context->password))
-	return OPENVPN_PLUGIN_FUNC_SUCCESS;
-      else
-	return OPENVPN_PLUGIN_FUNC_ERROR;
-    }
-  else
-    return OPENVPN_PLUGIN_FUNC_SUCCESS;
-}
-
-OPENVPN_EXPORT void
-openvpn_plugin_close_v1 (openvpn_plugin_handle_t handle)
-{
-  struct plugin_context *context = (struct plugin_context *) handle;
-  free (context);
-}
diff --git a/src/plugins/examples/log_v3.c b/src/plugins/examples/log_v3.c
deleted file mode 100644
index 742c756..0000000
--- a/src/plugins/examples/log_v3.c
+++ /dev/null
 <at>  <at>  -1,247 +0,0  <at>  <at> 
-/*
- *  OpenVPN -- An application to securely tunnel IP networks
- *             over a single TCP/UDP port, with support for SSL/TLS-based
- *             session authentication and key exchange,
- *             packet encryption, packet authentication, and
- *             packet compression.
- *
- *  Copyright (C) 2002-2009 OpenVPN Technologies, Inc. <sales <at> openvpn.net>
- *  Copyright (C) 2010 David Sommerseth <dazo <at> users.sourceforge.net>
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License version 2
- *  as published by the Free Software Foundation.
- *
- *  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 (see the file COPYING included with this
- *  distribution); if not, write to the Free Software Foundation, Inc.,
- *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-/*
- * This plugin is similar to simple.c, except it also logs extra information
- * to stdout for every plugin method called by OpenVPN.  The only difference
- * between this (log_v3.c) and log.c is that this module uses the v3 plug-in
- * API.
- *
- * See the README file for build instructions.
- */
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-
-#define ENABLE_SSL
-
-#include "openvpn-plugin.h"
-
-/*
- * Our context, where we keep our state.
- */
-struct plugin_context {
-  const char *username;
-  const char *password;
-};
-
-/*
- * Given an environmental variable name, search
- * the envp array for its value, returning it
- * if found or NULL otherwise.
- */
-static const char *
-get_env (const char *name, const char *envp[])
-{
-  if (envp)
-    {
-      int i;
-      const int namelen = strlen (name);
-      for (i = 0; envp[i]; ++i)
-	{
-	  if (!strncmp (envp[i], name, namelen))
-	    {
-	      const char *cp = envp[i] + namelen;
-	      if (*cp == '=')
-		return cp + 1;
-	    }
-	}
-    }
-  return NULL;
-}
-
-OPENVPN_EXPORT int
-openvpn_plugin_open_v3 (const int v3structver,
-                        struct openvpn_plugin_args_open_in const *args,
-                        struct openvpn_plugin_args_open_return *ret)
-{
-  struct plugin_context *context = NULL;
-
-  /* Check that we are API compatible */
-  if( v3structver != OPENVPN_PLUGINv3_STRUCTVER ) {
-    return OPENVPN_PLUGIN_FUNC_ERROR;
-  }
-
-  /*  Which callbacks to intercept.  */
-  ret->type_mask =
-    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_UP) |
-    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_DOWN) |
-    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_ROUTE_UP) |
-    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_IPCHANGE) |
-    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_TLS_VERIFY) |
-    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_AUTH_USER_PASS_VERIFY) |
-    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_CLIENT_CONNECT_V2) |
-    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_CLIENT_DISCONNECT) |
-    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_LEARN_ADDRESS) |
-    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_TLS_FINAL);
-
-
-  /* Allocate our context */
-  context = (struct plugin_context *) calloc (1, sizeof (struct plugin_context));
-
-  /* Set the username/password we will require. */
-  context->username = "foo";
-  context->password = "bar";
-
-  /* Point the global context handle to our newly created context */
-  ret->handle = (void *) context;
-
-  return OPENVPN_PLUGIN_FUNC_SUCCESS;
-}
-
-void
-show (const int type, const char *argv[], const char *envp[])
-{
-  size_t i;
-  switch (type)
-    {
-    case OPENVPN_PLUGIN_UP:
-      printf ("OPENVPN_PLUGIN_UP\n");
-      break;
-    case OPENVPN_PLUGIN_DOWN:
-      printf ("OPENVPN_PLUGIN_DOWN\n");
-      break;
-    case OPENVPN_PLUGIN_ROUTE_UP:
-      printf ("OPENVPN_PLUGIN_ROUTE_UP\n");
-      break;
-    case OPENVPN_PLUGIN_IPCHANGE:
-      printf ("OPENVPN_PLUGIN_IPCHANGE\n");
-      break;
-    case OPENVPN_PLUGIN_TLS_VERIFY:
-      printf ("OPENVPN_PLUGIN_TLS_VERIFY\n");
-      break;
-    case OPENVPN_PLUGIN_AUTH_USER_PASS_VERIFY:
-      printf ("OPENVPN_PLUGIN_AUTH_USER_PASS_VERIFY\n");
-      break;
-    case OPENVPN_PLUGIN_CLIENT_CONNECT_V2:
-      printf ("OPENVPN_PLUGIN_CLIENT_CONNECT_V2\n");
-      break;
-    case OPENVPN_PLUGIN_CLIENT_DISCONNECT:
-      printf ("OPENVPN_PLUGIN_CLIENT_DISCONNECT\n");
-      break;
-    case OPENVPN_PLUGIN_LEARN_ADDRESS:
-      printf ("OPENVPN_PLUGIN_LEARN_ADDRESS\n");
-      break;
-    case OPENVPN_PLUGIN_TLS_FINAL:
-      printf ("OPENVPN_PLUGIN_TLS_FINAL\n");
-      break;
-    default:
-      printf ("OPENVPN_PLUGIN_?\n");
-      break;
-    }
-
-  printf ("ARGV\n");
-  for (i = 0; argv[i] != NULL; ++i)
-    printf ("%d '%s'\n", (int)i, argv[i]);
-
-  printf ("ENVP\n");
-  for (i = 0; envp[i] != NULL; ++i)
-    printf ("%d '%s'\n", (int)i, envp[i]);
-}
-
-static void
-x509_print_info (X509 *x509crt)
-{
-  int i, n;
-  int fn_nid;
-  ASN1_OBJECT *fn;
-  ASN1_STRING *val;
-  X509_NAME *x509_name;
-  X509_NAME_ENTRY *ent;
-  const char *objbuf;
-  unsigned char *buf;
-
-  x509_name = X509_get_subject_name (x509crt);
-  n = X509_NAME_entry_count (x509_name);
-  for (i = 0; i < n; ++i)
-    {
-      ent = X509_NAME_get_entry (x509_name, i);
-      if (!ent)
-	continue;
-      fn = X509_NAME_ENTRY_get_object (ent);
-      if (!fn)
-	continue;
-      val = X509_NAME_ENTRY_get_data (ent);
-      if (!val)
-	continue;
-      fn_nid = OBJ_obj2nid (fn);
-      if (fn_nid == NID_undef)
-	continue;
-      objbuf = OBJ_nid2sn (fn_nid);
-      if (!objbuf)
-	continue;
-      buf = (unsigned char *)1; /* bug in OpenSSL 0.9.6b ASN1_STRING_to_UTF8 requires this workaround */
-      if (ASN1_STRING_to_UTF8 (&buf, val) <= 0)
-	continue;
-
-      printf("X509 %s: %s\n", objbuf, (char *)buf);
-      OPENSSL_free (buf);
-    }
-}
-
-
-
-OPENVPN_EXPORT int
-openvpn_plugin_func_v3 (const int version,
-                        struct openvpn_plugin_args_func_in const *args,
-                        struct openvpn_plugin_args_func_return *retptr)
-{
-  struct plugin_context *context = (struct plugin_context *) args->handle;
-
-  printf("\nopenvpn_plugin_func_v3() :::::>> ");
-  show (args->type, args->argv, args->envp);
-
-  /* Dump some X509 information if we're in the TLS_VERIFY phase */
-  if ((args->type == OPENVPN_PLUGIN_TLS_VERIFY) && args->current_cert ) {
-    printf("---- X509 Subject information ----\n");
-    printf("Certificate depth: %i\n", args->current_cert_depth);
-    x509_print_info(args->current_cert);
-    printf("----------------------------------\n");
-  }
-
-  /* check entered username/password against what we require */
-  if (args->type == OPENVPN_PLUGIN_AUTH_USER_PASS_VERIFY)
-    {
-      /* get username/password from envp string array */
-      const char *username = get_env ("username", args->envp);
-      const char *password = get_env ("password", args->envp);
-
-      if (username && !strcmp (username, context->username)
-	  && password && !strcmp (password, context->password))
-	return OPENVPN_PLUGIN_FUNC_SUCCESS;
-      else
-	return OPENVPN_PLUGIN_FUNC_ERROR;
-    }
-  else
-    return OPENVPN_PLUGIN_FUNC_SUCCESS;
-}
-
-OPENVPN_EXPORT void
-openvpn_plugin_close_v1 (openvpn_plugin_handle_t handle)
-{
-  struct plugin_context *context = (struct plugin_context *) handle;
-  free (context);
-}
diff --git a/src/plugins/examples/simple.c b/src/plugins/examples/simple.c
deleted file mode 100644
index f26d89f..0000000
--- a/src/plugins/examples/simple.c
+++ /dev/null
 <at>  <at>  -1,120 +0,0  <at>  <at> 
-/*
- *  OpenVPN -- An application to securely tunnel IP networks
- *             over a single TCP/UDP port, with support for SSL/TLS-based
- *             session authentication and key exchange,
- *             packet encryption, packet authentication, and
- *             packet compression.
- *
- *  Copyright (C) 2002-2010 OpenVPN Technologies, Inc. <sales <at> openvpn.net>
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License version 2
- *  as published by the Free Software Foundation.
- *
- *  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 (see the file COPYING included with this
- *  distribution); if not, write to the Free Software Foundation, Inc.,
- *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-/*
- * This file implements a simple OpenVPN plugin module which
- * will examine the username/password provided by a client,
- * and make an accept/deny determination.  Will run
- * on Windows or *nix.
- *
- * See the README file for build instructions.
- */
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-
-#include "openvpn-plugin.h"
-
-/*
- * Our context, where we keep our state.
- */
-struct plugin_context {
-  const char *username;
-  const char *password;
-};
-
-/*
- * Given an environmental variable name, search
- * the envp array for its value, returning it
- * if found or NULL otherwise.
- */
-static const char *
-get_env (const char *name, const char *envp[])
-{
-  if (envp)
-    {
-      int i;
-      const int namelen = strlen (name);
-      for (i = 0; envp[i]; ++i)
-	{
-	  if (!strncmp (envp[i], name, namelen))
-	    {
-	      const char *cp = envp[i] + namelen;
-	      if (*cp == '=')
-		return cp + 1;
-	    }
-	}
-    }
-  return NULL;
-}
-
-OPENVPN_EXPORT openvpn_plugin_handle_t
-openvpn_plugin_open_v1 (unsigned int *type_mask, const char *argv[], const char *envp[])
-{
-  struct plugin_context *context;
-
-  /*
-   * Allocate our context
-   */
-  context = (struct plugin_context *) calloc (1, sizeof (struct plugin_context));
-
-  /*
-   * Set the username/password we will require.
-   */
-  context->username = "foo";
-  context->password = "bar";
-
-  /*
-   * We are only interested in intercepting the
-   * --auth-user-pass-verify callback.
-   */
-  *type_mask = OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_AUTH_USER_PASS_VERIFY);
-
-  return (openvpn_plugin_handle_t) context;
-}
-
-OPENVPN_EXPORT int
-openvpn_plugin_func_v1 (openvpn_plugin_handle_t handle, const int type, const char *argv[], const char *envp[])
-{
-  struct plugin_context *context = (struct plugin_context *) handle;
-
-  /* get username/password from envp string array */
-  const char *username = get_env ("username", envp);
-  const char *password = get_env ("password", envp);
-
-  /* check entered username/password against what we require */
-  if (username && !strcmp (username, context->username)
-      && password && !strcmp (password, context->password))
-    return OPENVPN_PLUGIN_FUNC_SUCCESS;
-  else
-    return OPENVPN_PLUGIN_FUNC_ERROR;
-}
-
-OPENVPN_EXPORT void
-openvpn_plugin_close_v1 (openvpn_plugin_handle_t handle)
-{
-  struct plugin_context *context = (struct plugin_context *) handle;
-  free (context);
-}
diff --git a/src/plugins/examples/simple.def b/src/plugins/examples/simple.def
deleted file mode 100755
index a87507d..0000000
--- a/src/plugins/examples/simple.def
+++ /dev/null
 <at>  <at>  -1,6 +0,0  <at>  <at> 
-LIBRARY   OpenVPN_PLUGIN_SAMPLE
-DESCRIPTION "Sample OpenVPN plug-in module."
-EXPORTS
-   openvpn_plugin_open_v1    <at> 1
-   openvpn_plugin_func_v1    <at> 2
-   openvpn_plugin_close_v1   <at> 3
diff --git a/src/plugins/examples/winbuild b/src/plugins/examples/winbuild
deleted file mode 100755
index decf05f..0000000
--- a/src/plugins/examples/winbuild
+++ /dev/null
 <at>  <at>  -1,18 +0,0  <at>  <at> 
-#
-# Build an OpenVPN plugin module on Windows/MinGW.
-# The argument should be the base name of the C source file
-# (without the .c).
-#
-
-# This directory is where we will look for openvpn-plugin.h
-INCLUDE="-I../../../include"
-
-CC_FLAGS="-O2 -Wall"
-
-gcc -DBUILD_DLL $CC_FLAGS $INCLUDE -c $1.c
-gcc --disable-stdcall-fixup -mdll -DBUILD_DLL -o junk.tmp -Wl,--base-file,base.tmp $1.o
-rm junk.tmp
-dlltool --dllname $1.dll --base-file base.tmp --output-exp temp.exp --input-def $1.def
-rm base.tmp
-gcc --enable-stdcall-fixup -mdll -DBUILD_DLL -o $1.dll $1.o -Wl,temp.exp
-rm temp.exp
--

-- 
1.7.3.4


------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
Alon Bar-Lev | 15 May 00:29
Picon
Gravatar

[PATCH 1/2] cleanup: spec: make space/tab consistent

Signed-off-by: Alon Bar-Lev <alon.barlev <at> gmail.com>
---
 distro/rpm/openvpn.spec.in |   34 +++++++++++++++++-----------------
 1 files changed, 17 insertions(+), 17 deletions(-)

diff --git a/distro/rpm/openvpn.spec.in b/distro/rpm/openvpn.spec.in
index a6f31bd..de46f59 100644
--- a/distro/rpm/openvpn.spec.in
+++ b/distro/rpm/openvpn.spec.in
@@ -12,8 +12,8 @@
 #   rpmbuild -tb [openvpn.x.tar.gz] --define 'with_password_save 1'

 Summary:	OpenVPN is a robust and highly flexible VPN daemon by James Yonan.
-Name:           @PACKAGE@
-Version:        @VERSION@
+Name:		@PACKAGE@
+Version:	@VERSION@
 Release:	1
 URL:		http://openvpn.net/
 Source0:	http://prdownloads.sourceforge.net/openvpn/%{name}-%{version}.tar.gz
@@ -30,27 +30,27 @@ BuildRoot:	%{_tmppath}/%{name}-%(id -un)

 AutoReq: 0

-BuildRequires: openssl-devel >= 0.9.6
-Requires:      openssl       >= 0.9.6
+BuildRequires:	openssl-devel >= 0.9.6
+Requires:	openssl       >= 0.9.6

 %if "%{_vendor}" == "Mandrakesoft"
-%{!?without_lzo:BuildRequires: liblzo1-devel >= 1.07}
-%{!?without_lzo:Requires:      liblzo1       >= 1.07}
+%{!?without_lzo:BuildRequires:	liblzo1-devel >= 1.07}
+%{!?without_lzo:Requires:	liblzo1       >= 1.07}
 %else
 %if "%{_vendor}" == "MandrakeSoft"
-%{!?without_lzo:BuildRequires: liblzo1-devel >= 1.07}
-%{!?without_lzo:Requires:      liblzo1       >= 1.07}
+%{!?without_lzo:BuildRequires:	liblzo1-devel >= 1.07}
+%{!?without_lzo:Requires:	liblzo1       >= 1.07}
 %else
-%{!?without_lzo:BuildRequires: lzo-devel >= 1.07}
-%{!?without_lzo:Requires:      lzo       >= 1.07}
+%{!?without_lzo:BuildRequires:	lzo-devel >= 1.07}
+%{!?without_lzo:Requires:	lzo       >= 1.07}
 %endif
 %endif

-%{!?without_pam:BuildRequires: pam-devel}
-%{!?without_pam:Requires:      pam}
+%{!?without_pam:BuildRequires:	pam-devel}
+%{!?without_pam:Requires:	pam}

-%{?with_pkcs11:BuildRequires: pkcs11-helper-devel}
-%{?with_pkcs11:Requires:      pkcs11-helper}
+%{?with_pkcs11:BuildRequires:	pkcs11-helper-devel}
+%{?with_pkcs11:Requires:	pkcs11-helper}

 #
 # Description
@@ -68,7 +68,7 @@ and portability to most major OS platforms.
 %package devel
 Summary:	OpenVPN is a robust and highly flexible VPN daemon by James Yonan.
 Group:		Applications/Internet
-Requires:      %{name}
+Requires:	%{name}
 %description devel
 Development support for OpenVPN.

@@ -134,10 +134,10 @@ popd
 # Install init script
 %if "%{VENDOR}" == "SuSE"
 %__install -c -d -m 755 "%{buildroot}/etc/init.d"
-%__install -c -m 755 "distro/rpm/%{name}.init.d.suse"  "%{buildroot}/etc/init.d/%{name}"
+%__install -c -m 755 "distro/rpm/%{name}.init.d.suse" "%{buildroot}/etc/init.d/%{name}"
 %else
 %__install -c -d -m 755 "%{buildroot}/etc/rc.d/init.d"
-%__install -c -m 755 distro/rpm/%{name}.init.d.rhel  "%{buildroot}/etc/rc.d/init.d/%{name}"
+%__install -c -m 755 distro/rpm/%{name}.init.d.rhel "%{buildroot}/etc/rc.d/init.d/%{name}"
 %endif

 # Install /etc/openvpn
--

-- 
1.7.3.4

------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
Yi-Wen Cheng | 14 May 11:57
Picon
Picon

Re: [Translation Question] Traditional Chinese

I will try to revise both of them recently and post them here to you.
 
When I post the files, could you assist me to make sure whether do they work well or not? 
 
Thank you very much!
 
Regards
 
YiWen
 
On 05/14/12, Heiko Hund <heiko.hund <at> sophos.com> wrote:
Hi Yi-Wen

On Monday 14 May 2012 09:37:24 Yi-Wen Cheng wrote:
> Could I get the "res_openvpn-gui-res-xx.rc" of simplified chinese?

So far nobody has done the translation to Simplyfied Chinese. If you would do
it in parallel while translating into Traditional Chinese you'd be some kind
of hero! =)

> Shall I just translate all Engilsh sentences in English rc file and save to
> another rc file?

Yes, just grab the English version, save it as openvpn-gui-res-zh-hant.rc (or
zh-hans for simplified) and translate it. Make sure to use UTF-8 encoding for
the file. When you're done simply post the result here and I will add it to
the official repository.

Regards
Heiko
--
Heiko Hund | Software Engineer | Tel +49-721-25516-237 | Fax -200
SOPHOS NSG | Amalienbadstr. 41 Bau 52 | 76227 Karlsruhe | Germany

 
------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
Openvpn-devel mailing list
Openvpn-devel <at> lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openvpn-devel
Yi-Wen Cheng | 14 May 10:37
Picon
Picon

Re: [Translation Question] Traditional Chinese

Shall I just translate all Engilsh sentences in English rc file and save to another rc file?
 
Thanks! 
 
On 05/14/12, Yi-Wen Cheng <u4787521 <at> anu.edu.au> wrote:
Excuse me.
 
Could I get the "res_openvpn-gui-res-xx.rc" of simplified chinese?
 
Or is anyone can assist me to revise this file?
 
Thanks a lot!
 
Regards
 
YiWen
 
 
 
On 04/12/12, Samuli Seppänen <samuli <at> openvpn.net> wrote:
Il 12.04.2012 10:54, Heiko Hund ha scritto:
> Hi YiWen
>
> On Thursday 12 April 2012 02:28:17 Yi-Wen Cheng wrote:
>> I want to translate openvpn into Traditional Chinese.
>> Could anybody assist me what should I do to start the work?
> Great, thank you! I suppose you want to translate the Openvpn GUI for Windows.
> If so, just fetch the English resource file from the repository at [1],
> translate the strings in it and make sure you save it UTF-8 encoded. Then send
> it to this list or open an issue about it at [2]. Please also change the
> language constants to "LANG_CHINESE | SUBLANG_CHINESE_TRADITIONAL" (this will
> make a bit more sense after you looked at [1]).
>
> Heiko
Look here for additional instructions:

<https://community.openvpn.net/openvpn/wiki/Translations>

All the best,

--
Samuli Seppänen
Community Manager
OpenVPN Technologies, Inc

irc freenode net: mattock


------------------------------------------------------------------------------
For Developers, A Lot Can Happen In A Second.
Boundary is the first to Know...and Tell You.
Monitor Your Applications in Ultra-Fine Resolution. Try it FREE!
http://p.sf.net/sfu/Boundary-d2dvs2
_______________________________________________
Openvpn-devel mailing list
Openvpn-devel <at> lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openvpn-devel
 
 
------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
Openvpn-devel mailing list
Openvpn-devel <at> lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openvpn-devel
Yi-Wen Cheng | 14 May 10:30
Picon
Picon

Re: [Translation Question] Traditional Chinese

Excuse me.
 
Could I get the "res_openvpn-gui-res-xx.rc" of simplified chinese?
 
Or is anyone can assist me to revise this file?
 
Thanks a lot!
 
Regards
 
YiWen
 
 
 
On 04/12/12, Samuli Seppänen <samuli <at> openvpn.net> wrote:
Il 12.04.2012 10:54, Heiko Hund ha scritto:
> Hi YiWen
>
> On Thursday 12 April 2012 02:28:17 Yi-Wen Cheng wrote:
>> I want to translate openvpn into Traditional Chinese.
>> Could anybody assist me what should I do to start the work?
> Great, thank you! I suppose you want to translate the Openvpn GUI for Windows.
> If so, just fetch the English resource file from the repository at [1],
> translate the strings in it and make sure you save it UTF-8 encoded. Then send
> it to this list or open an issue about it at [2]. Please also change the
> language constants to "LANG_CHINESE | SUBLANG_CHINESE_TRADITIONAL" (this will
> make a bit more sense after you looked at [1]).
>
> Heiko
Look here for additional instructions:

<https://community.openvpn.net/openvpn/wiki/Translations>

All the best,

--
Samuli Seppänen
Community Manager
OpenVPN Technologies, Inc

irc freenode net: mattock


------------------------------------------------------------------------------
For Developers, A Lot Can Happen In A Second.
Boundary is the first to Know...and Tell You.
Monitor Your Applications in Ultra-Fine Resolution. Try it FREE!
http://p.sf.net/sfu/Boundary-d2dvs2
_______________________________________________
Openvpn-devel mailing list
Openvpn-devel <at> lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openvpn-devel
 
------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
Openvpn-devel mailing list
Openvpn-devel <at> lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openvpn-devel

Gmane