顯示文章

這裡允許您檢視這個會員的所有文章。請注意, 您只能看見您有權限閱讀的文章。


主題 - Tony-tang

頁: [1] 2
1
Linux 討論版 / 無法用ssh登入 但是webmin可以
« 於: 2007-07-12 17:45 »
今天同事說 無法用ssh登入   我試了一下   在密碼登入時  輸入密碼  結果無法登入 又跳出密碼欄 要求輸入密碼   已為被改密碼了  結果用webmin 登入  可以正常登入  不過用webmin修改或新增帳號密碼時  整個 passwd檔跟shadow檔 變成0k
由於主機不在身邊  無法直接於本機端登入測試  請問有人遇過這種問題嗎?

2
雜七雜八 / 關於台中的活動
« 於: 2006-02-09 11:42 »
收到這封信
引用
發佈人jou

SA@台中研討會:ITIL(r)(IT Infrastructure Library資訊技術基礎架構庫)

最近,越來越多的人開始談起ITIL,但ITIL究竟是什麼?對於企業又
能帶來什麼好處?

ITIL

這是全文

恩 只有一個小小的疑問  時間跟地點也一起標上  或有報名連結 會好一點吧

小小建議  :oops:

3
雜七雜八 / 梁楓 生日快樂喔
« 於: 2004-11-24 12:49 »
既然看到了  就不好意思當不知道了   :lol:

 梁楓

生日快樂

4
雜七雜八 / 愚人節禮物 ??
« 於: 2004-04-01 09:50 »
引用
Return-Path: <netman@study-area.org>
Received: from infotram.net (61-218-107-10.HINET-IP.hinet.net [61.218.107.10])
   by bonmag.com.tw (8.11.6/8.11.6) with ESMTP id i31HBwX08604
   for <tony@infotram.net>; Thu, 1 Apr 2004 09:11:58 -0800
Message-Id: <200404011711.i31HBwX08604@bonmag.com.tw>
From: netman@study-area.org
To: tony@infotram.net
Subject: Re: Details
Date: Thu, 1 Apr 2004 09:14:24 +0800
MIME-Version: 1.0
Content-Type: multipart/mixed;
   boundary="----=_NextPart_000_0011_00002C8F.0000717F"
X-Priority: 3
X-MSMail-Priority: Normal
Status:  



一早就收到一堆病毒信   其中一封還是網大的名子  哈  現在的病毒信越來越多了

5
Windows 討論版 / hpzntp04.dll
« 於: 2004-03-18 17:00 »
在使用 word 1-2個小時候 會跳出本程式出現錯誤的訊息 然後說hpzntp04.dll這個檔執行錯誤    請問應該(大概)是哪方面的問題

6
長時間在電腦跟電視前面呆著的後遺症 就是四肢嚴重退化(還好不是五肢)
所以常想找時間作作運動  但是一個人運動又很無聊  所以突發奇想 不知道study-area的夥伴中有沒有人要組個運動團隊  周六日找一天團練  一個月還可以來一次南北大對抗   也可以增加大家見面的機會   不知是否可行

唉  才30出頭 爬個6樓竟然會喘  真是吐血

7
雜七雜八 / 有關奇科的課程
« 於: 2004-02-19 15:11 »
有關奇科開的linux課程   台北方面是由三大名師中的其中一位上嗎 ??(netman,梁基,鳥哥)

同事再問  我說不太可能  但奇科打的廣告是以這三位為號招的 真的的話就恭喜了

8
Linux 討論版 / [問題]安裝到一半出現問題
« 於: 2003-07-31 12:32 »
因為沒遇到過這問題   所以問一下大家  
安裝RedHat 7.3 華碩的入門伺服器   scis的硬碟  每次分割好  在install的時候
跑到一辦就出現這樣的訊息  然後就要我reboot  是硬碟的問題嗎  還是我的光碟有問題呢   以前灌過一次 ok的送去日本後  前幾天拿回來 想說重灌   就一直這樣了  
 該死的日本人:evil:  把我的伺服器教壞了 :cry:  :cry:

Traceback (innermost last):

SystemError: (16, '\270\313\270m\251\316\250t\262\316\270\352\267\275\246\243\270L\244\244')

Individual package selection status:


<6>EXT3-fs: mounted filesystem with ordered data mode.

[版主dean: 中間一大段錯誤訊息幾乎包含所有常用關鍵字,常常會被搜尋到,卻與主題沒有直接關係,所以就先暫時移除,橘色保留下來為較特殊的錯誤訊息字眼]

9
我在安裝時 不知道哪裡搞錯  原本登入openwebmail 會有一個預設的e-mail address(無法刪除的) username@xxx.xxx.tw 但是我的變成username@主機名稱  這要去哪改啊  我在/etc/hosts 加上了網域名 還是不行  好像是再裝libnet-1.0901 時 有問是否要update 我沒注意選了yes 然後就是一些選項  我想問如果要改回來要在那改

因為有些急  所以開主題發問  如果有人問過  麻煩貼link給我謝謝

