Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753826AbdG2OnZ (ORCPT ); Sat, 29 Jul 2017 10:43:25 -0400 Received: from mail-by2nam01on0074.outbound.protection.outlook.com ([104.47.34.74]:46336 "EHLO NAM01-BY2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753719AbdG2OnW (ORCPT ); Sat, 29 Jul 2017 10:43:22 -0400 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=paul.elder@pitt.edu; Subject: Re: [PATCH] kselftest: exec: make exec test output conform to TAP13 To: Shuah Khan , shuah@kernel.org, gregkh@linuxfoundation.org, alicef@gentoo.org, alice.ferrazzi@gmail.com Cc: linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org References: <20170725171209.3580-1-paul.elder@pitt.edu> From: Paul Elder Message-ID: Date: Sat, 29 Jul 2017 23:42:52 +0900 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.2.1 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 8bit X-Originating-IP: [58.222.44.36] X-ClientProxiedBy: HK2PR04CA0011.apcprd04.prod.outlook.com (10.162.205.149) To SN2PR04MB2173.namprd04.prod.outlook.com (10.166.211.18) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: fba0341e-9398-4076-1620-08d4d690273b X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(300000500095)(300135000095)(300000501095)(300135300095)(22001)(300000502095)(300135100095)(300000503095)(300135400095)(201703131423075)(201703031133081)(300000504095)(300135200095)(300000505095)(300135600095)(300000506095)(300135500095);SRVR:SN2PR04MB2173; X-Microsoft-Exchange-Diagnostics: 1;SN2PR04MB2173;3:ACAqm6ngLclIWXctebrG1FxhAJNh45AogJ0JNepReQfN97j+vs85rBYPPpeVxMQiS1AdVOV4StRQ+jRymb0ly7JIymX5ZYSPxND8a23ShXssY6IaJ42VBVMwFJFJBkljf1LJmcwYlh+/NLbKcYXhBzXINub7tYvjUBRzA38ciYDMDVVGE+ZKs8P7IU1XsZroSw8XMDKt6rs1NBbIADLkcYN9sz8rWFG+2doUhiq6g1BkPmCRAqLIepGOB+7HCQ5rRb+fYNxBPvRGzIy+FBV3zgsA/zD2jI5skdwm4rcn6vrdtL418DKnYBYh9h7LUkOeh/N79mgk6HPJ58ZwyNwk3NniNdFhDHpEiwOHHSCeBzhKsIh25WFalc9mjpPGGIva0CrqMafxN6iaxAMa+LMam871148SFNfvlz5QUaYUb4JSF6oVrqB1m+MeZyoeKG8qMOuyXY+Gi5WceXO7BM6cjU7KnqvgJCfQBVONY0w6pTwGixmi8Z1bpJaKZ2MA3AsXI22o9cIVUblkC6thT7o9bIqWCje83OmFcUidZVoQDpTyHKxToDxgcyxfeWToEAsvtwxhkHSFsZWese+4l5en7Mo7PjD7cT/trcrgVBgB04Exf2EQ6vJSTwQ30wiUujihH5dALj45K9BUSDUiARFTae7umG2wcFgFhNoj9Z/+hO/qcWVTUCJukcED61K/msCoFazJxjAFcFLwJnVY5KfG7qSHyMCZi4WbyVmA+mFCP1c= X-MS-TrafficTypeDiagnostic: SN2PR04MB2173: X-Microsoft-Exchange-Diagnostics: 1;SN2PR04MB2173;25:iHdMpz+ALt0kJXp8NN1hWPhjI4lc8uxBUeMB/p8y48HkF9cFtHOJZ3E6ctBUbD+MOZVvBuOI0Qu2URfhw9sZ/rpKyywMLSWZm2gByqJBPG4cXRIv8+z7KArTjYuKK1uMFD6X1W4IL3uEEj9os658ZvuMp/h+rJROcxzVEYIPkHrol+xdS1aTzvTY86gsV8EJ4P8dOk5r0I3QAHxJx4WzbgelcQOTwZL3QN5My6Zm/jXCfD3qBKe1jIckFa3QAUtp8lO0j0Kz4vAIPbYkArS5ULNAiAYwkeIiGVE4dx1ReMBCbzFeefJc6qpMkjllmt3GE21hBCMzTUK1HOE/xOG92+0Qr9f6VgB14EQyueKLhxaO5HQUKMwrWkkw9uJnuySgFocs5dqhXVWR0gJUb1SthqGVCiVGTcbQxMvCI5BzquUQb+KdywT5sW56LKH43ZAjWeOXECZgdfqhObb2Hf2sI4ip8WJML/yCHzYd95Ot72TebOlNjZ2YQOBTupObWkah2fJHadxYDLCbxZYNYFpMh4s+VDocbl524R5xqMyGxL7kglEgO0EHIqCKtW/A91Yb4v00ULB6Qj+CYFwgcDrW5PxklWEZUGkSXv2y4LqWcDVOuNIQuknafKM9Agi7eLgWFXvwVG/PvqN99RfxpNj/eRLlVjiRE4s3G68lVB3VkNd2CUtRLKAkQY9i551MiGz32usK7E4wjrAiUF/tKOvZPg8XDUZy5TRJG2OPKobjGiEd3lkL9ZE5ZsA3bEnK5W7l/JNdK4ro0xg1owYqCPjJofH1FPpusyXU2S63bkjLeiG+IqS7T8E1VXoTs025rIYALWbGoHpDh5FBf8sFRiGmL8vwHuhgoqEAoXsCfkayYPtFzLi8D8zG0k+qhEEQdRZAP3urdUJ86uMNIZ+v3kxrC3BL+LI6J7L5NUVCQFtX6/g= X-Microsoft-Exchange-Diagnostics: 1;SN2PR04MB2173;31:Yab0UUW448YCohmqsIpg4TY0hXSaZcAl5FsgIexPjyBJBqdEKlg04OoBSBUIYtDCiwnnUQimadtBSUXrgkxGpImjhwhmFsSJ5NVc4o5K9VdZy20DAEX2Imqv19pq68b+tGUH874vVEZ7wBXKneH2d4olayd8Br6uaZt66mwNT8/Tp2iZVFaV/qmq0eTPcI7iTblTfcIX/Qgi8F+mXXepkLdiS/lPg1U6H163yVC55Kl9ELjPe/LbEBZ+JmEkrKQniPoGHEWairtPHYxthFPTG79qQdjYoHSE95G4YS+IhWG4L+qeakLCuiR+YCop2jnqM/mcP+Eh1eIp0ItgfmZWKISnfpsG/xrpvTRlkSF3mrVEdir3ICQNHleOdgVLyHEfk3J1j6WsNbe3V2x73242RqBCatINhFjGSlAQCaR7sf8X+8P0IWT5SHgJF4OLCKTlTewSufxzdijQtphfQGeExX/ufs7nBlRAUpZbjC05ORaqsuSZZC4u9cEfDsD+13weit29fl8VUHBD50kFyFndPQhnANs12Khv4Zmlt2B03umAHQX0lvi0pFygN7BXTzZK07aG9mgR3cbL5BOqV8PPdr9bsKupMW++jPt8T9evT+7uYR84CHSlj7/45clkZ63OTsFESMsgpSJWG0pxp5Iul9vMYputJSn+9Ang7N6BZrUjnuA03iiuoVCt98Bi9vYdvk/t+3OmRYwJ6FaRcJqlaXsoyCV6MnbhSpMrf8b+GGc= X-Microsoft-Exchange-Diagnostics: 1;SN2PR04MB2173;20:aXlcK9jvQ37HImdgtJa5WRMmxTbrBVcs+cYYaeEXPCHnfcgsdNNF0Bcuu052KttZ/col187yHZJwc4JrFjyLPvzU4S0EGHc0y/PZMwKbYt0NsOhHy+ZLppTkMUSwRzNHMl3g7BHUvnfqVvcuAFAKCSuNUUA3cH6JKeZY+W+w/OQ1OMKvPmRd/WchFWhXHg+y8v3umrWjCZQfTUmejcT0r3FJAD0B6ouyOukcHog2PqDExu4ytOb+6ZU2wUTb1Zoi58x8FMtDsXXbpH6/+3yilCP82GdRiYLtTmyUwtikDwUISFB/TJfjcJE5OVoWvtE+UG/07OnNXvrouTJZc31Q16XpD3NGk4DvsbxUHvTCLl7Fts5v3aup467DQ8JLkwc4uWnKNYKegiRWiRxy0ajxxwGLYAvE4hqhrBowJM6X9gYxNF6ZOa277UEoFIYokjLt8nFcZthDLKU5b0c4SDIorcBAuxUz7nizD4vDdxMXNTP6ubPKaUlIoJlViU5BRrBY X-Exchange-Antispam-Report-Test: UriScan:(189930954265078)(219752817060721)(55037057525728); X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(601004)(2401047)(5005006)(8121501046)(93006095)(93001095)(3002001)(10201501046)(100000703101)(100105400095)(6041248)(20161123558100)(201703131423075)(201702281529075)(201702281528075)(201703061421075)(201703061406153)(20161123555025)(20161123564025)(20161123562025)(20161123560025)(6072148)(100000704101)(100105200095)(100000705101)(100105500095);SRVR:SN2PR04MB2173;BCL:0;PCL:0;RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095);SRVR:SN2PR04MB2173; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtTTjJQUjA0TUIyMTczOzQ6RDh1YThxOGNSczJOSnZpaVBuK21sYjltbHFL?= =?utf-8?B?YWNMUEQwRDJXY3pKdndxbUtzOGI2VFZ0eGhYeDR1cHRNRVhvOEhDcEJmaTlE?= =?utf-8?B?RTRad2RCNlpoZDRaSU5QWjFRNDRiSVROdVJ1alFBYW1JVGFoME1xZzRhdzFl?= =?utf-8?B?cWR6VW5PbDZRZ0FzVEhML3Z6RW55T3JFanM3QzdRZW4vZU5kOHhIejhhMFBH?= =?utf-8?B?VTJFbGNNM0F6Z0xHSC84R1dVLzBpN3lRWmxiRDFuYm1RTU01Vmd4TUdiWUsz?= =?utf-8?B?SVNESjRERkFtNDZRZ0hTdkVYb1IzcTIwUFNaY1dUQTF2aGJweXJoWHlpb2R5?= =?utf-8?B?VUtaSzFIVVNKd1gzeFBEcmtKdDRtc2d1YTFTa1pLWkUybWF2SmswVlNDbnlI?= =?utf-8?B?aWx6S25hYWhieUxqQkZvaEZpbzJlbWNsR3RIV1NIdHhlaG9xSGF0OHhLWG1W?= =?utf-8?B?M1ZhKzZpYTJieDdRczRCYVhHcWtvbm1BcnlJbHMxSU1QN2gzcXFkdDBScFl6?= =?utf-8?B?WHE2T0RoSXZoa1ppUVlHNyttU0Vsbzh2c2p5Mmo1VlJlTW9OYVNTZ3hlTEN0?= =?utf-8?B?WjYxNWQ0YjE3NjNyblg2NG9lSU8wKzBndUlVdEFuU2dsOE1RUERXOGdrQm1I?= =?utf-8?B?OE1YekhtTU8yQ09oblEydTJnWWxWeTc4SHJtcUhPQzRTdGQ3SGg3VHBzZWcx?= =?utf-8?B?OXA3Q2tGc1cvbzVMcFBEQ04rT21jcVdVOGxWQk9QVVVjZmVRaFh0NjIvU3dz?= =?utf-8?B?dUI2blQrTWhSYzc4TVBZRDVsbHhuV04zQ2VZTVBGTE4rTm5TK0dweUN4Ykgv?= =?utf-8?B?YUJvVGdRYSt3SDlDdWltNEhMWGIrRmNSNnhVWDVvcWp5NE9VbGVoa0pwa1JU?= =?utf-8?B?R2hucCttdjFIcTBoQ3hBRWNMaFVxZlNzOXcyYkNyVDhLOWZzTmNjQ3Rjcnhw?= =?utf-8?B?TlZhaDJXZUI2UmlpRTVwdHphcTliVTdGMDFuVmpURGdCVXl0WWRaSlRRVkdV?= =?utf-8?B?Wi9LeWMzeEY1OWI3NlhtOWtTSCtnZllJK2pGRlZvdFRJUW0wbWpYYTBuWmNT?= =?utf-8?B?WFlobnlDbUZ3bWRpZWd4SVFkcW1PbnBtVlhwSWRXeCtwRjZWR1dpa1R2RndI?= =?utf-8?B?QkVjMXUzbU9Kbm5vMk40Ull5QUxJQmZNSVEwRStkdExKTDAzcUdpNGw5Wmhx?= =?utf-8?B?L1lqOGJaOUY1OVJId2NaN0ZxRndjOVJZUWdFVjR0QTRudzBCVGxyY0N5ZXVC?= =?utf-8?B?eDRVN2l6cXNTajYyV1dQVm9IWVBKc3dUTXRKVUpDa242ZU5tVkZzdDFiL3kx?= =?utf-8?B?T3hTRGxXMjBjY3E4Wno1STRhZXpjZHRCZEo1WDhHMHpVYkVnUitSZURtL0dr?= =?utf-8?B?ZWNRVVN3RWNobXh0QUlQdnRUdEEySTBhMnlHdm15TnVyZUUvc2dzaGRZYXdW?= =?utf-8?B?Sy9MZW45MncxcUVZZDZ3eWYvakJ3dThEY2wveGRxWHZqUlVzTWxGYVFTRDEy?= =?utf-8?B?amxpQWdQNmtsMDZOS1k1ZkhoK2QyWVJYR3NLNERybFdKKzFvWno4Nkt6OHpn?= =?utf-8?B?QmFSZXhzd2FRWjF4M2pDVDdaYnU1UWh6Y2J3NXFlZUtkMUdtUm5tbHVIZFZH?= =?utf-8?B?SXkwNEdKK1VwenBEYSs3MHlseXpWTm9oOWpDcTB0eVdPTitNaThGUnhhNWtq?= =?utf-8?B?WUVQUUF3MHhiNm9IclpsYVJIRENVdFI2QXlvUUdmQTBEZnBaa3JTbXNFYkYr?= =?utf-8?B?b2duNlR4eDgxaEVGaXpBPT0=?= X-Forefront-PRVS: 03838E948C X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(4630300001)(7370300001)(6009001)(6049001)(39450400003)(39840400002)(39410400002)(39850400002)(39860400002)(39400400002)(24454002)(377454003)(189002)(199003)(101416001)(64126003)(6116002)(3846002)(68736007)(76176999)(54356999)(50986999)(305945005)(7736002)(50466002)(6306002)(83506001)(6246003)(53936002)(47776003)(65806001)(65956001)(4001350100001)(189998001)(97736004)(2870700001)(88552002)(66066001)(7350300001)(38730400002)(2906002)(110136004)(8676002)(31696002)(575784001)(86362001)(45080400002)(478600001)(75432002)(90366009)(31686004)(25786009)(106356001)(105586002)(117156002)(33646002)(4326008)(229853002)(42186005)(5660300001)(77096006)(6486002)(23676002)(81156014)(81166006)(65826007)(36756003)(53546010)(2950100002)(6666003)(403724002);DIR:OUT;SFP:1101;SCL:1;SRVR:SN2PR04MB2173;H:[192.168.1.107];FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtTTjJQUjA0TUIyMTczOzIzOk5DdXhWNVhUeU1VbG1tMDA4SnhSWkZmRDhH?= =?utf-8?B?UytDL1FXNjNkS2pKbWc0aEpmY1JwNC9SQ1IrVjliYW1iUFA2eFdyYzkzR252?= =?utf-8?B?dCt5OTBsQjQ4SFkyUzJnNU9iaGMyNzBMVzN1YzEvb3ZrSFl0QlhyNnFMZ1gx?= =?utf-8?B?QW8rclVzT2Rnajh6VUtodDA5RnRHa1VuMVhPb3ozTFpla095R0pZeW9LNnRM?= =?utf-8?B?dEoxSmZhdnZHTmhLTzQ2OXQwWHhqZStJTGp5WlB1dlVGaGl1RFE4cnM4U2hK?= =?utf-8?B?QkJ0ekF1TmpxaVZOYlJQdHpraDF2SWtnTmplVTJsSDB5VTBnc0UvTG1wQ1Z4?= =?utf-8?B?cUI1cktEVEtKVU8wdmhWTVh6VS9qR0lmeGZYQTVRT3lybm8wbHdYeDN6SCtH?= =?utf-8?B?RGNLN1hDeGJoZzR3L2MwT2Y1WDVoVG02Y0orMzZEa0JvRWRKdDl1L2E5NjJ3?= =?utf-8?B?aHhTNUNjdUZ4TTdkUG1RcFBvK3Bvd3hzaTQ5QlUrVE9MMXQyNU1HaWRDWGIr?= =?utf-8?B?K3BjZVpLcmZEZFNvZGN3MG9HVW9BR3VtQlhxWmQyMUhDZndhaWc2M0hlMXJB?= =?utf-8?B?ZUQ3TE1rVVo0Q1NGZkRoR2l2Rmc1dUFqd094NlpIcnVTU3NEenpIMi84c2xq?= =?utf-8?B?S0QrSU5NS3NzanU4Q3VaK1BOeS9POVJacWRjNCtMdGlndDNSN1FkeGpUZnVQ?= =?utf-8?B?TUh0WVdrNEpWMzFDT3hNV2x3Z25aajRDZHBPYXhmUVV1RHhqdERxL3lHVTMy?= =?utf-8?B?L25RbkQ5ZUxneGxPT1d0ZzdoY3lNai9UeXFLWW9NYlU4eWY5QzM4Z29tR0I3?= =?utf-8?B?bUdQdXFnaWoyV0l4V0FkTUJJSk8wZDhPMkM1VFJEVVlFSHMzTW9XeWpuTThs?= =?utf-8?B?dGZQZlU1OE5UWTQxcExLbGEyd21zODZxMFlkVm95eThnaDZVZTJlMHV5VHNW?= =?utf-8?B?cEZubG1jSFlRZTNPNkM5T3BlYmFYeGdwRVFMNTd6SHQ1SnR3MENPR3pGQUZF?= =?utf-8?B?M1QrTDVKeUo2THB1RHBTYUlkN3RyVTZ5ZG9wR1VWK2xmdEhBWlIrM21TVXJy?= =?utf-8?B?TjNZRnpCQytwRi9NRkJ3dldvenkxRnJxbHZzWFZUc3ZVWnE3TmJJOTR0YWYw?= =?utf-8?B?TE1ISFJHb1pWbjBDVmpiUHBsQ3A1bUNMK1pYOVY2V2I2Z1ExMjFhZVVHUGlp?= =?utf-8?B?U1Z6UjlKR2NCMGdjWDU1U1VvUTlScVJzdytSbE53NU9MeHNZcHIrTVdyWUEy?= =?utf-8?B?cFpOekt6TjVnV3E4cDdkYWdQQjFjamxLcXlLaE8xT2orZkJMRGpGUks3djNB?= =?utf-8?B?M2N5RE1IMTRxTzNDVXdKVDhjcmNSNHhab2RGbGdRWEs5eXhES0N5YmkxeHd3?= =?utf-8?B?WHNmbU5wdmxLYkZTKzZVSDMvZDQxb3Y1NDl4dGlZOVdxb2JiTGh1Sjhjb0hv?= =?utf-8?B?aDVVajJwdVRPckluZFRjemFuS2RyUVZFUFd1cG9TSy9GSHVaeGFwUjlaNkR4?= =?utf-8?B?bUVZV3VxWkpQQVBtaFg0RGdxM3JFS2RYSG8rQ1dvUklqUHhldmRtRjI3ZXRo?= =?utf-8?B?Z2tTMHc2VVNzdVhQWk5PbnhjNjNaQUNTcDI3ZDdmcVBwbExNdkZFSzdnL1NF?= =?utf-8?B?VHRvUm5kWVJTd3JWRnBmc08yK0ZJeU5LZGhTNUF5cXJrRGxnTnZxM2hPNUV1?= =?utf-8?B?ZUw1YkUxMFdQRUJUSk9HZTFvemxxMHNJRHk4VWlNVG5JWlFjdVlLbHphdEZj?= =?utf-8?B?ZkZXV1l0Y3ViSzZoc2Z5V1NseTJ1RGVlc2RhNE0rUkp4KzZkdjhJL1BYN01T?= =?utf-8?B?SEE3bXRvTXdPb3dXSkxWWkJsZm93UHpyRU1VTlhaL0ZjeWlrbkhoeVFCSk5E?= =?utf-8?B?V1pwNlAwRlpldDM5YWF0dmVRMDRXZyt3cDN0YUVHWFI1alUxbjZkWGdpa0VD?= =?utf-8?B?VmV6VnJHSXlmbEtWYXlab0FlL1BjakFtTTVtQWxNWnJqQlFZeldwU3c4L1Vw?= =?utf-8?B?SEk1Y3FtWkg0SnBsWHVYT09kNFR6bHlGb2dpVXlvWnhNUGRBWnJEeVViaFJM?= =?utf-8?B?U1JlREw4WmVPZ2hrREVJTGcvMytXZkg2VHAyb2pvYjV3NG9pdVV3WHNMTTRV?= =?utf-8?B?YldlY3paOVhBVC84STVucndOUDR4YUxCMzl0alVUODg3dUhjblpZVWZlK2NV?= =?utf-8?B?MXQyVnlWSGIzTVBTVyt5SVlaSXZFcXRsRHN5clNmL0NXZGlRa0NPVmdWVTMz?= =?utf-8?B?cmJWdEFHdmtQa0RMbWZlZW9Tclp6NFA3ekxvUmN4ajdWUy9IZHpuUUdlREU0?= =?utf-8?Q?uGSgM1opfCss4652RKroA4YrSvtrBvbedyquG?= X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtTTjJQUjA0TUIyMTczOzY6ZitsMjd5dDRqOXBxZkRNUkhwSWYyVnpmRWZZ?= =?utf-8?B?UzFZUnlkSzlwV3lldElNVTQzN1ZhRmRsTGVjT1grMHIxamw2Y3AxYTVQQit5?= =?utf-8?B?UDdYakJOOUtsQW1OT294ZEVOQTIvRGNUeVZPWUNYWHNuWkh1bnRrSnFmdlBv?= =?utf-8?B?eFlHUHZMNUlLS3JjaUlQOEEyRFBlTEdxNVp6YlJCbDh2VWY3WG45TjM1TTAy?= =?utf-8?B?Z05DOUNSYmZSR0JEK2piek4zcU9EWXowcWh4bTFuc3lXZFhLeTBhM1QrdHM2?= =?utf-8?B?Ry9aTk41Wiszcm16UVhmZFhmMncvSndDRlVkKzJxWGU0WVRUa201SDBpMWpM?= =?utf-8?B?WGc3clk3MFlDa0FSZ1B3UTE3T1V1WG0rSE9iVStneGJ0RU9PSlFaTG0rWEZv?= =?utf-8?B?RVdXaTVKdCthWkJ3MnlMbGxWSHpMSTN0elllSXFNdUZXUDBWSk5VZ0M4MWFV?= =?utf-8?B?cWFZZWFOOVYydFovcnFMSTVOdlZQdWFrY0QyTUg3WlAwL1lmQlA5ZDY5bEZs?= =?utf-8?B?eDQwQ0t6WDNRQnJFNmxsSktka1NPUStDU3dLYkdsNU5QTDJzL0hoeEppWmls?= =?utf-8?B?WjdVMUdSTHlZSTh1QzFiRnF5L2JoQWJXaVZsbTRuSUdBdUVRNi9lTHViaUxh?= =?utf-8?B?OFhHR2RxbDA2T2ozclZGMkY2ZHMwazcya2RORmhyN3Q0OG9vU2tzWVI2UjFP?= =?utf-8?B?VXJKY0hvY0VvekRQTmh5TFR2R1dmWEhhdjZsUVpqeURDcmQ2azNKc0s4aWh4?= =?utf-8?B?c2IyczA4K3ZRdE9QSlBvMFBqT0g2d2FTT2xzSmVsQktVLzhmZElDL2JoSkk3?= =?utf-8?B?V25RL0VzeXUzR29jUzVWZnhWby8rOWtFSUpYdHppeUlpY1V1NEh0aEYyLzlL?= =?utf-8?B?OWU3MzVxdklyTWFxdHovRXlNTUNxVDZsK3VSVWlobUZ1dzIrSnIwUnZBdXI3?= =?utf-8?B?a0ZLa05lYWdBVHNOTTdUWnZkalVYOVV4MmJvdEh5RGpZUEQyM1hXOW9Ebk9P?= =?utf-8?B?OGxHSWMzd0RMRU9JYVRwMXZVYlMxQTVSQUFBNVVnMi9LNnFPNXl3NGY5N2cx?= =?utf-8?B?ZVBWc2d0ZWw3MndMTVcwR2dSazhKVEI3MDRFc0tsMWNObWpFTWswNUxhV0lV?= =?utf-8?B?REZkZm5BajZGMHdDdndNZW91TmtpMWhHMVRsMXhkVkNKQ3BOS20yTGY5YXRS?= =?utf-8?B?VVRpUVo1MWRJMzQvUkVUMVNSSHpGaDljTE10bjdkMnZreTVBNEphYjhLd01N?= =?utf-8?B?bEhsK1R2Vi9BT01OdlNab2poUVdPbjllTUtweEw5WmFsQlJrbUlReUovQWRH?= =?utf-8?Q?HsGpoqzccidYI0LKY9jPhT/SplB7654=3D?= X-Microsoft-Exchange-Diagnostics: 1;SN2PR04MB2173;5:fmJ2yiuwC2l0qpynRBEPcFrV+IA84xCbXvFkzkm7ZjosU5gjveXSJnvloqbrwIglgH7GIQ25abi1kiNsVUUgJ3RdkeL50FKc4oFRD1qvfY0CKMHKK7yS6vkFllVsXhxEY+wEoJoeS65z6b2xSh1IpzPgt54WLVriO4T2aK3Z/H3cTdChUojUAOn2ktr0moneZ5UUm5mSakBk5cDbFQOopyIcw8SB8+vqdulY46koB9N/rbVaUwZT+BS8LfqdG23urbA81fsKSER+iJNpNekC2Wj4X2qDOMV9gSQzH1YwmtKkbPcuz1NdsNqBX8ANYmR9AEy3zuImZPrmW4fFvVhEenOSlS2p0gPKW2h1YRLnRsVC2N2uuohOUZd3AGbCTDEvj+FCxG5ByZhg6Lzjpt5ppd1/9wePNUesJywMqC4EwYPYy1WMDLISHouSxmzX8sM/Sxd++JY+5p25cbCrIb+OF9Ga8rg6yVRmSfQgOc3QZdtKo6THhW0nZw4lSH/xXg7Z;24:S1dCLc90Wr2cjnrEB+RUvhO7P5Rjl5J/KxJNDBDm3lHAbyL6WzTtbMCAgf0t1gBuTtF7J5xXYFC5eCT94rwuChbtHPiKwMH8GsfR+HfkhOk= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;SN2PR04MB2173;7:yiHKi0XjTRT8cqEPRFZPFVBTzY47pr5X1nj4i1uau6ls2VN3y1TEqgauAeH1TLImlFMCUGpF9Bu0EZudU3CzHrQziJdPWK9qvKkENKFbuE4CzDhjiEQ8NQz5UIfD2tQRugJTuv2hEwg7ps+tQh9/q05ZwOazg6u691VZ0BOK/rpBPCrCGyTbVWymzYyK9b5ZzAMktHBaZM3qpbBaH9iK3GXmCDAW+r11W5XbQlaoeUZ0eWzUxp3r3IxXnCi9UgL1hfowMxO9DpM1eMa4JbGhG4dADTTytBxMhk8v7U7rnbxMP6mLrmmUaLMXHEf6zSn0qZK+LuFtD8PUlCNWla3O20M9b5AXP8aP5rSSvDj0AGLAxNFkTGZSxrTCWRlVTETwtYWXztIiCUow7XLgndMZeN40YKVOYaNPkZmJIPsfM461jySwhwE2rflWT8NRncI9F48DpBHf1PGi9rdfia7bG0UicCFJO5pyRBoFpAX8cCgwozp/cq0bC1mZafeLb7TzEgtoL3G2mjfyLBPBD1/8DSqalkpFwxxPVyP/eWfXV8pFlOrcIBnVhoLIJu567kgoll7SOX/Z41ik5eDYvwkBT8SAzqXxERGZUy+1QgTeuprNRIVBzWDfK8su820QBzS2bqtg8mUDAM9tIrdjP03XDdHjEoMeb1SAH8E7Kwl8sNMQfMHh5bgQtbi5Ujn+6fH6FrO4P8z/u1QeRLSMd/ZKiWV0bU7bM7hSpjiRxl620lHApLfLXSvGQU9zWWgOeGSgwGRItYSecYosfQrhfnV5dY8f/dLF4oUi4T3gt92APZw= X-OriginatorOrg: pitt.edu X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 Jul 2017 14:43:12.5714 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN2PR04MB2173 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 15713 Lines: 392 On 07/27/2017 01:58 AM, Shuah Khan wrote: > Hi Paul, > > Please see comments below: > > On 07/25/2017 11:12 AM, Paul Elder wrote: >> Convert exec test output to TAP13 format, using the ksft framework. >> >> Signed-off-by: Paul Elder >> --- >> >> Depends on Shuah Khan's patch: "[PATCH 2/3] selftests: kselftest framework: add API to return pass/fail/* counts" (https://na01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fwww.spinics.net%2Flists%2Flinux-kselftest%2Fmsg01964.html&data=01%7C01%7Cpaul.elder%40pitt.edu%7C0709e3fc974f4ccf6fcb08d4d4478c78%7C9ef9f489e0a04eeb87cc3a526112fd0d%7C1&sdata=G3AQ%2FJRvrD0AXNupCNBbi4Ne9%2FAbYBZxZ3GryWev%2FN4%3D&reserved=0) >> >> tools/testing/selftests/exec/execveat.c | 148 +++++++++++++++++--------------- >> 1 file changed, 81 insertions(+), 67 deletions(-) >> >> diff --git a/tools/testing/selftests/exec/execveat.c b/tools/testing/selftests/exec/execveat.c >> index 8d5d1d2ee7c1..dc94c0661459 100644 >> --- a/tools/testing/selftests/exec/execveat.c >> +++ b/tools/testing/selftests/exec/execveat.c >> @@ -20,6 +20,8 @@ >> #include >> #include >> >> +#include "../kselftest.h" >> + >> static char longpath[2 * PATH_MAX] = ""; >> static char *envp[] = { "IN_TEST=yes", NULL, NULL }; >> static char *argv[] = { "execveat", "99", NULL }; >> @@ -41,23 +43,26 @@ static int _check_execveat_fail(int fd, const char *path, int flags, >> int expected_errno, const char *errno_str) >> { >> int rc; >> + char msg[512]; > > You need a line between declarations and code. Okay. > >> + snprintf(msg, 512, "Check failure of execveat(%d, '%s', %d) with %s...\n", >> + fd, path?:"(null)", flags, errno_str); > > Is there is a need to use snprinf() here? ksft_test_result_fail() does suppoort > var args now. Also, please use sizeof(msg) instead of 512. As you have noted later, it is to populate the static msg to be printed on both failure and success. >> >> errno = 0; >> - printf("Check failure of execveat(%d, '%s', %d) with %s... ", >> - fd, path?:"(null)", flags, errno_str); >> rc = execveat_(fd, path, argv, envp, flags); >> >> if (rc > 0) { >> - printf("[FAIL] (unexpected success from execveat(2))\n"); >> + ksft_test_result_fail(msg); >> + ksft_print_msg("unexpected success from execveat(2)\n"); > > I think one single message to indicate the test result is desirable as > opposed to two messages. The ksft_test_result_fail(msg) prints the test name and increments the fail counter, then the ksft_print_msg() gives information regarding the failure. > >> return 1; >> } >> if (errno != expected_errno) { >> - printf("[FAIL] (expected errno %d (%s) not %d (%s)\n", >> + ksft_test_result_fail(msg); >> + ksft_print_msg("expected errno %d (%s) not %d (%s)\n", >> expected_errno, strerror(expected_errno), >> errno, strerror(errno)); > > Same as above. > >> return 1; >> } >> - printf("[OK]\n"); >> + ksft_test_result_pass(msg); >> return 0; >> } >> >> @@ -68,43 +73,48 @@ static int check_execveat_invoked_rc(int fd, const char *path, int flags, >> int rc; >> pid_t child; >> int pathlen = path ? strlen(path) : 0; >> + char msg[512]; >> >> if (pathlen > 40) >> - printf("Check success of execveat(%d, '%.20s...%s', %d)... ", >> + snprintf(msg, 512, "Check success of execveat(%d, '%.20s...%s', %d)...\n", >> fd, path, (path + pathlen - 20), flags); >> else >> - printf("Check success of execveat(%d, '%s', %d)... ", >> + snprintf(msg, 512, "Check success of execveat(%d, '%s', %d)...\n", >> fd, path?:"(null)", flags); > > Is there is a need to use snprinf() here? ksft_test_result_fail() does suppoort > var args now. Also, please use sizeof(msg) instead of 512. > >> child = fork(); >> if (child < 0) { >> - printf("[FAIL] (fork() failed)\n"); >> + ksft_test_result_fail(msg); >> + ksft_print_msg("fork() failed\n"); >> return 1; >> } >> if (child == 0) { >> /* Child: do execveat(). */ >> rc = execveat_(fd, path, argv, envp, flags); >> - printf("[FAIL]: execveat() failed, rc=%d errno=%d (%s)\n", >> + ksft_exit_fail_msg("execveat() failed, rc=%d errno=%d (%s)\n", >> rc, errno, strerror(errno)); >> exit(1); /* should not reach here */ >> } >> /* Parent: wait for & check child's exit status. */ >> rc = waitpid(child, &status, 0); >> if (rc != child) { >> - printf("[FAIL] (waitpid(%d,...) returned %d)\n", child, rc); >> + ksft_test_result_fail(msg); >> + ksft_print_msg("waitpid(%d,...) returned %d\n", child, rc); > > I think one single message to indicate the test result is desirable as > opposed to two messages. > >> return 1; >> } >> if (!WIFEXITED(status)) { >> - printf("[FAIL] (child %d did not exit cleanly, status=%08x)\n", >> + ksft_test_result_fail(msg); >> + ksft_print_msg("child %d did not exit cleanly, status=%08x\n", >> child, status); > > I think one single message to indicate the test result is desirable as > opposed to two messages. > >> return 1; >> } >> if ((WEXITSTATUS(status) != expected_rc) && >> (WEXITSTATUS(status) != expected_rc2)) { >> - printf("[FAIL] (child %d exited with %d not %d nor %d)\n", >> + ksft_test_result_fail(msg); >> + ksft_print_msg("child %d exited with %d not %d nor %d\n", >> child, WEXITSTATUS(status), expected_rc, expected_rc2); >> return 1; >> } >> - printf("[OK]\n"); >> + ksft_test_result_pass(msg); > > I see why you are doing snprintf() - looks like you are using the msg buffer. > That is okay in this case. > >> return 0; >> } >> >> @@ -127,7 +137,7 @@ static int open_or_die(const char *filename, int flags) >> int fd = open(filename, flags); >> >> if (fd < 0) { >> - printf("Failed to open '%s'; " >> + ksft_exit_fail_msg("Failed to open '%s'; " >> "check prerequisites are available\n", filename); >> exit(1); >> } >> @@ -180,11 +190,11 @@ static int check_execveat_pathmax(int dot_dfd, const char *src, int is_script) >> */ >> fd = open(longpath, O_RDONLY); >> if (fd > 0) { >> - printf("Invoke copy of '%s' via filename of length %zu:\n", >> + ksft_print_msg("Invoke copy of '%s' via filename of length %zu:\n", >> src, strlen(longpath)); >> fail += check_execveat(fd, "", AT_EMPTY_PATH); >> } else { >> - printf("Failed to open length %zu filename, errno=%d (%s)\n", >> + ksft_print_msg("Failed to open length %zu filename, errno=%d (%s)\n", >> strlen(longpath), errno, strerror(errno)); >> fail++; >> } >> @@ -210,6 +220,8 @@ static int check_execveat_pathmax(int dot_dfd, const char *src, int is_script) >> >> static int run_tests(void) >> { >> + ksft_print_header(); > > This goes below the declaration block. Okay. > >> + >> int fail = 0; >> char *fullname = realpath("execveat", NULL); >> char *fullname_script = realpath("script", NULL); >> @@ -238,7 +250,7 @@ static int run_tests(void) >> errno = 0; >> execveat_(-1, NULL, NULL, NULL, 0); >> if (errno == ENOSYS) { >> - printf("[FAIL] ENOSYS calling execveat - no kernel support?\n"); >> + ksft_print_msg("[FAIL] ENOSYS calling execveat - no kernel support?\n"); >> return 1; >> } >> >> @@ -247,115 +259,115 @@ static int run_tests(void) >> >> /* Normal executable file: */ >> /* dfd + path */ >> - fail += check_execveat(subdir_dfd, "../execveat", 0); >> - fail += check_execveat(dot_dfd, "execveat", 0); >> - fail += check_execveat(dot_dfd_path, "execveat", 0); >> + check_execveat(subdir_dfd, "../execveat", 0); >> + check_execveat(dot_dfd, "execveat", 0); >> + check_execveat(dot_dfd_path, "execveat", 0); >> /* absolute path */ >> - fail += check_execveat(AT_FDCWD, fullname, 0); >> + check_execveat(AT_FDCWD, fullname, 0); >> /* absolute path with nonsense dfd */ >> - fail += check_execveat(99, fullname, 0); >> + check_execveat(99, fullname, 0); >> /* fd + no path */ >> - fail += check_execveat(fd, "", AT_EMPTY_PATH); >> + check_execveat(fd, "", AT_EMPTY_PATH); >> /* O_CLOEXEC fd + no path */ >> - fail += check_execveat(fd_cloexec, "", AT_EMPTY_PATH); >> + check_execveat(fd_cloexec, "", AT_EMPTY_PATH); >> /* O_PATH fd */ >> - fail += check_execveat(fd_path, "", AT_EMPTY_PATH); >> + check_execveat(fd_path, "", AT_EMPTY_PATH); >> >> /* Mess with executable file that's already open: */ >> /* fd + no path to a file that's been renamed */ >> rename("execveat.ephemeral", "execveat.moved"); >> - fail += check_execveat(fd_ephemeral, "", AT_EMPTY_PATH); >> + check_execveat(fd_ephemeral, "", AT_EMPTY_PATH); >> /* fd + no path to a file that's been deleted */ >> unlink("execveat.moved"); /* remove the file now fd open */ >> - fail += check_execveat(fd_ephemeral, "", AT_EMPTY_PATH); >> + check_execveat(fd_ephemeral, "", AT_EMPTY_PATH); >> >> /* Mess with executable file that's already open with O_PATH */ >> /* fd + no path to a file that's been deleted */ >> unlink("execveat.path.ephemeral"); >> - fail += check_execveat(fd_ephemeral_path, "", AT_EMPTY_PATH); >> + check_execveat(fd_ephemeral_path, "", AT_EMPTY_PATH); >> >> /* Invalid argument failures */ >> - fail += check_execveat_fail(fd, "", 0, ENOENT); >> - fail += check_execveat_fail(fd, NULL, AT_EMPTY_PATH, EFAULT); >> + check_execveat_fail(fd, "", 0, ENOENT); >> + check_execveat_fail(fd, NULL, AT_EMPTY_PATH, EFAULT); >> >> /* Symlink to executable file: */ >> /* dfd + path */ >> - fail += check_execveat(dot_dfd, "execveat.symlink", 0); >> - fail += check_execveat(dot_dfd_path, "execveat.symlink", 0); >> + check_execveat(dot_dfd, "execveat.symlink", 0); >> + check_execveat(dot_dfd_path, "execveat.symlink", 0); >> /* absolute path */ >> - fail += check_execveat(AT_FDCWD, fullname_symlink, 0); >> + check_execveat(AT_FDCWD, fullname_symlink, 0); >> /* fd + no path, even with AT_SYMLINK_NOFOLLOW (already followed) */ >> - fail += check_execveat(fd_symlink, "", AT_EMPTY_PATH); >> - fail += check_execveat(fd_symlink, "", >> + check_execveat(fd_symlink, "", AT_EMPTY_PATH); >> + check_execveat(fd_symlink, "", >> AT_EMPTY_PATH|AT_SYMLINK_NOFOLLOW); >> >> /* Symlink fails when AT_SYMLINK_NOFOLLOW set: */ >> /* dfd + path */ >> - fail += check_execveat_fail(dot_dfd, "execveat.symlink", >> + check_execveat_fail(dot_dfd, "execveat.symlink", >> AT_SYMLINK_NOFOLLOW, ELOOP); >> - fail += check_execveat_fail(dot_dfd_path, "execveat.symlink", >> + check_execveat_fail(dot_dfd_path, "execveat.symlink", >> AT_SYMLINK_NOFOLLOW, ELOOP); >> /* absolute path */ >> - fail += check_execveat_fail(AT_FDCWD, fullname_symlink, >> + check_execveat_fail(AT_FDCWD, fullname_symlink, >> AT_SYMLINK_NOFOLLOW, ELOOP); >> >> /* Shell script wrapping executable file: */ >> /* dfd + path */ >> - fail += check_execveat(subdir_dfd, "../script", 0); >> - fail += check_execveat(dot_dfd, "script", 0); >> - fail += check_execveat(dot_dfd_path, "script", 0); >> + check_execveat(subdir_dfd, "../script", 0); >> + check_execveat(dot_dfd, "script", 0); >> + check_execveat(dot_dfd_path, "script", 0); >> /* absolute path */ >> - fail += check_execveat(AT_FDCWD, fullname_script, 0); >> + check_execveat(AT_FDCWD, fullname_script, 0); >> /* fd + no path */ >> - fail += check_execveat(fd_script, "", AT_EMPTY_PATH); >> - fail += check_execveat(fd_script, "", >> + check_execveat(fd_script, "", AT_EMPTY_PATH); >> + check_execveat(fd_script, "", >> AT_EMPTY_PATH|AT_SYMLINK_NOFOLLOW); >> /* O_CLOEXEC fd fails for a script (as script file inaccessible) */ >> - fail += check_execveat_fail(fd_script_cloexec, "", AT_EMPTY_PATH, >> + check_execveat_fail(fd_script_cloexec, "", AT_EMPTY_PATH, >> ENOENT); >> - fail += check_execveat_fail(dot_dfd_cloexec, "script", 0, ENOENT); >> + check_execveat_fail(dot_dfd_cloexec, "script", 0, ENOENT); >> >> /* Mess with script file that's already open: */ >> /* fd + no path to a file that's been renamed */ >> rename("script.ephemeral", "script.moved"); >> - fail += check_execveat(fd_script_ephemeral, "", AT_EMPTY_PATH); >> + check_execveat(fd_script_ephemeral, "", AT_EMPTY_PATH); >> /* fd + no path to a file that's been deleted */ >> unlink("script.moved"); /* remove the file while fd open */ >> - fail += check_execveat(fd_script_ephemeral, "", AT_EMPTY_PATH); >> + check_execveat(fd_script_ephemeral, "", AT_EMPTY_PATH); >> >> /* Rename a subdirectory in the path: */ >> rename("subdir.ephemeral", "subdir.moved"); >> - fail += check_execveat(subdir_dfd_ephemeral, "../script", 0); >> - fail += check_execveat(subdir_dfd_ephemeral, "script", 0); >> + check_execveat(subdir_dfd_ephemeral, "../script", 0); >> + check_execveat(subdir_dfd_ephemeral, "script", 0); >> /* Remove the subdir and its contents */ >> unlink("subdir.moved/script"); >> unlink("subdir.moved"); >> /* Shell loads via deleted subdir OK because name starts with .. */ >> - fail += check_execveat(subdir_dfd_ephemeral, "../script", 0); >> - fail += check_execveat_fail(subdir_dfd_ephemeral, "script", 0, ENOENT); >> + check_execveat(subdir_dfd_ephemeral, "../script", 0); >> + check_execveat_fail(subdir_dfd_ephemeral, "script", 0, ENOENT); >> >> /* Flag values other than AT_SYMLINK_NOFOLLOW => EINVAL */ >> - fail += check_execveat_fail(dot_dfd, "execveat", 0xFFFF, EINVAL); >> + check_execveat_fail(dot_dfd, "execveat", 0xFFFF, EINVAL); >> /* Invalid path => ENOENT */ >> - fail += check_execveat_fail(dot_dfd, "no-such-file", 0, ENOENT); >> - fail += check_execveat_fail(dot_dfd_path, "no-such-file", 0, ENOENT); >> - fail += check_execveat_fail(AT_FDCWD, "no-such-file", 0, ENOENT); >> + check_execveat_fail(dot_dfd, "no-such-file", 0, ENOENT); >> + check_execveat_fail(dot_dfd_path, "no-such-file", 0, ENOENT); >> + check_execveat_fail(AT_FDCWD, "no-such-file", 0, ENOENT); >> /* Attempt to execute directory => EACCES */ >> fail += check_execveat_fail(dot_dfd, "", AT_EMPTY_PATH, EACCES); >> /* Attempt to execute non-executable => EACCES */ >> - fail += check_execveat_fail(dot_dfd, "Makefile", 0, EACCES); >> - fail += check_execveat_fail(fd_denatured, "", AT_EMPTY_PATH, EACCES); >> - fail += check_execveat_fail(fd_denatured_path, "", AT_EMPTY_PATH, >> + check_execveat_fail(dot_dfd, "Makefile", 0, EACCES); >> + check_execveat_fail(fd_denatured, "", AT_EMPTY_PATH, EACCES); >> + check_execveat_fail(fd_denatured_path, "", AT_EMPTY_PATH, >> EACCES); >> /* Attempt to execute nonsense FD => EBADF */ >> - fail += check_execveat_fail(99, "", AT_EMPTY_PATH, EBADF); >> - fail += check_execveat_fail(99, "execveat", 0, EBADF); >> + check_execveat_fail(99, "", AT_EMPTY_PATH, EBADF); >> + check_execveat_fail(99, "execveat", 0, EBADF); >> /* Attempt to execute relative to non-directory => ENOTDIR */ >> - fail += check_execveat_fail(fd, "execveat", 0, ENOTDIR); >> + check_execveat_fail(fd, "execveat", 0, ENOTDIR); >> >> - fail += check_execveat_pathmax(dot_dfd, "execveat", 0); >> - fail += check_execveat_pathmax(dot_dfd, "script", 1); >> - return fail; >> + check_execveat_pathmax(dot_dfd, "execveat", 0); >> + check_execveat_pathmax(dot_dfd, "script", 1); >> + return ksft_get_fail_cnt(); >> } >> >> static void prerequisites(void) >> @@ -405,8 +417,10 @@ int main(int argc, char **argv) >> if (verbose) >> envp[1] = "VERBOSE=1"; >> rc = run_tests(); >> - if (rc > 0) >> - printf("%d tests failed\n", rc); >> + if (rc) >> + ksft_exit_fail(); >> + else >> + ksft_exit_pass(); >> } >> return rc; >> } >> > > Looks like main() still needs some changes for: > if (!in_test || strcmp(in_test, "yes") != 0) { > > case. Yes, it does. Looks like I missed it. Thank you, Paul > > thanks, > -- Shuah >