1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
|
/*
* Dibbler - a portable DHCPv6
*
* authors: Tomasz Mrugalski <thomson@klub.com.pl>
* Marek Senderski <msend@o2.pl>
*
* released under GNU GPL v2 licence
*
* $Id: OptString.cpp,v 1.3 2007-08-26 10:26:19 thomson Exp $
*
* $Log: OptString.cpp,v $
* Revision 1.3 2007-08-26 10:26:19 thomson
* Possible segfault in REBIND processing,
* gcc 4.3.0 conformance
*
* Revision 1.2 2005-07-17 21:09:52 thomson
* Minor improvements for 0.4.1 release.
*
* Revision 1.1 2004/11/02 01:23:13 thomson
* Initial revision
*
* Revision 1.3 2004/04/11 18:10:56 thomson
* CRLF fixed.
*
* Revision 1.2 2004/03/29 18:53:08 thomson
* Author/Licence/cvs log/cvs version headers added.
*/
#include <stdlib.h>
#include <iostream>
#include "Portable.h"
#include "OptString.h"
#include "DHCPConst.h"
using namespace std;
TOptString::TOptString(int type, string str, TMsg* parent)
:TOpt(type, parent) {
Str = str;
}
TOptString::TOptString(int type, char *&buf, int &bufsize, TMsg* parent)
:TOpt(type, parent)
{
char* str=new char[bufsize+1];
memcpy(str,buf,bufsize);
str[bufsize]=0;
Str = string(str);
delete [] str;
bufsize -= this->Str.length()+1;
buf += this->Str.length()+1;
}
char * TOptString::storeSelf(char* buf)
{
*(short*)buf = htons(OptType);
buf+=2;
*(short*)buf = htons(getSize()-4);
buf+=2;
memcpy(buf,Str.c_str(),Str.length());
buf[Str.length()]=0; // null-terminated
return buf+this->Str.length()+1;
*buf = (char)Str.length(); // length of a string (with first byte)
buf++;
memcpy(buf,this->Str.c_str(),this->Str.length());
buf += this->Str.length();
*buf=0; // add final 0.
return buf+1;
}
int TOptString::getSize() {
return (int)(Str.length()+6); // 4-normal header + 1 (strlen) + 1 (final 0)
}
string TOptString::getString() {
return Str;
}
|