10
雜七雜八 / 小常識 希望對大家有用
« 於: 2003-02-20 12:12 »
身為現代人,不要再笨笨的跑去報案
 
 
 1.【身份証遺失的自保方法】
 2.【被冒名申請大哥大門號的自保方法】、
 
 3.【信用卡被盜刷、或被冒名申辦信用卡的自保方法】、
 
 4.【信用卡遺失、被盜刷的自保方法】
 
 
 
 
 1.【身份証遺失的自保方法】
 
 因為事關許多人的權益,也是為不讓不法之徒有機可趁,身份証遺失時,
 
 請千萬記得:
 
 
 
 (1)向警察局備案遺失→錯誤示範→因為於法無據,我翻遍六法全書,也找
 
 不到「備案」二字。
 
 (2)開立遺失三聯單→錯誤示範-只有刑案才開立報案三連單,沒有遺失三連
 
 單這種東西。
 
 (3)向金融聯合徵信中心登錄遺失記錄→錯誤示範,沒必要。
 
 
 
 一般民眾身份證遺失或被竊或被搶直覺上會向警察單位報失,但實際上益
 
 處不大吶,因為那是電視上說的,根本於法無據,難道你先向銀行借錢,
 
 再去報案遺失身分証,就不用還錢ㄚ,萬一被冒用,還是得上法院,現在
 
 的警察單位不會理你啦!
 
 
 
 *正確做法應馬上準備:
 
 1、二月內大頭照黑白彩色均可,要二吋的。
 
 
 
 2、規費200元。
 
 
 
 3、帶印章及戶口名簿正本或駕照正本(最後領到的畢業證書正本或役男
 
 可帶退伍令正本也可以)。
 
 
 
 4、親自前往戶籍所在地戶政事務所辦理身份證領/補/換發手續,約5-10分
 
 鐘即可。
 
 
 
 *金資中心也馬上與戶政機關電腦記錄取得連線 (http://www.ris.gov.tw/) ,
 
 日後身分文件以最後一次「身份證 領/補/換 發日」為主。
 
 
 
 (上網可查詢http://www.ris.gov.tw/docs/uping.html )
 
 
 
 這樣一來,歹徒就無法籍著銀行體系辦走你的戶頭或信用卡或貸款之類,
 
 至於其他的麻煩則可由戶政事務所的"身份證 領/補/換 發申請書",來證明
 
 舊有(原)身分證已遺失作 廢,申請一張證明也才十塊錢而已;較之前面所
 
 述之法大大省事了,因為要跑三個手續喔!不要這麼費事吧!況且戶政事
 
 務所也很樂意為大家服務呀!
 
 
 
 
 
 
 
 2.【被冒名申請大哥大門號的自保方法】
 
 某大哥大公司通知你電話費逾期未繳,而門號根本不是你的,電信業者還
 
 會語帶恐嚇告訴你,如果不繳錢,會將你所申請使用的門號,一併停機,
 
 怎麼辦?播打客服專線反應,首先客服人員會向你確認身分,然後要求你
 
 先向警察機關報案,取得報案証明後,再到其公司門市,填表格,辦理未
 
 申辦門號等等手續,以確認該門號不是你所申辦,一般來說,這個手續完
 
 成後,電信業者就不會再向你催繳電話費,可是.............這是錯的。
 
 
 
 正確做法:
 
 
 
 你完全無需理會他,頂多到附近郵局寄個存証信函給他,聲明該門號與你
 
 無關﹝網路可找到範例﹞,不要笨到請一天假,去排隊辦裡這些無關緊要
 
 的手續。
 
 
 
 解答:
 
 
 
 一、該門號既然不是你所申請,為何你要請一天假,去排隊辦裡這些無關
 
         緊要的手續,應該是由電信業者,拿著當初申辦人所填寫之申請書,
 
         來到你面前,向你確認簽名筆跡真偽,而不是善良的你,跑去讓他們
 
         確認你的無辜。
 
 
 
 二、報案應該由被害人實施,而大哥大門號遭冒辦,有損失的是電信業者
 
        ,所以被害人也是電信業者,應該由電信業者向司法機關報詐欺案。
 
         所以你不是被害人,充其量,你頂多是證人、關係人身分,去報案,
 
         是要不到報案三聯單的。
 
 
 
 三、電信業者如果逕行將你所申請、並有繳交電話費之門號擅自停機,你
 
         絕對可以向消保單位檢舉,你甚至可以要求被停機期間的損失賠償,
 
         因為你沒犯錯、沒違法。
 
 
 四、若電信業者向法院申請支付命令,你只要向法院提起抗告﹝寄一封書
 
         函過去即可﹞,或將存証信函影本提交法院即可,不必跑法院。若收
 
         到法院通知需要到庭,這個時候你一定要請假不可,但是,只要你確
 
         定沒申請該門號的立場,你一定會勝訴,還可以要求賠償,至少也有
 
         個車馬費,不無小補。不過,通常電信業者不會笨到自討沒趣,一般
 
         收到你的存証信函,公司就會自行吸收損失。
 
       
 
 3.【信用卡被盜刷、或被冒名申辦信用卡的自保方法】
 
     一般來講,處理方法與被冒名申請大哥大門號的自保方法雷同,請該銀
 
     行自行確認簽名非你所為,不要笨到請一天假,去替銀行、電信業者,
 
     做一些他們應該做的徵信工作。
 
       
 
 4.【信用卡遺失、被盜刷的自保方法】
 
      趕快去向警察杯杯報案,這樣才會早日抓到壞人。大錯特錯,一定要在
 
      第一時間,向原發卡銀行申報遺失。在你掛失後的盜刷行為,銀行會自
 
      行吸收,掛失前的盜刷款項,有的銀行會要求你支付,或分攤部份金額
 
      ,你要付    這種冤枉錢嗎?這個時候,你一定要堅持繼續看下去因為替
 
       你省錢的方法在下面。
 
 
 
       解答:你可以向發卡銀行要求檢視簽帳單,若簽帳單上的簽名,與你在
 
       信用卡背面簽名不同或相差甚遠,這筆錢你就省了,原因不用多說,因
 
       為簽名與卡片背面明顯不同,責任是要歸屬於受刷卡商店的,另,你可
 
       以要求檢視刷卡時的監視錄影帶,若信用卡背面署名為王淑芬、陳淑惠
 
       、mary、a-mei,而商家仍然讓男生刷卡成功,嘿嘿嘿,這筆錢又可以省
 
        了。
 
     
      所以囉!身為現代人,不要再笨笨的跑去報案...還被警察杯杯笑你傻瓜。

11
朋友寄給我的mail 看看就好  也許會有心得吧


對於印度,大概許多人都只知道這是個遙遠,貧窮但卻培養了許多優秀工程師的國度。
然而,近來國內軟體業為了積極朝國際化邁進而導入的CMM軟體成熟度認證,卻都必
須花大筆錢請印度軟體公司來做顧問,而光在印度取得CMM L5的公司就比全亞洲加起來
還多. 曾經, 台灣也是以數學能力傲視全球的國家,怎麼一下子豬羊變色了呢?關鍵
似乎在於思考應用的能力。這篇文章提供了一些值得我們深思的借鏡



印度憑什麼培養出全球炙手可熱的軟體工程師?

有七成人口是文盲的印度,卻是全球軟體人才的培育重鎮,貧窮的印度,憑什麼培養出
全球炙手可熱的軟體工程師?怎樣的教育方式,能讓學生一出校園就展現競爭力?美國
有三分之一的軟體工程師,是印度人。二十五萬印度人勢力深入矽谷,已不是新聞。美
國的高科技人才工作簽證(H1-B),將近一半是發給印度人,剩下一半才由其他數十個
國家瓜分。

貧窮的印度,憑什麼培養出這樣充沛、素質又令人覬覦的軟體人才?答案是教育。獨特
的教育方式,讓印度成為軟體人才的搖籃。

沒有選擇題的童年

問印度工程師為什麼他們軟體強,第一個答案一定是:「我們數學好。」

數學從定義、定理推演,一步步把題目解出來,與寫軟體需要的分析、邏輯,能力一
致。
印度教育首重數學。「從小我們就有好多好多數學功課,」年輕的工程師木塔卡
(T.Mutatkar)笑著說:「老師曾教我們不要抱怨,誰教數學是印度人發明的。」

印度人不但發明了數字及算術,還發現了許多重要的數學定理,如三角形面積公式以及
π。從古印度到現代,數學是印度人邏輯思考的原動力,和印度的宗教哲思同等珍貴。

觀察印度的教育,他們對邏輯思考的培養,有一套獨特的理念。

「我們從中學開始,考試就很少選擇題!」西藏血統、印度長大、最後在台灣念大學的
札西格勒說。

那怎麼考?譬如,考甘地的不合作運動,「請分析這個運動的原因、過程、影響及對印
度的意義,」札西格勒有些得意地說:「你必須把整個事件的來龍去脈搞得清清楚楚,
才寫得出來。」老師評分,是看學生如何運用史實,分析、推論是否合理,「沒有標準
答案的,」札西格勒補充。

老師的負擔當然增加,對學生卻是用心良苦。「我們不要學生在短暫的思考後選一個答
案,」海德拉巴資訊科技學院行政長拉曼(M.Raman)解釋:「我們希望學生多做完整
的思考。」

而從小習慣寫申論題的札西格勒,來台灣念政大企管系時,最不能適應的,就是「選擇
題」。

「大學還考選擇題?」他詫異地問。
印度軟體工程師,分析能力不單用在「寫」,還用在「說」。

「很會說話」是他們和台灣工程師最大的不同。

把競爭力說出來

台灣工程師多半「沈默寡言、多做少說」,印度工程師卻可以侃侃而談一個小時,依然
神采煥發、黑黑的臉龐眼睛發亮。而且不得不承認,他們言之有物,條理分明。這竟也
是軟體教育的一部份。

印度工程學院多半有一門課:溝通技巧。「我們要不斷上台演講,」海德拉巴資訊科技
學院大三學生普拉卡西笑著說:「剛開始緊張得發抖,現在很習慣了。」透過一次次公
開演講,學生漸漸學會如何清楚表達意見,如何快速切入重點,更重要的是,態度要落
落大方。「這是維繫客戶的關鍵能力之一,」軟體公司Snowbit助理執行長阿加渥
(R.Agarwal)指出:「你要能溝通,才能釐清客戶的需求;你要有信心,客戶才會對
你有信心。」換言之,學生不但要培養競爭力,還要學會「把競爭力秀出來」,讓別人
一目了然。

印度軟體產業風生水起近十年,產業日臻成熟,軟體公司水準也趨於一致。這時候要搶
國外大客戶,比的就是「人」的競爭力。業界的競爭既激烈又現實,這種氛圍,也早已
滲入校園。

美國《商業週刊》,曾報導印度最頂尖的孟買科技學院「最恐怖的教授」。他給全班最
高分者A,第二高分者B,剩下的全部是C、D、E。教授告訴學生:「今日我用這樣的方
式磨練你們,就是要你們未來遇到競爭者,絕不可以被比下去。」

高度競爭壓力下,學生們個個想脫穎而出,夜夜挑燈苦讀。「一個禮拜讀七天,我們沒
有週末的,」他們異口同聲。問他們有沒有時間約會?答案是:「如果今天要約會,明
天就得念兩倍書補回來。」

為什麼願意長期在高壓下苦讀?動力是什麼?「為了錢,」一個學生直截了當地說。在
印度,一個軟體工程師的薪水,是平均國民所得的十倍以上。功課好的,可以進知名大
公司,薪水更翻升三、四倍。「這是改善生活的捷徑,」木塔卡說。他自從考進資訊系
後,經濟狀況並不好的父母逢人就炫耀,「還有人來說媒,」才念大學的他笑著說。這
種「天將降大任」式的培育下,學生進入職場多半可以立刻上線。

學校、產業一家親

除了學生自己夠用功、專業能力優異外,印度軟體教育還有一項特色,就是與產業互動
非常密切,學生對新技術的發展完全不脫節。這也是矽谷特別偏愛印度工程師的原因之
一。

學生和產業互動有多密切?可以從海德拉巴資訊科技學院中,學生雷地的學校生活中看
出來。

雷地今年大三,這學期修的課中,有三門是「業界老師」開的:IBM開的「電子商務最
新應用」,甲骨文開的「資料庫軟體」及摩托羅拉開的「通訊軟體」。全部是各公司的
拿手領域,教的也是最新的技術發展。系上二十七位老師中,有十六位是業界老師(在
業界工作的博士),比「正規教授」還多。雷地另外選修了一門「網路架構」。這門課
很特殊,是學長們向學校建議開設的。

「歡迎學生告訴我們他們想學什麼,有求知慾才會有進步,」行政長拉曼微笑說。
拉曼認為,學校的責任是創造一個環境,讓學生對科技有充分的接觸(exposure),才
會激發強烈的渴望,探究科技最新發展。而學校的策略,就是運用業界的力量,歡迎業
界設立校園實驗室,二十四小時開放給學生,夜間並由學生擔任管理員。

雷地在眾多實驗室中,選了摩托羅拉的實驗室工作,因為他對通訊很感興趣。摩托羅拉
提供通訊軟體平台,「可以整夜窩在實驗室,在平台上試寫軟體,真是非常過癮,」雷
地笑得很開心。

講到暑期實習,雷地笑得更得意,因為他去年暑假的實習,是在美國紐約。

「我第一次出國喔,」雷地忍不住透露。美國一家電子商務軟體公司EXCEED,想在印度
設立研發中心,提供兩個名額給學生赴紐約總部實習,當然也希望他們畢業後加入。

是否加入,雷地笑著說會考慮。但說到實習的收穫,他神情轉為穩重:「要開發一個電
子商務軟體,我們在學校多少有學過;但要實際去維持它,若不是這次實習,我不會知
道有這麼複雜。」

密切的互動下,學生、學校、業界,串起一個共存共榮的循環體系。

業界提供豐富的資源,學校搭橋運輸養分,學生盡情吸收。學生畢業後投身業界,把當
年吸收的養分回饋產業。

「整個循環要快速、有效率,才能追上科技發展的步調,」邦加洛資訊科技學院教授迪
內夏(K.Dinesha)指出。

幾位台灣資工系教授,在聽到印度這個「循環體系」時,都表示「的確會對產業發展有
幫助」、「知道很重要」,但因為許多原因,在台灣很難落實。

首先是「業界老師」難實現。說穿了,就是供、需都有問題。

以供應面來說,執全世界技術牛耳的,多半是跨國企業。但這些外商公司在台灣多半是
業務導向,鮮少有研發中心,遑論派專家進學校授課。

而本土企業縱使有意願,學校嚴格的把關卻又導致無法成? 「我們對教師的審查可是
『三級三審』:系審、院審、學校審,」交大資工系副系主任陳耀宗笑著比喻,他隨即
正色道:「審查標準還是看論文的數量。但業界的人哪有時間寫論文?」貝爾實驗室出
身的他,一再肯定「業界老師」的重要性,然而也承認,要改變現狀有困難。

那麼進入產業實習呢?

國內最早推動「專業實習」的元智大學資工系,系主任劉如生非常坦白地說:「很多廠
商抱著『利用』學生的心態,不是教學生、幫助學生,」他感到失望且憂慮。

但他也慶幸還有像工研院、資策會等對學生很有心的單位,希望企業也能同樣珍視產業
最重要的資產人才。

產業導向的隱憂

與產業密切互動,固然創造了今天印度軟體人才的優勢,但也埋下了隱憂。

「產業看三年,學校看十年」,這是技術研發的普遍共識。「太過產業導向的學校課
程,長久下來,學校的研究會喪失前瞻性,」印度德里科技學院資訊系主任庫瑪
(M.Kumar)一針見血指出。

然而,綜觀印度政府的科技教育政策,卻是大力扶持「產業導向」的資訊科技學院成
立,提供土地、資金、協助募款,無一不是傾全力支持。

「今天我們好不容易創造出某種優勢,就要永遠保持這個優勢。」安得拉邦
(AndhraPradesh)州長納都(N..Naidu)指出。印度政府最害怕的,就是中國大陸循
相同模式,急起直追。

去年開始,印度政府喊出「二○○八年,百萬軟體人才」的口號(目前軟體人才有41萬
),產業界與學界,已動了起來,朝目標積極邁進。

資金撒下,一所所資訊科技學院正大興土木,要為軟體人才打造最好的設備環境。例如
邦加洛資訊科技學院的學生,每人配一部筆記型電腦,還可以無線上網。

但值此同時,印度卻有70%的文盲,完全活在另一個世界。就像林蔭幽深、一棟棟新式
大樓聳立的孟買大學,幾步之遙卻是孟買最大的貧民窟,同樣諷刺且令人觸目驚心。

印度政府難道沒有想過教育資源分配的問題?

「這一直是個錯誤,」卡納塔卡(Karnataka)州政府祕書長庫卡尼(V.Kulkarni)
說:「但不可否認的,這卻成就了我們的優勢。」

印度政府知道,要短期之內翻轉印度,從貧變富,由文盲變文明,是不可能的。

他們希望藉金字塔頂端2%人口的力量,帶動下面98%的平民。

12
雜七雜八 / What is AQ?
« 於: 2002-11-26 18:32 »
這是朋友寄給我的文章   看了後覺得對玩系統的朋友應該有些幫助 如果版主覺得不好放在這 就刪了吧
引用
近來在企業管理領域出現了個新名詞:AQ(Adversity Quotient),

明確地描繪出一個人的挫折忍受力。AQ(逆境商數)是我們在面對逆境時的處理能力。

 

AQ不但與我們的工作表現息息相關,更是一個人是否快樂的重要關鍵。

尤其在大環境不景氣的當下,不論是在職或待業,突發狀況的發生機率都會提高,

因此練就一身回應逆境的好本領,就愈顯重要了。

 

根據AQ專家保羅‧史托茲博士的研究,一個人AQ愈高,愈能以彈性面對逆境,

積極樂觀,接受困難的挑戰,發揮創意找出解決方案,因此能不屈不撓,愈挫愈勇,而終究表現卓越。

 

相反的,AQ低的人,則會感到沮喪、迷失,處處抱怨,逃避挑戰,缺乏創意,

而往往半途而廢、自暴自棄,終究一事無成。

 

到底該怎麼做,才能提昇自己的AQ呢?

(1)凡事不抱怨,只解決問題:

     碰到不如意的情況,AQ低的人會怪東怪西,都是別人的錯,害自己不能如願,

     抱怨過後,心情往往更加沮喪,而問題依舊無解。AQ高的人通常沒時間抱怨,

     因為他們正忙著解決問題。所以請減少抱怨的時間,因為少一分時間抱怨,

     就多一分時間進步。

 

(2)先看優點,再看缺點:

     當挫折發生時,如果第一個念頭是:「完了,這下沒救了。」那就很難逃脫悲

     觀的詛咒。AQ高手的做法是,遇到狀況,先問自己:「現在有什麼是可珍惜的?」

     換句話說,在挫折中找優勢,並把它轉化成進步的助力。例如,突然失業當然錯愕,

     但想一想,現在多了時間自己可支配,還有資遣費,於是再進修培養第二專長,

     似乎會是不錯的想法,也許\就此開創出另一番格局。畢竟,自怨自哀解決不了問

     題,懂得在逆境中找機會,才是高AQ的精彩表現。

 

(3)將當下的不幸,變成日後的「幸虧」:

     看待挫敗,AQ高手清楚知道,一時的成敗並不能定一生。就像李安,大學沒考上,

     卻因此找到了自己真正的舞台,現在想想,還真「幸虧」當時沒考上大學,

     要不現在就不是這番光景了。因此只要保持樂觀,賽翁失馬焉知非福,

     AQ高手就能將當下的不幸,變成日後回顧時的「幸虧」。

 

讓我們一起提昇自己的逆境商數,如此一來,工作上的卓越成就,一定指日可待。

13
Linux 討論版 / 關於 sendmail+mysql-8.10.1.patch
« 於: 2002-11-14 14:49 »
在網路上找了好久 終於找到了 sendmail+mysql 的東東 但一解開 好笑了 沒doc
沒 how-to 解開只有一個檔 sendmail+mysql-8.10.1.patch 內容如下
引用

*** sendmail-8.10.0.Beta12/devtools/Site/site.config.m4   Mon Apr  3 16:20:48 2000
--- sendmail-devel/devtools/Site/site.config.m4   Mon Apr  3 15:31:20 2000
***************
*** 0 ****
--- 1,8 ----
+ APPENDDEF(`confENVDEF',      `-DMYSQL_MAP')
+ APPENDDEF(`confINCDIRS',   `-I/usr/include -I/usr/local/mysql/include/mysql')
+ APPENDDEF(`confLIBDIRS',   `-L/usr/local/mysql/lib/mysql/')
+ APPENDDEF(`confLIBS',      `-lmysqlclient')
+
+ APPENDDEF(`confSMSRCADD', `mysql_sendmail.c')
+ APPENDDEF(`confSMOBJADD', `mysql_sendmail.o')
+
*** sendmail-8.10.0.Beta12/sendmail/mysql_sendmail.h   Mon Apr  3 16:20:48 2000
--- sendmail-devel/sendmail/mysql_sendmail.h   Mon Apr  3 13:23:10 2000
***************
*** 0 ****
--- 1,28 ----
+ #include
+ #include
+
+ struct mysql_sendmail_struct
+ {
+         char            *mysql_host;
+         char            *mysql_user;
+         char            *mysql_passwd;
+         char            *mysql_database;
+         char            *mysql_user_table;
+         char            *mysql_alias_table;
+         char            *mysql_map_table;
+         char            *mysql_lhs_col;
+         char            *mysql_rhs_col;
+ };
+
+ struct passwd *get_mysql_pwd(char *user_name);
+ struct passwd *get_mysql_uid(int user_id);
+ char *get_mysql_alias(char *mysql_name);
+ struct mysql_sendmail_struct *get_mysql_conf();
+ char *mysql_map_dequote(char *);
+ static struct passwd pw;
+ typedef struct mysql_sendmail_struct  MYSQL_MAP_STRUCT;
+ MYSQL_MAP_STRUCT *mysql_map_scanconf();
+
+ #define EX_NOTFOUND    EX_NOHOST
+ #define ALIAS_LHS "address"
+ #define ALIAS_RHS "alias"
*** sendmail-8.10.0.Beta12/sendmail/alias.c   Tue Jan 18 16:55:31 2000
--- sendmail-devel/sendmail/alias.c   Mon Apr  3 13:46:00 2000
***************
*** 11,16 ****
--- 11,17 ----
   */
 
  #include
+ #include
 
  #ifndef lint
  static char id[] = "@(#)$Id: alias.c,v 8.139 2000/01/18 21:55:31 gshapiro Exp $";
***************
*** 110,115 ****
--- 111,128 ----
        return;
     }
     if (p == NULL)
+         {
+                 p = get_mysql_alias(a->q_user);
+                 if (stat == EX_TEMPFAIL || stat == EX_UNAVAILABLE)
+                 {
+                         a->q_flags |= QS_QUEUEUP;
+                         if (e->e_message == NULL)
+                                 e->e_message = newstr("alias database unavailable");
+          return;
+                 }
+         }
+
+    if (p == NULL)
        return;
 
     /*
***************
*** 165,170 ****
--- 178,184 ----
        (void) strlcat(obuf, a->q_user, sizeof obuf);
     owner = aliaslookup(obuf, &status);
     if (owner == NULL)
+    if((owner = get_mysql_alias(obuf)) == NULL)
        return;
 
     /* reflect owner into envelope sender */
*** sendmail-8.10.0.Beta12/sendmail/conf.c   Thu Jan 20 01:31:01 2000
--- sendmail-devel/sendmail/conf.c   Mon Apr  3 13:23:10 2000
***************
*** 556,561 ****
--- 556,566 ----
               map_parseargs, null_map_open, null_map_close,
               bogus_map_lookup, null_map_store);
     }
+ #ifdef MYSQL_MAP
+         MAPDEF("mysql", NULL, 0,
+                 mysql_map_parseargs, mysql_map_open, mysql_map_close,
+                 mysql_map_lookup, null_map_store);
+ #endif
  }
 
  #undef MAPDEF
*** sendmail-8.10.0.Beta12/sendmail_mysql.conf   Mon Apr  3 16:20:48 2000
--- sendmail-devel/sendmail_mysql.conf   Mon Apr  3 15:40:58 2000
***************
*** 0 ****
--- 1,20 ----
+ ##############################################################################
+ # General (can be overriden in sendmail.cf by per map options)
+ ##############################################################################
+
+ MysqlHost               host
+ MysqlUsername           username
+ MysqlPassword           password
+ MysqlDatabase           database_name
+ MysqlUserTable          users_table
+ MysqlAliasTable         alias_table
+ MysqlMapTable           default_map_table
+
+ ##############################################################################
+ #  For the MySQL MAP only (for alias you have to define it in
+ # mysql_sendmail.h before you compile)
+ ##############################################################################
+
+ MysqlLHSColumn          default_key_column
+ MysqlRHSColumn          default_value_column
+
*** sendmail-8.10.0.Beta12/sendmail/mysql_sendmail.c   Mon Apr  3 16:20:48 2000
--- sendmail-devel/sendmail/mysql_sendmail.c   Mon Apr  3 13:46:32 2000
***************
*** 0 ****
--- 1,300 ----
+ #include
+ #include
+ #include
+ #include
+ #include
+ #include
+
+ #define CONF_FILE   "/etc/sendmail_mysql.conf"
+ #define BUF_SIZE   128
+
+ MYSQL mysql;
+ MYSQL_RES *result;
+ my_ulonglong num_rows;
+ my_ulonglong num_fields;
+ char *mysql_alias;
+ MYSQL_ROW field;
+ MAP *map;
+ char *name;
+ struct mysql_sendmail_struct *mysqlconf;
+ // struct mysql_sendmail_struct *mysqlpwd;
+ // struct mysql_sendmail_struct *mysql_class;
+
+ char *get_mysql_alias(char *mysql_name)
+ {
+
+ char queryBuf[256];
+
+   mysql_init(&mysql);
+   mysqlconf=get_mysql_conf();
+   if(mysqlconf == NULL)
+   {
+    sm_syslog(LOG_INFO, NOQID,"Error reading config file");
+    return NULL;
+   }
+   if(!mysql_real_connect(&mysql,mysqlconf->mysql_host,mysqlconf->mysql_user,mysqlconf->mysql_passwd,mysqlconf->mysql_database,0,NULL,0))
+   {
+                 sm_syslog(LOG_INFO, NOQID,
+                 "Connection to MySQL server failed(%s)",mysql_error(&mysql));
+                 mysql_close(&mysql);
+                 return NULL;
+   }
+   snprintf(queryBuf, sizeof(queryBuf), "select %s from %s where %s = \'%s\'",ALIAS_RHS,mysqlconf->mysql_alias_table,ALIAS_LHS,mysql_name);
+ #ifdef MYSQL_VERBOSE
+
+   sm_syslog(LOG_INFO, NOQID,"Looking up %s in alias table\n",mysql_name);
+
+ #endif
+   mysql_query(&mysql,queryBuf);
+   result=mysql_store_result(&mysql);
+   if(result == NULL)
+   {
+    sm_syslog(LOG_INFO, NOQID,"Error sending query to server\n");
+         mysql_free_result(result);
+         mysql_close(&mysql);
+    return NULL;
+   }
+   num_rows=mysql_num_rows(result);
+   if(num_rows == 0)
+   {
+ #ifdef MYSQL_VERBOSE
+
+         sm_syslog(LOG_INFO, NOQID,"Not found...\n");
+
+ #endif
+       mysql_free_result(result);
+          mysql_close(&mysql);
+          return NULL;
+   }
+   field = mysql_fetch_row(result);
+   mysql_alias = field[0];
+ #ifdef MYSQL_VERBOSE
+
+   sm_syslog(LOG_INFO, NOQID,"Found, aliased to: %s\n",mysql_alias);
+
+ #endif
+   mysql_free_result(result);
+   mysql_close(&mysql);
+   return mysql_alias;
+ }
+
+
+ struct mysql_sendmail_struct *get_mysql_conf() {
+    static struct mysql_sendmail_struct mss;
+    static char host[BUF_SIZE], user[BUF_SIZE], password[BUF_SIZE],
+       database[BUF_SIZE], user_table[BUF_SIZE],
+       alias_table[BUF_SIZE], map_table[BUF_SIZE],
+       lhs[BUF_SIZE],rhs[BUF_SIZE];
+
+    char buf[256];
+    char *name, *value;
+    int  pos;
+    char *delim = "\n \t";
+    FILE *conf;
+
+    mss.mysql_host = NULL;
+    mss.mysql_user = NULL;
+    mss.mysql_passwd = NULL;
+    mss.mysql_database = NULL;
+    mss.mysql_user_table = NULL;
+    mss.mysql_map_table = NULL;
+    mss.mysql_rhs_col = NULL;
+    mss.mysql_lhs_col = NULL;
+
+    if(!(conf = fopen(CONF_FILE, "r")))
+       /* Could not open config file */
+       return NULL;
+    while(fgets(buf, 256, conf)) {
+       for(pos=0; strchr(delim+1, buf[pos]) && buf[pos]; pos++)
+          ;
+       name = buf+pos;
+       if(*name=='#' || *name=='\n' || *name==0)
+          continue;
+       for(; !strchr(delim, buf[pos]) && buf[pos]; pos++)
+          ;
+       buf[pos] = 0;
+       if(!*name) continue;
+       for(pos++; strchr(delim+1, buf[pos]) && buf[pos]; pos++)
+          ;
+       value = buf+pos;
+       for(; !strchr(delim, buf[pos]) && buf[pos]; pos++)
+          ;
+       buf[pos] = 0;
+       if(!*value) continue;
+       switch(name[5]) {
+       case 'H':
+          if(!strcmp(name, "MysqlHost")) {
+             strncpy(host, value, BUF_SIZE);
+             mss.mysql_host = host;
+          }
+          break;
+       case 'U':
+          if(!strcmp(name, "MysqlUsername")) {
+             strncpy(user, value, BUF_SIZE);
+             mss.mysql_user = user;
+          } else if(!strcmp(name, "MysqlUserTable")) {
+             strncpy(user_table, value, BUF_SIZE);
+             mss.mysql_user_table = user_table;
+          }
+          break;
+       case 'D':
+          if(!strcmp(name, "MysqlDatabase")) {
+             strncpy(database, value, BUF_SIZE);
+             mss.mysql_database = database;
+          }
+          break;
+       case 'M':
+          if(!strcmp(name, "MysqlMapTable")){
+             strncpy(map_table, value, BUF_SIZE);
+             mss.mysql_map_table = map_table;
+          }
+          break;
+       case 'A':
+          if(!strcmp(name, "MysqlAliasTable")) {
+             strncpy(alias_table, value, BUF_SIZE);
+             mss.mysql_alias_table = alias_table;
+          }
+          break;
+       case 'P':
+          if(!strcmp(name, "MysqlPassword")) {
+             strncpy(password, value, BUF_SIZE);
+             mss.mysql_passwd = password;
+          }
+          break;
+ #ifdef MYSQL_MAP
+       case 'R':
+          if(!strcmp(name, "MysqlRHSColumn")) {
+             strncpy(rhs, value, BUF_SIZE);
+             mss.mysql_rhs_col = rhs;
+          }
+          break;
+       case 'L':
+          if(!strcmp(name, "MysqlLHSColumn")) {
+             strncpy(lhs, value, BUF_SIZE);
+             mss.mysql_lhs_col = lhs;
+          }
+          break;
+ #endif
+       }
+    }
+    fclose(conf);
+    if(mss.mysql_host && mss.mysql_user && /* mss.mysql_passwd && */
+       mss.mysql_database && mss.mysql_user_table &&
+ #ifdef MYSQL_MAP
+       mss.mysql_lhs_col && mss.mysql_rhs_col &&
+ #endif
+       mss.mysql_alias_table && mss.mysql_map_table)
+    {
+       return &mss;
+    }
+    return NULL;
+ }
+
+
+ struct passwd * get_mysql_pwd(char * user_name)
+ {
+
+ char queryBuf[256];
+    
+    static struct passwd pw;
+    mysql_init(&mysql);
+    mysqlconf = get_mysql_conf();
+      if(mysqlconf == NULL)
+      {
+            sm_syslog(LOG_INFO, NOQID,"Error reading config file");
+            return NULL;
+      }
+       if(!mysql_real_connect(&mysql,mysqlconf->mysql_host,mysqlconf->mysql_user,mysqlconf->mysql_passwd,mysqlconf->mysql_database,0,NULL,0))
+    {
+                 sm_syslog(LOG_INFO, NOQID,
+                 "Connection to MySQL server(%s) failed\n",mysql_error(&mysql));
+       mysql_close(&mysql);
+       return NULL;
+    }
+    snprintf(queryBuf, sizeof(queryBuf), "select * from %s where username = \'%s\'",mysqlconf->mysql_user_table,user_name);
+ #ifdef MYSQL_VERBOSE
+
+    sm_syslog(LOG_INFO, NOQID,"Looking up %s in user table\n",user_name);
+
+ #endif
+    mysql_query(&mysql, queryBuf);
+    if((result=mysql_store_result(&mysql)) == NULL)
+    {
+       sm_syslog(LOG_INFO, NOQID,"Error sending query to server");
+       mysql_close(&mysql);
+       return NULL;
+    }
+    num_rows=mysql_num_rows(result);
+    num_fields=mysql_num_fields(result);
+    if(num_rows == 0)
+    {
+ #ifdef MYSQL_VERBOSE
+       sm_syslog(LOG_INFO, NOQID,"Not found...\n");
+ #endif
+       mysql_free_result(result);
+       mysql_close(&mysql);
+       return NULL;
+    }
+
+    field=mysql_fetch_row(result);
+ #ifdef MYSQL_VERBOSE
+
+    sm_syslog(LOG_INFO, NOQID,"Found,local user: %s\n",user_name);
+
+ #endif
+
+ pw.pw_name = field[0];
+ pw.pw_passwd = field[1];
+ pw.pw_uid = atoi(field[2]);
+ pw.pw_gid = atoi(field[3]);
+ if((pw.pw_gecos = field[4]) == NULL)
+   pw.pw_gecos = ",,,";
+ pw.pw_dir = field[5];
+ if((pw.pw_shell = field[6]) == NULL)
+   pw.pw_shell = "/bin/noshell";
+ mysql_free_result(result);
+ mysql_close(&mysql);
+ return &pw;
+ }
+
+ void mysqlclass(class, hostname, db_name, table_name)
+
+    int class;
+    const char *hostname;
+    const char *db_name;
+    const char *table_name;
+ {
+    int i;
+    char queryBuf[256];
+
+    mysql_init(&mysql);
+    mysqlconf = get_mysql_conf();
+    if(mysqlconf == NULL)
+    {
+       syserr("Error reading config file");
+       return;
+    }
+
+ if(!mysql_real_connect(&mysql,hostname,mysqlconf->mysql_user,mysqlconf->mysql_passwd,db_name,0,NULL,0))
+    {
+       syserr("Cannot connect to MySQL database server");
+       return;
+    }
+    snprintf(queryBuf,sizeof(queryBuf),"select * from %s",table_name);
+    mysql_query(&mysql,queryBuf);
+    result=mysql_store_result(&mysql);
+    if(result == NULL)
+    {
+       syserr("Error querying MySQL server");
+       return;
+    }
+    num_rows=mysql_num_rows(result);
+    if(num_rows == 0)
+       return;
+    for( i = 0; i < num_rows; i++)
+    {
+       field=mysql_fetch_row(result);
+       setclass(class, field[0]);
+       mysql_field_seek(result, 0);
+    }
+ }
*** sendmail-8.10.0.Beta12/sendmail/readcf.c   Thu Jan 13 16:47:09 2000
--- sendmail-devel/sendmail/readcf.c   Mon Apr  3 13:44:33 2000
***************
*** 100,105 ****
--- 100,106 ----
     register char *p;
     long sff = SFF_OPENASROOT;
     struct stat statb;
+         char *hostname, *db_name, *table_name;
     char buf[MAXLINE];
     char exbuf[MAXLINE];
     char pvpbuf[MAXLINE + MAXATOM];
***************
*** 436,441 ****
--- 437,495 ----
           xla_init(&bp[1]);
           break;
  #endif /* XLA */
+
+        case 'Q':      /* SQL class */
+          mid = macid(&bp[1], &ep);
+          for (p = ep; isascii(*p) && isspace(*p); )
+             p++;
+          if (p[0] == '-' && p[1] == 'o')
+          {
+             optional = TRUE;
+             while (*p != '\0' && !(isascii(*p) && isspace(*p)))
+                p++;
+             while (isascii(*p) && isspace(*p))
+                p++;
+          }
+          else
+             optional = FALSE;
+          hostname = db_name = table_name = NULL;
+          while(*p) {
+                  while(isascii(*p) && isspace(*p))
+                p++;
+             if(*p != '-') {
+                syserr("mysqlclass: invalid argument, starts with a '%c' instead of a '-'", *p);
+                while(*p != '\0' && !(isascii(*p) && isspace(*p)))
+                   p++;
+                while(isascii(*p) && isspace(*p))
+                   p++;
+                continue;
+             }
+             p++;
+             switch(*p) {
+             case 'H':
+                hostname = ++p;
+                break;
+             case 'D':
+                db_name = ++p;
+                break;
+             case 'T':
+                table_name = ++p;
+                break;
+             }   
+             while(*p != '\0' && !(isascii(*p) && isspace(*p)))
+                p++;
+             if(!*p)
+                continue;
+             *p = 0;
+             p++;
+          }
+                
+          if(!hostname || !db_name || !table_name) {
+             syserr("mysqlclass: missing parameters");
+             break;
+          }
+          mysqlclass(mid,hostname,db_name,table_name);
+          break;
 
  #if defined(SUN_EXTENSIONS) && defined(SUN_LOOKUP_MACRO)
          case 'L':      /* lookup macro */
*** sendmail-8.10.0.Beta12/sendmail/map.c   Tue Jan 18 14:32:30 2000
--- sendmail-devel/sendmail/map.c   Mon Apr  3 13:46:47 2000
***************
*** 7048,7050 ****
--- 7048,7421 ----
     *statp = EX_CONFIG;
     return NULL;
  }
+
+ /* ########## MySQL MAP #################### */
+
+ #include
+ #include
+ #include
+ #include
+ #include
+
+ MYSQL mysql;
+ MYSQL_RES *sql_result;
+ my_ulonglong num_rows;
+ MYSQL_ROW field;
+ my_ulonglong num_fields;
+ char *result;
+
+ MYSQL_MAP_STRUCT *mysqlmap;
+
+ mysql_map_open(map, mode)
+         MAP *map;
+         int mode;
+ {
+    int *statp;
+
+    mysqlmap = (MYSQL_MAP_STRUCT *) map->map_db1;
+    mysql_init(&mysql);
+    if(!mysql_real_connect(&mysql,mysqlmap->mysql_host,mysqlmap->mysql_user,mysqlmap->mysql_passwd,mysqlmap->mysql_database,0,NULL,0))
+    {
+                 sm_syslog(LOG_INFO, NOQID,
+                 "Connection to MySQL server failed(%s)",mysql_error(&mysql));
+                 mysql_close(&mysql);
+       return FALSE;
+    }
+     if (tTd(38, 2))
+                 printf("mysql_map_open(%s, %d)\n", map->map_mname,mode);
+ #ifdef MYSQL_VERBOSE
+
+    sm_syslog(LOG_INFO, NOQID,
+                 "Connecting to MySQL server(%s)",mysqlmap->mysql_host);
+
+ #endif
+
+         mode &= O_ACCMODE;
+         if (mode != O_RDONLY)
+         {
+                 return FALSE;
+         }
+         return TRUE;
+
+ }
+ char *mysql_map_lookup(map, name, av, statp)
+         MAP *map;
+         char *name;
+         char **av;
+         int *statp;
+
+ {
+         MYSQL_MAP_STRUCT *mysqlmap = NULL;
+         char keybuf[MAXNAME + 1];
+    int name_len;
+    char queryBuf[256];
+
+         if (tTd(38, 20))
+                 printf("mysql_map_lookup(%s, %s)\n", map->map_mname, name);
+    if(!mysql_map_open(map))
+    {
+                 sm_syslog(LOG_INFO, NOQID,"Error connecting to server");
+                 mysql_close(&mysql);
+                 *statp = EX_TEMPFAIL;
+                 return NULL;
+    }
+    mysqlmap = (MYSQL_MAP_STRUCT *) map->map_db1;
+    name_len = strlen(name);
+         if (name_len > MAXNAME)
+                 name_len = MAXNAME;
+         strncpy(keybuf, name, name_len);
+         keybuf[name_len] = '\0';
+
+ #ifdef MYSQL_VERBOSE
+
+         sm_syslog(LOG_INFO, NOQID,"Looking up %s in domainalias table\n",keybuf);
+
+ #endif
+    snprintf(queryBuf, sizeof(queryBuf), "select %s from %s where %s = \'%s\'",mysqlmap->mysql_rhs_col,mysqlmap->mysql_map_table,mysqlmap->mysql_lhs_col,keybuf);
+    mysql_query(&mysql, queryBuf);
+    sql_result = mysql_store_result(&mysql);
+    if(sql_result == NULL)
+    {
+       sm_syslog(LOG_INFO, NOQID,"Error sending query to server");
+       mysql_close(&mysql);
+                 *statp = EX_TEMPFAIL;
+       return NULL;
+    }
+    num_rows=mysql_num_rows(sql_result);
+    if(num_rows == 0)
+    {
+ #ifdef MYSQL_VERBOSE
+
+       sm_syslog(LOG_INFO, NOQID,"Not found...\n");
+
+ #endif
+                 result = NULL;
+                 *statp = EX_NOTFOUND;
+       goto exit;
+    }
+    field=mysql_fetch_row(sql_result);
+    result = field[0];
+    *statp = EX_OK;
+ #ifdef MYSQL_VERBOSE
+
+    sm_syslog(LOG_INFO, NOQID,"Found, rewriting to: %s", field[0]);
+
+ #endif
+
+ exit:   
+    if(sql_result != NULL)
+    {
+       mysql_free_result(sql_result);
+    }
+    mysql_map_close(map);
+
+    if(!result)
+       return NULL;
+
+    if (bitset(MF_MATCHONLY, map->map_mflags))
+       return map_rewrite(map, result, strlen(result), NULL);
+    else
+       return map_rewrite(map, result, strlen(result), av);
+
+ //   return result;
+
+ }
+
+ int mysql_map_close(map)
+ {
+ #ifdef MYSQL_VERBOSE
+
+         sm_syslog(LOG_INFO, NOQID,"Disconnecting from MySQL server");
+
+ #endif
+    mysql_close(&mysql);
+ }
+
+ char *
+ mysql_map_dequote(str)
+         char *str;
+ {
+         char *p;
+         char *start;
+         p = str;
+
+         if (*p == '"')
+         {
+                 start = ++p;
+         }
+         else
+         {
+                 return(str);
+         }
+         while (*p != '"' && *p != '\0')
+         {
+                 p++;
+         }
+         if (*p != '\0')
+                 *p = '\0';
+         return start;
+ }
+
+ // #endif
+ bool mysql_map_parseargs(map,args)
+         MAP *map;
+         char *args;
+
+ {
+
+    MYSQL_MAP_STRUCT *mysqlmap_conf;
+    char *result;
+         register char *p = args;
+         register int done;
+    if((mysqlmap_conf  = get_mysql_conf()) == NULL)
+    {
+       
+       sm_syslog(LOG_INFO, NOQID,"Error reading config file");
+       return FALSE;
+    }
+         mysqlmap  = (MYSQL_MAP_STRUCT *) xalloc(sizeof(MYSQL_MAP_STRUCT));
+
+    memcpy(mysqlmap,mysqlmap_conf,sizeof(MYSQL_MAP_STRUCT));
+
+            map->map_mflags |= MF_TRY0NULL | MF_TRY1NULL;
+         for (;;)
+         {
+                 while (isascii(*p) && isspace(*p))
+                         p++;
+                 if (*p != '-')
+                         break;
+                 switch (*++p)
+                 {
+                   case 'N':
+                         map->map_mflags |= MF_INCLNULL;
+                         map->map_mflags &= ~MF_TRY0NULL;
+                         break;
+
+                   case 'O':
+                         map->map_mflags &= ~MF_TRY1NULL;
+                         break;
+
+                   case 'o':
+
+                         map->map_mflags |= MF_OPTIONAL;
+                         break;
+
+                   case 'f':
+                         map->map_mflags |= MF_NOFOLDCASE;
+                         break;
+
+                   case 'm':
+                         map->map_mflags |= MF_MATCHONLY;
+                         break;
+
+                   case 'A':
+                         map->map_mflags |= MF_APPEND;
+                         break;
+
+                   case 'q':
+                         map->map_mflags |= MF_KEEPQUOTES;
+                         break;
+
+                   case 't':
+                         map->map_mflags |= MF_NODEFER;
+                         break;
+
+                   case 'a':
+                         map->map_app = ++p;
+                         break;
+                   case 'T':
+                         map->map_tapp = ++p;
+                         break;
+
+                   case 'H':             /* mysql host */
+                         while (isascii(*++p) && isspace(*p))
+                                 continue;
+                         map->map_domain = p;
+                         mysqlmap->mysql_host = p;
+                         break;
+
+                   case 'D':             /* mysql database */
+                         while (isascii(*++p) && isspace(*p))
+                                 continue;
+                         mysqlmap->mysql_database = p;
+                         break;
+
+
+                   case 'M':             /* mysql map table */
+                         while (isascii(*++p) && isspace(*p))
+                                 continue;
+                         mysqlmap->mysql_map_table = p;
+                         break;
+
+                   case 'P':             /* mysql passwd */
+                         while (isascii(*++p) && isspace(*p))
+                                 continue;
+                         mysqlmap->mysql_passwd = p;
+                         break;
+
+                   case 'U':             /* mysql username */
+                         while (isascii(*++p) && isspace(*p))
+                                 continue;
+                         mysqlmap->mysql_user = p;
+                         break;
+
+                   case 'L':             /* mysql LHS table */
+                         while (isascii(*++p) && isspace(*p))
+                                 continue;
+                         mysqlmap->mysql_lhs_col = p;
+                         break;
+
+                   case 'R':             /* mysql RHS table */
+                         while (isascii(*++p) && isspace(*p))
+                                 continue;
+                         mysqlmap->mysql_rhs_col = p;
+                         break;
+       
+       }
+                 /* need to account for quoted strings here arggg... */
+                 done =  isascii(*p) && isspace(*p);
+                 while (*p != '\0' && !done)
+                 {
+                         if (*p == '"')
+                         {
+                                 while (*++p != '"' && *p != '\0')
+                                 {
+                                         continue;
+                                 }
+                                 if (*p != '\0')
+                                         p++;
+                         }
+                         else
+                         {
+                                 p++;
+                         }
+                         done = isascii(*p) && isspace(*p);
+                 }
+
+                 if (*p != '\0')
+                         *p++ = '\0';
+    }
+         if (map->map_app != NULL)
+                 map->map_app = newstr(mysql_map_dequote(map->map_app));
+         if (map->map_tapp != NULL)
+                 map->map_tapp = newstr(mysql_map_dequote(map->map_tapp));
+         if (map->map_domain != NULL)
+                 map->map_domain = newstr(mysql_map_dequote(map->map_domain));
+
+
+         if (mysqlmap->mysql_host != NULL)
+       mysqlmap->mysql_host = newstr(mysql_map_dequote(mysqlmap->mysql_host));
+    else {
+                 syserr("MySQL map: -H for Host is required");
+       sm_syslog(LOG_INFO, NOQID,"Error getting server hostname");
+            return FALSE;
+    }
+         if (mysqlmap->mysql_user != NULL)
+       mysqlmap->mysql_user = newstr(mysql_map_dequote(mysqlmap->mysql_user));
+    else {
+                 syserr("MySQL map: Username is required");
+                       sm_syslog(LOG_INFO, NOQID,"Error getting databse username");
+                 return FALSE;
+    }
+ //        if (mysqlmap->mysql_passwd != NULL)
+ //                mysqlmap->mysql_passwd = newstr(mysql_map_dequote(mysqlmap->mysql_passwd));
+ //   else {
+ //                syserr("MySQL map: -P for Password is required");
+ //                sm_syslog(LOG_INFO, NOQID,"Error getting database password");
+ //                return FALSE;
+ //   }
+         if (mysqlmap->mysql_database != NULL)
+                 mysqlmap->mysql_database = newstr(mysql_map_dequote(mysqlmap->mysql_database));
+    else {
+                 syserr("MySQL map: -D for Database name is required");
+                 sm_syslog(LOG_INFO, NOQID,"Error getting database name");
+                 return FALSE;
+    }
+         if (mysqlmap->mysql_map_table != NULL)
+                 mysqlmap->mysql_map_table = newstr(mysql_map_dequote(mysqlmap->mysql_map_table));
+    else {
+                 syserr("MySQL map: -M for Map table is required");
+                 sm_syslog(LOG_INFO, NOQID,"Error getting map table name");
+                 return FALSE;
+    }
+
+         if (mysqlmap->mysql_lhs_col != NULL)
+                 mysqlmap->mysql_lhs_col = newstr(mysql_map_dequote(mysqlmap->mysql_lhs_col));
+    else {
+                 syserr("MySQL map: -L for LHS column is required");
+                 sm_syslog(LOG_INFO, NOQID,"Error getting RHS column  name");
+                 return FALSE;
+    }
+
+         if (mysqlmap->mysql_rhs_col != NULL)
+                 mysqlmap->mysql_rhs_col = newstr(mysql_map_dequote(mysqlmap->mysql_rhs_col));
+    else {
+                 syserr("MySQL map: -R for RHS column is required");
+                 sm_syslog(LOG_INFO, NOQID,"Error getting RHS column name");
+                 return FALSE;
+    }
+
+         map->map_db1 = (ARBPTR_T) mysqlmap;
+    return TRUE;
+ }
+
*** sendmail-8.10.0.Beta12/sendmail/recipient.c   Tue Jan  4 20:40:53 2000
--- sendmail-devel/sendmail/recipient.c   Mon Apr  3 13:46:11 2000
***************
*** 16,21 ****
--- 16,22 ----
  #endif /* ! lint */
 
  #include
+ #include
 
  static void   includetimeout __P((void));
  static ADDRESS   *self_reference __P((ADDRESS *));
***************
*** 874,879 ****
--- 875,886 ----
           dprintf("found (non-fuzzy)\n");
        return pw;
     }
+         else if((pw = get_mysql_pwd(name)) !=NULL)
+         {
+                  if (tTd(29, 4))
+                        dprintf("found (non-fuzzy)\n");
+                  return pw;
+         }
 
     /* try mapping it to lower case */
     tryagain = FALSE;
***************
*** 892,897 ****
--- 899,911 ----
        *fuzzyp = TRUE;
        return pw;
     }
+         else if(pw = get_mysql_pwd(name) != NULL)
+         {
+                 if (tTd(29, 4))
+                         printf("found (lower case)\n");
+                 *fuzzyp = TRUE;
+                 return pw;
+         }
 
  #if MATCHGECOS
     /* see if fuzzy matching allowed */
*** sendmail-8.10.0.Beta12/mail.local/mail.local.c   Fri Dec 24 20:27:21 1999
--- sendmail-devel/mail.local/mail.local.c   Mon Apr  3 15:01:31 2000
***************
*** 31,36 ****
--- 31,38 ----
  **  work on such architectures.
  */
 
+ #include
+
  #include
  #include
  #include
***************
*** 343,348 ****
--- 345,355 ----
                pw->pw_uid != uid))
        from = (pw = getpwuid(uid)) != NULL ? pw->pw_name : "???";
 
