1/* 2 * Copyright (c) 2000-2004 Apple Computer, Inc. All Rights Reserved. 3 * 4 * @APPLE_LICENSE_HEADER_START@ 5 * 6 * This file contains Original Code and/or Modifications of Original Code 7 * as defined in and that are subject to the Apple Public Source License 8 * Version 2.0 (the 'License'). You may not use this file except in 9 * compliance with the License. Please obtain a copy of the License at 10 * http://www.opensource.apple.com/apsl/ and read it before using this 11 * file. 12 * 13 * The Original Code and all software distributed under the License are 14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 18 * Please see the License for the specific language governing rights and 19 * limitations under the License. 20 * 21 * @APPLE_LICENSE_HEADER_END@ 22 */ 23 24 25// 26// inetreply - manage Internet-standard reply strings 27// 28#include "inetreply.h" 29#include <security_utilities/debugging.h> 30#include <ctype.h> 31 32namespace Security { 33namespace IPPlusPlus { 34 35 36// 37// Construct an InetReply object from a WRITABLE buffer. 38// The buffer will be alterered by this constructor, and needs to be left alone 39// until the InetReply object is destroyed. 40// 41InetReply::InetReply(const char *buffer) : mBuffer(buffer) 42{ 43 analyze(); 44} 45 46void InetReply::analyze() 47{ 48 // follow Internet rule #1: be lenient in what you accept 49 /*const*/ char *p; // (un-const is ANSI bogosity in strtol) 50 mCode = (int) strtol(mBuffer, &p, 10); 51 if (p == mBuffer) { // conversion failed 52 mCode = -1; // error indicator 53 mSeparator = ' '; 54 mMessage = "?invalid?"; 55 return; 56 } 57 if (!*p) { // just "nnn" (tolerate) 58 mCode = atoi(p); 59 mSeparator = ' '; 60 mMessage = ""; 61 return; 62 } 63 mSeparator = *p++; 64 while (isspace(*p)) p++; 65 mMessage = p; 66} 67 68 69// 70// Continuation handling 71// 72bool InetReply::Continuation::operator () (const char *input) 73{ 74 if (mActive && !strncmp(input, mTestString, 4)) 75 mActive = false; 76 return mActive; 77} 78 79bool InetReply::Continuation::operator () (const InetReply &reply) 80{ 81 if (!mActive && reply.isContinued()) { 82 mActive = true; 83 snprintf(mTestString, 4, "%03d", reply.code()); 84 mTestString[3] = ' '; // no \0 left in this string 85 } 86 return mActive; 87} 88 89 90} // end namespace IPPlusPlus 91} // end namespace Security 92