From owner-freebsd-hackers@FreeBSD.ORG Mon May 21 08:52:19 2007 Return-Path: X-Original-To: freebsd-hackers@freebsd.org Delivered-To: freebsd-hackers@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 4730E16A421 for ; Mon, 21 May 2007 08:52:19 +0000 (UTC) (envelope-from lstewart@room52.net) Received: from swin.edu.au (gpo4.cc.swin.edu.au [136.186.1.224]) by mx1.freebsd.org (Postfix) with ESMTP id 8F3A213C45D for ; Mon, 21 May 2007 08:52:18 +0000 (UTC) (envelope-from lstewart@room52.net) Received: from [136.186.229.95] (lstewart.caia.swin.edu.au [136.186.229.95]) by swin.edu.au (8.13.6.20060614/8.13.1) with ESMTP id l4L8q3bh017535; Mon, 21 May 2007 18:52:04 +1000 Message-ID: <46515DE0.20209@room52.net> Date: Mon, 21 May 2007 18:52:48 +1000 From: Lawrence Stewart User-Agent: Thunderbird 1.5.0.9 (X11/20070123) MIME-Version: 1.0 To: Ivan Voras References: <4649349D.4060101@room52.net> <200705150847.38838.marc.loerner@hob.de> <46499491.2010205@room52.net> In-Reply-To: Content-Type: multipart/mixed; boundary="------------020600060706080902050400" X-Spam-Status: No, score=-1.4 required=5.0 tests=ALL_TRUSTED autolearn=disabled version=3.1.8 X-Spam-Checker-Version: SpamAssassin 3.1.8 (2007-02-13) on gpo4.cc.swin.edu.au Cc: freebsd-hackers@freebsd.org Subject: Re: Writing a plain text file to disk from kernel space X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 21 May 2007 08:52:19 -0000 This is a multi-part message in MIME format. --------------020600060706080902050400 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Will do Ivan as soon as I've figured everything out. However, I need some more help from you knowledgeable people. Attached is a fully self contained kernel module and associated makefile that demonstrates the problem I'm having. I've also attached a compiled version of the module for FreeBSD 6.2 RELEASE. The module does the following: - In its init function, it opens a file descriptor to /var/log/test23.log - In its init function, it writes a line of text to the opened file descriptor - In its shutdown function, writes a line of text to the opened file descriptor - In its shutdown function, closes the opened file descriptor The opening of the file descriptor and writing of text done in the module's init function works as expected. The writing of text done in the shutdown function fails with an errno of 9 (bad file descriptor) returned. The closing of the file descriptor doesn't appear to return an error, but I suspect it isn't working either. From what I've deduced so far, it appears to be a thread related issue. I have verified that the thread struct pointer pointed to by "curthread" in the module's init function is different to that in the shutdown function. I suspect that you can't use a file descriptor that was opened in one thread in a completely different thread, but I'm not sure if this is true, and if it is true, how to get around it. Any ideas, explanations, help or suggestions regarding how file IO and threading work and how I can get cross-thread file IO working would be most welcome. Cheers, Lawrence Ivan Voras wrote: > Lawrence Stewart wrote: > >> I'll have a play around and report back to the list what I find for >> archival purposes. > > Please do, and also consider writing a short and instructive tutorial > on it! Many people have asked this same question without a > to-the-point answer. > > > _______________________________________________ > freebsd-hackers@freebsd.org mailing list > http://lists.freebsd.org/mailman/listinfo/freebsd-hackers > To unsubscribe, send any mail to > "freebsd-hackers-unsubscribe@freebsd.org" --------------020600060706080902050400 Content-Type: text/plain; name="filewriter.c" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="filewriter.c" Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioKLy8gZmlsZXdyaXRlcgovLwovLyBBIEZyZWVCU0Qga2VybmVsIG1vZHVsZSB0aGF0IGRl bW9uc3RyYXRlcyBob3cgdG8gb3BlbiBhbmQKLy8gd3JpdGUgYSB0ZXh0IGZpbGUgZnJvbSB3 aXRoaW4gdGhlIGtlcm5lbC4KLy8KLy8gRGF0ZTogTWF5IDIwMDcKLy8gQVVUSE9SUzoKLy8g ICBKYW1lcyBIZWFseSA8amhlYWx5QHN3aW4uZWR1LmF1PgovLyAgIExhd3JlbmNlIFN0ZXdh cnQgPGxhc3Rld2FydEBzd2luLmVkdS5hdT4KLy8qKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiNpbmNsdWRlIDxzeXMvcGFyYW0uaD4K I2luY2x1ZGUgPHN5cy9tb2R1bGUuaD4KI2luY2x1ZGUgPHN5cy9rZXJuZWwuaD4KI2luY2x1 ZGUgPHN5cy9zeXN0bS5oPgojaW5jbHVkZSA8c3lzL3BjcHUuaD4KI2luY2x1ZGUgPHN5cy9w cm9jLmg+CiNpbmNsdWRlIDxzeXMvc3lzY2FsbHN1YnIuaD4KI2luY2x1ZGUgPHN5cy9mY250 bC5oPgojaW5jbHVkZSA8c3lzL2ZpbGUuaD4KI2luY2x1ZGUgPHN5cy9zeXNwcm90by5oPgoK Ly8gc29tZSBzaW1wbGUgZGVmaW5lcyB0byBrZWVwIHRoZSBjb2RlIGNsZWFuCiNkZWZpbmUg TU9ETkFNRSAiZmlsZXdyaXRlciIKI2RlZmluZSBNT0RWRVJTSU9OICAiMS4wIgojZGVmaW5l IFBBVEggIi92YXIvbG9nL3Rlc3QyMy5sb2ciCgovLyBzb21lIHVnbHkgZ2xvYmFscyB2YXJz LCB3ZSBtYXkgbG9vayBhdCBnZXR0aW5nIHJpZCBvZiB0aGVzZS4Kc3RhdGljIHZvbGF0aWxl IGludCBmaWxld3JpdGVyX2hvb2tlZCA9IDA7CnN0YXRpYyBpbnQgdGVzdGZkID0gMDsKCgpz dGF0aWMgaW50CmZpbGV3cml0ZXJfd3JpdGVsb2coc3RydWN0IHRocmVhZCAqdGQsIGludCBm ZCwgY2hhciAqbGluZSwgdV9pbnQgbGVuKQp7CiAgc3RydWN0IHVpbyBhdWlvOwogIHN0cnVj dCBpb3ZlYyBhaW92OwogIGludCBlcnI7CgogIGJ6ZXJvKCZhaW92LCBzaXplb2YoYWlvdikp OwogIGJ6ZXJvKCZhdWlvLCBzaXplb2YoYXVpbykpOwogIAogIGFpb3YuaW92X2Jhc2UgPSBs aW5lOwogIGFpb3YuaW92X2xlbiA9IGxlbjsKICAKICBhdWlvLnVpb19pb3YgPSAmYWlvdjsK ICBhdWlvLnVpb19vZmZzZXQgPSAwOwogIGF1aW8udWlvX3NlZ2ZsZyA9IFVJT19TWVNTUEFD RTsKICBhdWlvLnVpb19ydyA9IFVJT19XUklURTsKICBhdWlvLnVpb19pb3ZjbnQgPSAxOwog IGF1aW8udWlvX3Jlc2lkID0gbGVuOwoKICBhdWlvLnVpb190ZCA9IHRkOwoKICBwcmludGYo ImZkOiAldVxuIiwgZmQpOwogIHByaW50ZihhaW92Lmlvdl9iYXNlKTsKICBlcnIgPSBrZXJu X3dyaXRldih0ZCwgZmQsICZhdWlvKTsKICBwcmludGYoIndyaXRlIGVycjogJXVcbiIsIGVy cik7CgogIHJldHVybiBlcnI7Cn0KCgpzdGF0aWMgaW50CmZpbGV3cml0ZXJfY2xvc2Vsb2co c3RydWN0IHRocmVhZCAqdGQsIGludCBmZCkKewogIHByaW50ZigiZmlsZXdyaXRlcl9jbG9z ZWxvZyBmZDogJWRcbiIsIGZkKTsKICBpZihmZCkKICB7CiAgICBzdHJ1Y3QgY2xvc2VfYXJn cyBmZHRtcDsKICAgIGZkdG1wLmZkID0gZmQ7CiAgICBwcmludGYoImZpbGV3cml0ZXJfY2xv c2Vsb2cgdGhyZWFkIHB0cjogJXhcbiIsICh1bnNpZ25lZCBpbnQpdGQpOwogICAgcmV0dXJu IGNsb3NlKHRkLCAmZmR0bXApOwogIH0KICByZXR1cm4gMDsKfQoKc3RhdGljIGludApmaWxl d3JpdGVyX29wZW5sb2coc3RydWN0IHRocmVhZCAqdGQsIGludCAqZmQsIGNoYXIgKnBhdGgp CnsKICBpbnQgZXJyb3I7CiAgZXJyb3IgPSBrZXJuX29wZW4odGQsIHBhdGgsIFVJT19TWVNT UEFDRSwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19BUFBFTkQsIDA2NDQpOwogIGlmICghZXJy b3IpCiAgewogICAgKmZkID0gdGQtPnRkX3JldHZhbFswXTsKICAgIHByaW50Zigib3Blbmxv ZyBmZDogJWRcbiIsICpmZCk7CiAgfQogIGVsc2UKICAgIHByaW50Zigib3BlbmxvZyBmYWls ZWRcbiIpOwogIHJldHVybiBlcnJvcjsKfQoKLy8gY2FsbGVkIHdoZW4gdGhlIG1vZHVsZSBp cyBmaXJzdCBsb2FkZWQgaW50byB0aGUga2VybmVsLCBob29raW5nIG91ciBmdW5jdGlvbnMg aW50bwovLyB0aGUgSVAgc3RhY2sgdXNpbmcgcGZpbCBob29rcy4gVGhlc2UgaG9va3MgYXJl IGRlc2lnbmVkIGZvciBmaXJld2FsbCBwcm9jZXNzaW5nLAovLyBidXQgd29yayBlcXVhbGx5 IHdlbGwgZm9yIG91ciBwdXJwb3NlcyAtIHdlIGp1c3QgbmV2ZXIgdGVsbCB0aGUgc3RhY2sg dG8gZHJvcCBhIHBhY2tldC4Kc3RhdGljIGludAppbml0X21vZHVsZSh2b2lkKQp7CiAgICBj aGFyIGZpbGV3cml0ZXJfbGluZVsxMjhdOwoKICAgIC8vIGlmIHdlJ3JlIGFscmVkeSBob29r ZWQgaW4sIGRvIG5vdGhpbmcKICAgIGlmIChmaWxld3JpdGVyX2hvb2tlZCkKICAgICAgICBy ZXR1cm4gKDApOwoKICAgIGZpbGV3cml0ZXJfaG9va2VkID0gMTsKCiAgICBmaWxld3JpdGVy X29wZW5sb2coY3VydGhyZWFkLCAmdGVzdGZkLCBQQVRIKTsKCiAgICBzcHJpbnRmKGZpbGV3 cml0ZXJfbGluZSwgImluaXRfbW9kdWxlKClcdEZpbGU6ICVzXHRjdXJ0aHJlYWQgcHRyOiAl eFxuIiwgUEFUSCwgKHVuc2lnbmVkIGludCljdXJ0aHJlYWQpOwoKICAgIGZpbGV3cml0ZXJf d3JpdGVsb2coY3VydGhyZWFkLCB0ZXN0ZmQsIGZpbGV3cml0ZXJfbGluZSwgc3RybGVuKGZp bGV3cml0ZXJfbGluZSkpOwoKICAgIC8vIHByaW50IG1lc3NhZ2UgdG8gdGhlIHVzZXIncyBj dXJyZW50IHRlcm1pbmFsIGFzIG9wcG9zZWQgdG8gCiAgICAvLyBwcmludGYgd2hpY2ggcHJp bnRzIHRvIHRoZSBrZXJuZWwncyBzdGRvdXQgKHdoaWNoIGlzIGF0dGFjaGVkIAogICAgLy8g dG8gZ2V0dHkgMCkKICAgIHVwcmludGYoIkxvYWRlZCAlcyAlc1xuIiwgTU9ETkFNRSwgTU9E VkVSU0lPTik7CgogICAgcmV0dXJuIDA7Cn0KCi8vIGNhbGxlZCB3aGVuIHRoZSBtb2R1bGUg aXMgdW5sb2FkZWQgZnJvbSB0aGUga2VybmVsLCB1bmhvb2tpbmcgb3VyIGZ1bmN0aW9ucyBm cm9tCi8vIHRoZSBJUCBzdGFja3MuIApzdGF0aWMgaW50CmRlaW5pdF9tb2R1bGUodm9pZCkK ewogICAgY2hhciBmaWxld3JpdGVyX2xpbmVbMTI4XTsKCiAgICAvLyBpZiB3ZSdyZSBhbHJl YWR5IHVuaG9va2VkLCBkbyBub3RoaW5nCiAgICBpZiAoIWZpbGV3cml0ZXJfaG9va2VkKQog ICAgICAgIHJldHVybiAoMCk7CgogICAgLy8gbGV0IG91ciBtb2R1bGUga25vdyB3ZSdyZSBu byBsb25nZXIgaG9va2VkIGluCiAgICBmaWxld3JpdGVyX2hvb2tlZCA9IDA7CgogICAgc3By aW50ZihmaWxld3JpdGVyX2xpbmUsICJkZWluaXRfbW9kdWxlKClcdEZpbGU6ICVzXHRjdXJ0 aHJlYWQgcHRyOiAleFxuXG4iLCBQQVRILCAodW5zaWduZWQgaW50KWN1cnRocmVhZCk7Cgog ICAgZmlsZXdyaXRlcl93cml0ZWxvZyhjdXJ0aHJlYWQsIHRlc3RmZCwgZmlsZXdyaXRlcl9s aW5lLCBzdHJsZW4oZmlsZXdyaXRlcl9saW5lKSk7IAoKICAgIGZpbGV3cml0ZXJfY2xvc2Vs b2coY3VydGhyZWFkLCB0ZXN0ZmQpOwoKICAgIHVwcmludGYoIlVubG9hZGVkICVzICVzXG4i LCBNT0ROQU1FLCBNT0RWRVJTSU9OKTsKCiAgICByZXR1cm4gMDsKfQoKLy8gVGhpcyBpcyB0 aGUgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgdG8gbG9hZCBhbmQgdW5sb2FkIHRoZSBmdW5j dGlvbnMuIEl0IGhhbmRzIG9mZgovLyB0byBzZXBlcmF0ZSBmdW5jdGlvbnMgdG8gZG8gdGhl IHdvcmsuCnN0YXRpYyBpbnQgbG9hZF9oYW5kbGVyKG1vZHVsZV90IG1vZCwgaW50IHdoYXQs IHZvaWQgKmFyZykKewoJaW50IGVyciA9IDA7CgoJc3dpdGNoKHdoYXQpCgl7CgkJY2FzZSBN T0RfTE9BRDoKICAgICAgZXJyID0gaW5pdF9tb2R1bGUoKTsKCQkJYnJlYWs7CgoJCWNhc2Ug TU9EX1VOTE9BRDoKICAgICAgZXJyID0gZGVpbml0X21vZHVsZSgpOwoJCQlicmVhazsKCgkJ ZGVmYXVsdDoJCQoJCQllcnIgPSBFSU5WQUw7CgkJCWJyZWFrOwoJfQoKCXJldHVybihlcnIp Owp9CgovLyBhIHN0cnVjdCB0aGF0IGhvbGRzIGJhc2ljIGRhdGEgb24gdGhlIG1vZHVsZQpz dGF0aWMgbW9kdWxlZGF0YV90IGZpbGV3cml0ZXJfbW9kID0KewoJImZpbGV3cml0ZXIiLCAg ICAgIC8vbW9kdWxlJ3MgbmFtZQoJbG9hZF9oYW5kbGVyLCAvL2V4ZWN1dGlvbiBlbnRyeSBw b2ludCBmb3IgdGhlIG1vZHVsZQoJTlVMTAp9OwoKLy9QYXJhbSAxOiBuYW1lIG9mIHRoZSBr ZXJuZWwgbW9kdWxlCi8vUGFyYW0gMjogbW9kdWxlZGF0YV90IHN0cnVjdCBjb250YWluaW5n IGluZm8gYWJvdXQgdGhlIGtlcm5lbCBtb2R1bGUgYW5kIHRoZSBleGVjdXRpb24gZW50cnkg cG9pbnQgZm9yIHRoZSBtb2R1bGUKLy9QYXJhbSAzOiBQdWxsZWQgZnJvbSB0aGUgc3lzaW5p dF9zdWJfaWQgZW51bWVyYXRpb24gaW4gL3Vzci9pbmNsdWRlL3N5cy9rZXJuZWwuaAovLyAg ICAgICAgIFNlZW1zIHRvIGRlZmluZSB0aGUgb3JkZXIgaW4gd2hpY2ggbW9kdWxlcyBzaG91 bGQgYmUgaW5pdGlhbGl6ZWQgYnkgdGhlIHN5c3RlbQovL1BhcmFtIDQ6IFB1bGxlZCBmcm9t IHRoZSBzeXNpbml0X2VsZW1fb3JkZXIgZW51bWVyYXRpb24gaW4gL3Vzci9pbmNsdWRlL3N5 cy9rZXJuZWwuaAovLyAgICAgICAgIERlZmluZXMgdGhlIG9yZGVyIG9mIHRoaXMga2xkJ3Mg aW5pdGlhbGl6YXRpb24gd2l0aGluIHRoZSBzdWJzeXN0ZW0gZGVmaW5lZCBieSBwYXJhbSAz CkRFQ0xBUkVfTU9EVUxFKGZpbGV3cml0ZXIsIGZpbGV3cml0ZXJfbW9kLCBTSV9TVUJfS0xE LCBTSV9PUkRFUl9BTlkpOwo= --------------020600060706080902050400 Content-Type: application/octet-stream; name="filewriter.ko" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="filewriter.ko" f0VMRgEBAQkAAAAAAAAAAAMAAwABAAAA3AUAADQAAACQCgAAAAAAADQAIAADACgAEQAOAAEA AAAAAAAAAAAAAAAAAAAsCQAALAkAAAUAAAAAEAAAAQAAACwJAAAsGQAALBkAALAAAAC4AAAA BgAAAAAQAAACAAAAWAkAAFgZAABYGQAAeAAAAHgAAAAGAAAABAAAABEAAAAgAAAAEgAAABoA AAAbAAAAHwAAAB0AAAAAAAAAFAAAABYAAAAPAAAAAAAAABkAAAAeAAAAFwAAABwAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMAAAAAAAAAAAAAABEAAAAAAAAA DgAAAAAAAAAAAAAAFQAAABAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlAAAAAAA AAADAAEAAAAAAGABAAAAAAAAAwACAAAAAABgAwAAAAAAAAMAAwAAAAAATAQAAAAAAAADAAQA AAAAANwFAAAAAAAAAwAFAAAAAAAVCAAAAAAAAAMABgAAAAAAJAkAAAAAAAADAAcAAAAAACgJ AAAAAAAAAwAIAAAAAAAsGQAAAAAAAAMACQAAAAAAWBkAAAAAAAADAAoAAAAAANAZAAAAAAAA AwALAAAAAADcGQAAAAAAAAMADAAAAAAAAAAAAAAAAAADAA0AWgAAAAAAAAAAAAAAEAAAAJ0A AAAoCQAAAAAAABAA8f8BAAAAWBkAAAAAAAARAPH/IAAAAAAAAAAAAAAAEAAAACgAAAAAAAAA AAAAABAAAAA9AAAAAAAAAAAAAAAQAAAAhgAAACgJAAAAAAAAEADx/0MAAAAAAAAAAAAAABAA AABPAAAAAAAAAAAAAAAQAAAAbgAAACQJAAAAAAAAEADx/9sAAADcGQAAAAAAABAA8f9ZAAAA AAAAAAAAAAAQAAAA1AAAANwZAAAAAAAAEADx/woAAADQGQAAAAAAABEA8f/nAAAA5BkAAAAA AAAQAPH/YQAAAAAAAAAAAAAAEAAAALkAAAAsCQAAAAAAABAA8f9oAAAAAAAAAAAAAAAQAAAA AF9EWU5BTUlDAF9HTE9CQUxfT0ZGU0VUX1RBQkxFXwB1cHJpbnRmAG1vZHVsZV9yZWdpc3Rl cl9pbml0AGJ6ZXJvAGtlcm5fd3JpdGV2AGtlcm5fb3BlbgBzcHJpbnRmAHN0cmxlbgBjbG9z ZQBfX3N0YXJ0X3NldF9zeXNpbml0X3NldABfX3N0b3Bfc2V0X3N5c2luaXRfc2V0AF9fc3Rh cnRfc2V0X21vZG1ldGFkYXRhX3NldABfX3N0b3Bfc2V0X21vZG1ldGFkYXRhX3NldABfZWRh dGEAX19ic3Nfc3RhcnQAX2VuZAAEBgAACAAAAFoGAAAIAAAAmQYAAAgAAACuBgAACAAAAMoG AAAIAAAA5gYAAAgAAADsBgAACAAAAP8GAAAIAAAABAcAAAgAAAAsBwAACAAAADgHAAAIAAAA PQcAAAgAAABCBwAACAAAAFkHAAAIAAAAZwcAAAgAAAB3BwAACAAAAHwHAAAIAAAAogcAAAgA AAC4BwAACAAAAL4HAAAIAAAAzgcAAAgAAADTBwAACAAAANgHAAAIAAAA4gcAAAgAAAD5BwAA CAAAACQJAAAIAAAAKAkAAAgAAAA4GQAACAAAADwZAAAIAAAAQBkAAAgAAABQGQAACAAAAFQZ AAAIAAAA8AUAAAITAAD7BQAAAhMAAD4GAAACDgAARgYAAAIOAABhBgAAAg4AAPEGAAACDgAA wwcAAAIOAADnBwAAAg4AAP4HAAACDgAAUQYAAAIVAADQBgAAAhYAABAHAAACGQAAiAcAAAIZ AAAgBwAAAh0AAJgHAAACHQAARwcAAAIRAAANCAAAAh8AADQZAAABEgAAVYnlV1ZTg+woagiN XcxTideJxuj8////aiCNRdRQ6Pz///9Xi0UIaCAIAACJRcyLRQyJXdSJdfCJRdDHRdwAAAAA x0XgAAAAAMdF6AEAAADHRewBAAAAx0XYAQAAAIlF5Oj8/////3XM6Pz///+NRdRQV1bo/P// /4PEKFBoKAgAAInD6Pz///+NZfSJ2FteX8nDkFWJ5VZTgewEAQAAi0UMhcB0FkgPhM8AAACN ZfhbuBYAAABeycONdgCh4BkAAIXAdAsxwI1l+FteycOJ9scF4BkAAAEAAABkix0AAAAAaKQB AABoCQIAAGoBaDcIAABT6Pz///+DxBSFwA+FAgEAAIuDBAEAAKPcGQAAUGhLCAAA6Pz///9Y WmShAAAAAFBoNwgAAGhbCAAAjZ14////U+j8////g8QQZIs1AAAAAFPo/P///4kEJFOJ8IsV 3BkAAOin/v//XlhohQgAAGgVCAAAaIkIAADo/P///4PEDDHA6U7///+NdgCh4BkAAIXAD4Q8 ////xwXgGQAAAAAAAGShAAAAAFBoNwgAAGiXCAAAjZ34/v//U+j8////g8QQZIs1AAAAAFPo /P///4kEJFOLFdwZAACJ8Ogv/v//WVtkizUAAAAAix3cGQAAU2jECAAA6Pz///9YhdtadSRo hQgAAGgVCAAAaOAIAADpZf///2jwCAAA6Pz///9Y6Qb///+JnfT+//9WaAAJAADo/P///1lb jYX0/v//UFbo/P///1ha67hmaWxld3JpdGVyAGZkOiAldQoAd3JpdGUgZXJyOiAldQoAL3Zh ci9sb2cvdGVzdDIzLmxvZwBvcGVubG9nIGZkOiAlZAoAaW5pdF9tb2R1bGUoKQlGaWxlOiAl cwljdXJ0aHJlYWQgcHRyOiAleAoAMS4wAExvYWRlZCAlcyAlcwoAZGVpbml0X21vZHVsZSgp CUZpbGU6ICVzCWN1cnRocmVhZCBwdHI6ICV4CgoAZmlsZXdyaXRlcl9jbG9zZWxvZyBmZDog JWQKAFVubG9hZGVkICVzICVzCgBvcGVubG9nIGZhaWxlZAoAZmlsZXdyaXRlcl9jbG9zZWxv ZyB0aHJlYWQgcHRyOiAleAoALBkAAEgZAAAAAAAC////DwAAAAA8GQAAFQgAAHAGAAAAAAAA AQAAAAIAAAA8GQAAFQgAAAQAAACUAAAABQAAAGADAAAGAAAAYAEAAAoAAADsAAAACwAAABAA AAARAAAATAQAABIAAACQAQAAEwAAAAgAAAAWAAAAAAAAAPr//28gAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFgZAAAAAAAAAAAAAABHQ0M6IChHTlUpIDMu NC40IFtGcmVlQlNEXSAyMDA1MDUxOAAALnN5bXRhYgAuc3RydGFiAC5zaHN0cnRhYgAuaGFz aAAuZHluc3ltAC5keW5zdHIALnJlbC5keW4ALnRleHQALnJvZGF0YQBzZXRfc3lzaW5pdF9z ZXQAc2V0X21vZG1ldGFkYXRhX3NldAAuZGF0YQAuZHluYW1pYwAuZ290AC5ic3MALmNvbW1l bnQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbAAAABQAAAAIA AACUAAAAlAAAAMwAAAACAAAAAAAAAAQAAAAEAAAAIQAAAAsAAAACAAAAYAEAAGABAAAAAgAA AwAAAA4AAAAEAAAAEAAAACkAAAADAAAAAgAAAGADAABgAwAA7AAAAAAAAAAAAAAAAQAAAAAA AAAxAAAACQAAAAIAAABMBAAATAQAAJABAAACAAAAAAAAAAQAAAAIAAAAOgAAAAEAAAAGAAAA 3AUAANwFAAA5AgAAAAAAAAAAAAAEAAAAAAAAAEAAAAABAAAAMgAAABUIAAAVCAAADwEAAAAA AAAAAAAAAQAAAAEAAABIAAAAAQAAAAIAAAAkCQAAJAkAAAQAAAAAAAAAAAAAAAQAAAAAAAAA WAAAAAEAAAACAAAAKAkAACgJAAAEAAAAAAAAAAAAAAAEAAAAAAAAAGwAAAABAAAAAwAAACwZ AAAsCQAALAAAAAAAAAAAAAAABAAAAAAAAAByAAAABgAAAAMAAABYGQAAWAkAAHgAAAADAAAA AAAAAAQAAAAIAAAAewAAAAEAAAADAAAA0BkAANAJAAAMAAAAAAAAAAAAAAAEAAAABAAAAIAA AAAIAAAAAwAAANwZAADcCQAACAAAAAAAAAAAAAAABAAAAAAAAACFAAAAAQAAAAAAAAAAAAAA 3AkAACUAAAAAAAAAAAAAAAEAAAAAAAAAEQAAAAMAAAAAAAAAAAAAAAEKAACOAAAAAAAAAAAA AAABAAAAAAAAAAEAAAACAAAAAAAAAAAAAAA4DQAAkAIAABAAAAAXAAAABAAAABAAAAAJAAAA AwAAAAAAAAAAAAAAyA8AANgBAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEA AAAkCQAABAAAAAEABwAxAAAALBkAABAAAAABAAkASwAAADwZAAAMAAAAAQAJAFoAAABwBgAA pQEAAAIABQBnAAAAKAkAAAQAAAABAAgAnQAAAEgZAAAQAAAAAQAJALkAAADcGQAABAAAAAEA DADAAAAA4BkAAAQAAAABAAwA0gAAANwFAACTAAAAAgAFAAAAAACUAAAAAAAAAAMAAQAAAAAA YAEAAAAAAAADAAIAAAAAAGADAAAAAAAAAwADAAAAAABMBAAAAAAAAAMABAAAAAAA3AUAAAAA AAADAAUAAAAAABUIAAAAAAAAAwAGAAAAAAAkCQAAAAAAAAMABwAAAAAAKAkAAAAAAAADAAgA AAAAACwZAAAAAAAAAwAJAAAAAABYGQAAAAAAAAMACgAAAAAA0BkAAAAAAAADAAsAAAAAANwZ AAAAAAAAAwAMAAAAAAAAAAAAAAAAAAMADQDmAAAAAAAAAAAAAAAQAAAA7QAAACgJAAAAAAAA EADx/wkBAABYGQAAAAAAABEA8f8SAQAAAAAAAAAAAAAQAAAAGgEAAAAAAAAAAAAAEAAAAC8B AAAAAAAAAAAAABAAAAA1AQAAKAkAAAAAAAAQAPH/TAEAAAAAAAAAAAAAEAAAAFgBAAAAAAAA AAAAABAAAABiAQAAJAkAAAAAAAAQAPH/egEAANwZAAAAAAAAEADx/4YBAAAAAAAAAAAAABAA AACOAQAA3BkAAAAAAAAQAPH/lQEAANAZAAAAAAAAEQDx/6sBAADkGQAAAAAAABAA8f+wAQAA AAAAAAAAAAAQAAAAtwEAACwJAAAAAAAAEADx/9IBAAAAAAAAAAAAABAAAAAAX19zZXRfc3lz aW5pdF9zZXRfc3ltX2ZpbGV3cml0ZXJtb2R1bGVfc3lzX2luaXQAZmlsZXdyaXRlcm1vZHVs ZV9zeXNfaW5pdABmaWxld3JpdGVyX21vZABsb2FkX2hhbmRsZXIAX19zZXRfbW9kbWV0YWRh dGFfc2V0X3N5bV9fbW9kX21ldGFkYXRhX21kX2ZpbGV3cml0ZXIAX21vZF9tZXRhZGF0YV9t ZF9maWxld3JpdGVyAHRlc3RmZABmaWxld3JpdGVyX2hvb2tlZABmaWxld3JpdGVyX3dyaXRl bG9nAHByaW50ZgBfX3N0YXJ0X3NldF9tb2RtZXRhZGF0YV9zZXQAX0RZTkFNSUMAdXByaW50 ZgBtb2R1bGVfcmVnaXN0ZXJfaW5pdABiemVybwBfX3N0b3Bfc2V0X3N5c2luaXRfc2V0AGtl cm5fd3JpdGV2AGtlcm5fb3BlbgBfX3N0YXJ0X3NldF9zeXNpbml0X3NldABfX2Jzc19zdGFy dABzcHJpbnRmAF9lZGF0YQBfR0xPQkFMX09GRlNFVF9UQUJMRV8AX2VuZABzdHJsZW4AX19z dG9wX3NldF9tb2RtZXRhZGF0YV9zZXQAY2xvc2UA --------------020600060706080902050400 Content-Type: text/plain; name="Makefile" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="Makefile" U1JDUz1maWxld3JpdGVyLmMKS01PRD1maWxld3JpdGVyCgouaW5jbHVkZSA8YnNkLmttb2Qu bWs+IAoKCg== --------------020600060706080902050400--