+    if (from == NULL && ((from = getlogin()) == NULL ||
+               (pw = get_mysql_pwd(from)) == NULL ||
+               pw->pw_uid != uid))
+       from = (pw = get_mysql_pwd(uid)) != NULL ? pw->pw_name : "???";
+
     /*
     **  There is no way to distinguish the error status of one delivery
     **  from the rest of the deliveries.  So, if we failed hard on one
***************
*** 454,459 ****
--- 461,467 ----
     char *addr;
  {
     if (getpwnam(addr) == NULL)
+      if (get_mysql_pwd(addr) == NULL)
        return "550 5.1.1 user unknown";
     return NULL;
  }
***************
*** 895,923 ****
     **  handled in the sendmail aliases file.
     */
     if ((pw = getpwnam(name)) == NULL)
!    {
!       if (ExitVal != EX_TEMPFAIL)
!          ExitVal = EX_UNAVAILABLE;
!       if (LMTPMode)
!       {
!          if (ExitVal == EX_TEMPFAIL)
!             printf("451 4.3.0 cannot lookup name: %s\r\n", name);
!          else
!             printf("550 5.1.1 unknown name: %s\r\n", name);
!       }
!       else
!       {
!          char *errcode = NULL;
!
!          if (ExitVal == EX_TEMPFAIL)
!             errcode = "451 4.3.0";
!          else
!             errcode = "550 5.1.1";
!          mailerr(errcode, "unknown name: %s", name);
!       }
!       return;
!    }
!    endpwent();
 
     /*
     **  Keep name reasonably short to avoid buffer overruns.
--- 903,932 ----
     **  handled in the sendmail aliases file.
     */
     if ((pw = getpwnam(name)) == NULL)
!      if ((pw = get_mysql_pwd(name)) == NULL)
!      {
!         if (ExitVal != EX_TEMPFAIL)
!            ExitVal = EX_UNAVAILABLE;
!         if (LMTPMode)
!         {
!            if (ExitVal == EX_TEMPFAIL)
!               printf("451 4.3.0 cannot lookup name: %s\r\n", name);
!            else
!               printf("550 5.1.1 unknown name: %s\r\n", name);
!         }
!         else
!         {
!            char *errcode = NULL;
!
!            if (ExitVal == EX_TEMPFAIL)
!               errcode = "451 4.3.0";
!            else
!               errcode = "550 5.1.1";
!            mailerr(errcode, "unknown name: %s", name);
!         }
!         return;
!      }
!      endpwent();
 
     /*
     **  Keep name reasonably short to avoid buffer overruns.
*** sendmail-8.10.0.Beta12/mail.local/mysql_sendmail.c   Mon Apr  3 16:20:48 2000
--- sendmail-devel/mail.local/mysql_sendmail.c   Mon Apr  3 15:11:07 2000
***************
*** 0 ****
--- 1,184 ----
+ #include
+ #include
+ #include
+ #include
+ #include
+
+ #define CONF_FILE   "/etc/sendmail_mysql.conf"
+ #define BUF_SIZE   128
+
+ MYSQL mysql;
+ MYSQL_RES *result;
+ my_ulonglong num_rows;
+ my_ulonglong num_fields;
+ char *mysql_alias;
+ MYSQL_ROW field;
+ //MAP *map;
+ char *name;
+ struct mysql_sendmail_struct *mysqlconf;
+
+ struct mysql_sendmail_struct *get_mysql_conf() {
+    static struct mysql_sendmail_struct mss;
+    static char host[BUF_SIZE], user[BUF_SIZE], password[BUF_SIZE],
+       database[BUF_SIZE], user_table[BUF_SIZE],
+       alias_table[BUF_SIZE], map_table[BUF_SIZE],
+       lhs[BUF_SIZE],rhs[BUF_SIZE];
+
+    char buf[256];
+    char *name, *value;
+    int  pos;
+    char *delim = "\n \t";
+    FILE *conf;
+
+    mss.mysql_host = NULL;
+    mss.mysql_user = NULL;
+    mss.mysql_passwd = NULL;
+    mss.mysql_database = NULL;
+    mss.mysql_user_table = NULL;
+    mss.mysql_map_table = NULL;
+    mss.mysql_rhs_col = NULL;
+    mss.mysql_lhs_col = NULL;
+
+    if(!(conf = fopen(CONF_FILE, "r")))
+       /* Could not open config file */
+       return NULL;
+    while(fgets(buf, 256, conf)) {
+       for(pos=0; strchr(delim+1, buf[pos]) && buf[pos]; pos++)
+          ;
+       name = buf+pos;
+       if(*name=='#' || *name=='\n' || *name==0)
+          continue;
+       for(; !strchr(delim, buf[pos]) && buf[pos]; pos++)
+          ;
+       buf[pos] = 0;
+       if(!*name) continue;
+       for(pos++; strchr(delim+1, buf[pos]) && buf[pos]; pos++)
+          ;
+       value = buf+pos;
+       for(; !strchr(delim, buf[pos]) && buf[pos]; pos++)
+          ;
+       buf[pos] = 0;
+       if(!*value) continue;
+       switch(name[5]) {
+       case 'H':
+          if(!strcmp(name, "MysqlHost")) {
+             strncpy(host, value, BUF_SIZE);
+             mss.mysql_host = host;
+          }
+          break;
+       case 'U':
+          if(!strcmp(name, "MysqlUsername")) {
+             strncpy(user, value, BUF_SIZE);
+             mss.mysql_user = user;
+          } else if(!strcmp(name, "MysqlUserTable")) {
+             strncpy(user_table, value, BUF_SIZE);
+             mss.mysql_user_table = user_table;
+          }
+          break;
+       case 'D':
+          if(!strcmp(name, "MysqlDatabase")) {
+             strncpy(database, value, BUF_SIZE);
+             mss.mysql_database = database;
+          }
+          break;
+       case 'M':
+          if(!strcmp(name, "MysqlMapTable")){
+             strncpy(map_table, value, BUF_SIZE);
+             mss.mysql_map_table = map_table;
+          }
+          break;
+       case 'A':
+          if(!strcmp(name, "MysqlAliasTable")) {
+             strncpy(alias_table, value, BUF_SIZE);
+             mss.mysql_alias_table = alias_table;
+          }
+          break;
+       case 'P':
+          if(!strcmp(name, "MysqlPassword")) {
+             strncpy(password, value, BUF_SIZE);
+             mss.mysql_passwd = password;
+          }
+          break;
+ #ifdef MYSQL_MAP
+       case 'R':
+          if(!strcmp(name, "MysqlRHSColumn")) {
+             strncpy(rhs, value, BUF_SIZE);
+             mss.mysql_rhs_col = rhs;
+          }
+          break;
+       case 'L':
+          if(!strcmp(name, "MysqlLHSColumn")) {
+             strncpy(lhs, value, BUF_SIZE);
+             mss.mysql_lhs_col = lhs;
+          }
+          break;
+ #endif
+       }
+    }
+    fclose(conf);
+    if(mss.mysql_host && mss.mysql_user && /* mss.mysql_passwd && */
+       mss.mysql_database && mss.mysql_user_table &&
+ #ifdef MYSQL_MAP
+       mss.mysql_lhs_col && mss.mysql_rhs_col &&
+ #endif
+       mss.mysql_alias_table && mss.mysql_map_table)
+    {
+       return &mss;
+    }
+    return NULL;
+ }
+
+
+ struct passwd * get_mysql_pwd(char * user_name)
+ {
+
+ char queryBuf[256];
+    
+    static struct passwd pw;
+    mysql_init(&mysql);
+    mysqlconf = get_mysql_conf();
+      if(mysqlconf == NULL)
+      {
+            return NULL;
+      }
+       if(!mysql_real_connect(&mysql,mysqlconf->mysql_host,mysqlconf->mysql_user,mysqlconf->mysql_passwd,mysqlconf->mysql_database,0,NULL,0))
+    {
+       mysql_close(&mysql);
+       return NULL;
+    }
+    snprintf(queryBuf, sizeof(queryBuf), "select * from %s where username = \'%s\'",mysqlconf->mysql_user_table,user_name);
+ #ifdef MYSQL_VERBOSE
+
+    sm_syslog(LOG_INFO, NOQID,"Looking up %s in user table\n",user_name);
+
+ #endif
+    mysql_query(&mysql, queryBuf);
+    if((result=mysql_store_result(&mysql)) == NULL)
+    {
+       return NULL;
+    }
+    num_rows=mysql_num_rows(result);
+    num_fields=mysql_num_fields(result);
+    if(num_rows == 0)
+    {
+       mysql_free_result(result);
+       mysql_close(&mysql);
+       return NULL;
+    }
+
+    field=mysql_fetch_row(result);
+
+ pw.pw_name = field[0];
+ pw.pw_passwd = field[1];
+ pw.pw_uid = atoi(field[2]);
+ pw.pw_gid = atoi(field[3]);
+ if((pw.pw_gecos = field[4]) == NULL)
+   pw.pw_gecos = ",,,";
+ pw.pw_dir = field[5];
+ if((pw.pw_shell = field[6]) == NULL)
+   pw.pw_shell = "/bin/noshell";
+ mysql_free_result(result);
+ mysql_close(&mysql);
+ return &pw;
+ }
+
*** sendmail-8.10.0.Beta12/mail.local/mysql_sendmail.h   Mon Apr  3 16:20:48 2000
--- sendmail-devel/mail.local/mysql_sendmail.h   Mon Apr  3 15:07:07 2000
***************
*** 0 ****
--- 1,28 ----
+ #include
+ #include
+
+ struct mysql_sendmail_struct
+ {
+         char            *mysql_host;
+         char            *mysql_user;
+         char            *mysql_passwd;
+         char            *mysql_database;
+         char            *mysql_user_table;
+         char            *mysql_alias_table;
+         char            *mysql_map_table;
+         char            *mysql_lhs_col;
+         char            *mysql_rhs_col;
+ };
+
+ struct passwd *get_mysql_pwd(char *user_name);
+ struct passwd *get_mysql_uid(int user_id);
+ char *get_mysql_alias(char *mysql_name);
+ struct mysql_sendmail_struct *get_mysql_conf();
+ char *mysql_map_dequote(char *);
+ static struct passwd pw;
+ typedef struct mysql_sendmail_struct  MYSQL_MAP_STRUCT;
+ MYSQL_MAP_STRUCT *mysql_map_scanconf();
+
+ #define EX_NOTFOUND    EX_NOHOST
+ #define ALIAS_LHS "address"
+ #define ALIAS_RHS "alias"


有哪位大哥可以告訴我 這檔案 是要用在哪裡的嗎  救救我吧

14
Linux 討論版 / sendmail+mysql 可以嗎?
« 於: 2002-11-13 16:57 »
想請問各位前輩 sendmail 可以跟mysql 結合嗎  最好是在加上php 可以做用戶容量以及認證 有這樣的資料嗎

15
嗯 還是我的瀏覽器有問題  我現在是從http://phorum.study-area.org
進來的耶

17
想說人多的話可以就近交流交流

18
database 討論版 / sql==>mysql
« 於: 2002-10-29 18:13 »
嗯 我沒摸過sql 請問當改成mysql時 資料要如何備份 有相通嗎

狀況 NT 平台 改 LINUX 平台 (光榮的勝利)
sql 變成 mysql  sql 的資料要保存轉移

19
雜七雜八 / 哇 要抵制耶 苦惱
« 於: 2002-10-21 11:53 »
原本想去下載RH8 來玩玩看 沒想到看到這篇文章
ftp://ftp.nsysu.edu.tw/Linux/RedHat/Redhat80抵制行動說明.txt
天啊   該整麼辦  國家的尊嚴跟學習的慾望 相交衝突  喔 生於此時代的兒女們 面對
社會的動盪  時局的不安 人性的黑暗    啥   太煽情  喔  那正常一點
喔  手上的菊花啊  告訴我要不要玩RH8吧  玩  不玩 玩  不玩  玩 ......................................................

嗯  等我把這朵大波斯菊的衣服脫光後 在告訴大家結果

20
Linux 討論版 / mysql 無法啟動
« 於: 2002-10-19 13:37 »
因為主機不正常關機(該死的腳不小心踢到電線)
重開機後mysql 就無法啟動了 出現下列訊息
The file /usr/local/mysql/libexec/mysqld doesn't exist or is not executable
Please do a cd to the mysql installation directory and restart
this script from there as follows:
./bin/safe_mysqld.

[1]+  Exit 1                  /usr/local/mysql/bin/safe_mysqld --user=root

要怎麼救啊
我是用RH7.3 mysql是用tar裝的
麻煩救救我吧

21
如題

系統 RH7.3 sendmail +squirrelmail
想作到跟Openwebmail 一樣可以輸入不同網域名來作區別同名使用者
找了好久的文件都找不到 http://www.squirrelmail.org/ 的faq 實在是看不懂
希望有架過的大哥們幫幫忙

22
雜七雜八 / 跨國企業
« 於: 2002-10-03 13:07 »
因為頻寬的關係  公司決定把主機放國外  (服務對象不只台灣) 搞的小小公司的主機除了放在兩岸三地還加上日本 成了跨國企業  (感覺好偉大) 這下可苦了小小弟
除了備援  安全也相對變的超重要  前一陣子發作的那隻攻擊apache的病毒 剛好碰到公司主機保養  不然我一定要死給他看  想想人性真是超黑暗  沒事老發明一些沒營養的東西到處搞壞   :evil:  唉  吐吐苦水    明天一定是光明的一天  

革命尚未成功  同志仍須奴隸     啊   是努力啦

23
雜七雜八 / 盜版神速
« 於: 2002-09-30 17:14 »
一早進辦公室 同事就丟了一盒光碟給我  
阿 ~~ 這不是 傑克成哥哥 最新的大片 塔克西斗嗎  天啊  真是道德敗壞 自家人作軟體的 還看盜版  心想 一定是 電影院偷拍版  看了一下 哇勒 還是清晰版的耶
不過是簡體字幕  唉  大陸的光盤工業 真是越來越進步了  
這樣下去軟體工業要如何起步ㄋ  唉  
啥  老闆找我      沒空           忙著測電腦的影音效果

天啊     原諒我吧

24
Linux 討論版 / 遠端備援
« 於: 2002-09-30 13:12 »
狀況一 主機分隔兩地
狀況二 dns 在身邊
狀況三 主機一掛了
我要如何用第二台的主機能馬上上線讓客戶用

請教教我吧  搞不懂

25
MIS 討論區 / 喂 老闆 我好像是MIS耶
« 於: 2002-09-19 15:39 »
終於這一天來了
(時況)
老闆: tony 啊  最近linux的東西好像蠻有市場的 有哪些可以做啊
tony(小弟我) : 很多啊  mail server , web server , data server
                   看你想像哪方面下手啊
老闆: 隨便啊  看哪個比較好賺啊
(tony)OS : 我要是知道哪個好賺 老闆就是我了
tony: 嗯 不一定耶 看業務需求啦  每個公司不一樣 買的server 也不太一樣啊
老闆:喔 這樣啊  那就全都賣啊  去弄份企劃 搞些DM 過兩天我們開會研究研究
tony:我弄???
老闆: 不你弄難道叫我啊  真是 ...(咚咚咚)<==此為走人之意

哇  勒    我是  我是    我是 MIS 吧???
應該是吧   企劃  DM   哇 勒    救命啊~~~~~~~~

26
雜七雜八 / 唉 實力太差
« 於: 2002-09-18 15:10 »
來study-areo 也有一段時間 受教甚多  幾乎有問題都有解答  得之於人甚多 也會想幫幫大家  但是看了很多求助時 才發現  哇勒 這是啥啊 沒遇過 嗯
好難懂 不然就是 嗯 我也這樣裝的啊  怎麼結果差這麼多 不懂他到底出哪些包 才會這樣  不經要感謝老天爺沒讓我遇到這些問題  不然我的工作可能就要交接了  不過我還是會努力幫那些我看的懂得問題忙的
加油加油  
ps 灌灌水 別打我

27
Linux 討論版 / openwebmail
« 於: 2002-09-18 14:49 »
有誰知道哪裡有openwebmail 的日文模組啊  原套件中有多國語言 (還有保加利亞語耶) 可是沒日文 哇  會不會是成大有反日情節啊  (開玩笑的) 現在日本客戶有興趣 哇 尷尬了 有人有嗎

28
Linux 討論版 / (求助)openwebmail
« 於: 2002-09-10 13:42 »
要麻煩各位先進
我的web 是apache+mysql+php 用tar裝的
現在裝上openwebmail後 路徑完全不對  如果要改http.conf 要怎樣改才會兩邊的東西都可以show上網頁ㄋ
web路徑 usr/local/apach/h...(最後一個忘了怎麼拼)
openwebmail 路徑 /var/www/html

29
Linux 討論版 / 求助 dhcp+ipchans
« 於: 2002-08-19 13:28 »
我朋友用linux架了dhcp 用ipchans(好像拼錯了) 作nat 其他win98(兩台)可以上網 但是他表弟玩龍族(onlane game) 時 卻連不上主機  嗯 我不知道是啥原因 請問有人能幫忙嗎

系統  linux7.0+2網卡

30
Linux 討論版 / [求助]iptables
« 於: 2002-08-14 14:11 »
我用在網路上找到的資料 設定iptables
用 iptables -P INPUT DROP
把port都關上 然後 用
iptables -A INPUT -i eth0 -p tcp --dport 25 -j ACCEPT
來一個個開port 但不管怎樣開 都會使外部網路 無法login 我的系統
包括 web ftp webmin ......
是網路上的資料有錯還是我的 主機需要作啥設定嗎
我的系統是 rh 7.3  
設iptables 時 掛載了 ip_tables ip_conntrack ip_conntrack_ftp ip_conntrack_irc ip_nat_ftp
ipchains有移除
硬體 1u的伺服器主機  scsi 介面  雙網卡  東森的固定ip
我不知還有啥資料要說 麻煩有誰可以教教我

頁: [1] 2