Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
mariadb
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
mariadb
Commits
0abcffcb
Commit
0abcffcb
authored
Oct 14, 2005
by
lars@mysql.com
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
WL#2835: Base64 mysys functions
parent
cac5b085
Changes
10
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
330 additions
and
241 deletions
+330
-241
include/base64.h
include/base64.h
+32
-9
mysys/Makefile.am
mysys/Makefile.am
+6
-1
mysys/base64.c
mysys/base64.c
+265
-0
ndb/config/type_ndbapi.mk.am
ndb/config/type_ndbapi.mk.am
+3
-1
ndb/config/type_util.mk.am
ndb/config/type_util.mk.am
+6
-1
ndb/src/common/util/Base64.cpp
ndb/src/common/util/Base64.cpp
+0
-212
ndb/src/common/util/Makefile.am
ndb/src/common/util/Makefile.am
+1
-1
ndb/src/common/util/Parser.cpp
ndb/src/common/util/Parser.cpp
+1
-6
ndb/src/mgmapi/mgmapi.cpp
ndb/src/mgmapi/mgmapi.cpp
+9
-5
ndb/src/mgmsrv/Services.cpp
ndb/src/mgmsrv/Services.cpp
+7
-5
No files found.
ndb/include/util/Base64.hpp
→
include/base64.h
View file @
0abcffcb
...
...
@@ -14,15 +14,38 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
#ifndef __BASE64_H
PP
_INCLUDED__
#define __BASE64_H
PP
_INCLUDED__
#ifndef __BASE64_H_INCLUDED__
#define __BASE64_H_INCLUDED__
#include <UtilBuffer.hpp>
#include <BaseString.hpp>
#ifdef __cplusplus
extern
"C"
{
#endif
int
base64_encode
(
const
UtilBuffer
&
src
,
BaseString
&
dst
);
int
base64_encode
(
const
void
*
s
,
size_t
src_len
,
BaseString
&
dst
);
int
base64_decode
(
const
BaseString
&
src
,
UtilBuffer
&
dst
);
int
base64_decode
(
const
char
*
s
,
size_t
len
,
UtilBuffer
&
dst
);
#endif
/* !__BASE64_HPP_INCLUDED__ */
#include <mysys_priv.h>
/*
Calculate how much memory needed for dst of base64_encode()
*/
int
base64_needed_encoded_length
(
int
length_of_data
);
/*
Calculate how much memory needed for dst of base64_decode()
*/
int
base64_needed_decoded_length
(
int
length_of_encoded_data
);
/*
Encode data as a base64 string
*/
int
base64_encode
(
const
void
*
src
,
size_t
src_len
,
char
*
dst
);
/*
Decode a base64 string into data
*/
int
base64_decode
(
const
char
*
src
,
size_t
src_len
,
void
*
dst
);
#ifdef __cplusplus
}
#endif
#endif
/* !__BASE64_H_INCLUDED__ */
mysys/Makefile.am
View file @
0abcffcb
...
...
@@ -55,7 +55,7 @@ libmysys_a_SOURCES = my_init.c my_getwd.c mf_getdate.c my_mmap.c \
charset.c charset-def.c my_bitmap.c my_bit.c md5.c
\
my_gethostbyname.c rijndael.c my_aes.c sha1.c
\
my_handler.c my_netware.c my_largepage.c
\
my_windac.c my_access.c
my_windac.c my_access.c
base64.c
EXTRA_DIST
=
thr_alarm.c thr_lock.c my_pthread.c my_thr_init.c
\
thr_mutex.c thr_rwlock.c
libmysys_a_LIBADD
=
@THREAD_LOBJECTS@
...
...
@@ -116,5 +116,10 @@ test_gethwaddr$(EXEEXT): my_gethwaddr.c $(LIBRARIES)
$(LINK)
$(FLAGS)
-DMAIN
./test_gethwaddr.c
$(LDADD)
$(LIBS)
$(RM)
-f
./test_gethwaddr.c
test_base64$(EXEEXT)
:
base64.c $(LIBRARIES)
$(CP)
$(srcdir)
/base64.c ./test_base64.c
$(LINK)
$(FLAGS)
-DMAIN
./test_base64.c
$(LDADD)
$(LIBS)
$(RM)
-f
./test_base64.c
# Don't update the files from bitkeeper
%
::
SCCS/s.%
mysys/base64.c
0 → 100644
View file @
0abcffcb
/* Copyright (C) 2003 MySQL AB
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
#include <base64.h>
#include <m_string.h> // strchr()
#ifndef MAIN
static
char
base64_table
[]
=
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"
"0123456789+/"
;
int
base64_needed_encoded_length
(
int
length_of_data
)
{
return
ceil
(
length_of_data
*
4
/
3
)
/* base64 chars */
+
ceil
(
length_of_data
/
(
76
*
3
/
4
))
/* Newlines */
+
3
/* Padding */
;
}
int
base64_needed_decoded_length
(
int
length_of_encoded_data
)
{
return
ceil
(
length_of_encoded_data
*
3
/
4
);
}
/*
Encode a data as base64.
Note: We require that dst is pre-allocated to correct size.
See base64_needed_encoded_length().
*/
int
base64_encode
(
const
void
*
src
,
size_t
src_len
,
char
*
dst
)
{
const
unsigned
char
*
s
=
(
const
unsigned
char
*
)
src
;
size_t
i
=
0
;
size_t
len
=
0
;
for
(;
i
<
src_len
;
len
+=
4
)
{
if
(
len
==
76
)
{
len
=
0
;
*
dst
++=
'\n'
;
}
unsigned
c
;
c
=
s
[
i
++
];
c
<<=
8
;
if
(
i
<
src_len
)
c
+=
s
[
i
];
c
<<=
8
;
i
++
;
if
(
i
<
src_len
)
c
+=
s
[
i
];
i
++
;
*
dst
++=
base64_table
[(
c
>>
18
)
&
0x3f
];
*
dst
++=
base64_table
[(
c
>>
12
)
&
0x3f
];
if
(
i
>
(
src_len
+
1
))
*
dst
++=
'='
;
else
*
dst
++=
base64_table
[(
c
>>
6
)
&
0x3f
];
if
(
i
>
src_len
)
*
dst
++=
'='
;
else
*
dst
++=
base64_table
[(
c
>>
0
)
&
0x3f
];
}
return
0
;
}
static
inline
unsigned
pos
(
unsigned
char
c
)
{
return
strchr
(
base64_table
,
c
)
-
base64_table
;
}
#define SKIP_SPACE(src, i, size) \
{ \
while (i < size && my_isspace(default_charset_info, * src)) \
{ \
i++; \
src++; \
} \
if (i == size) \
{ \
i= size + 1; \
break; \
} \
}
/*
Decode a base64 string
Note: We require that dst is pre-allocated to correct size.
See base64_needed_decoded_length().
RETURN Number of bytes produced in dst or -1 in case of failure
*/
int
base64_decode
(
const
char
*
src
,
size_t
size
,
void
*
dst
)
{
char
b
[
3
];
size_t
i
=
0
;
void
*
d
=
dst
;
size_t
j
;
while
(
i
<
size
)
{
unsigned
c
=
0
;
size_t
mark
=
0
;
SKIP_SPACE
(
src
,
i
,
size
);
c
+=
pos
(
*
src
++
);
c
<<=
6
;
i
++
;
SKIP_SPACE
(
src
,
i
,
size
);
c
+=
pos
(
*
src
++
);
c
<<=
6
;
i
++
;
SKIP_SPACE
(
src
,
i
,
size
);
if
(
*
src
!=
'='
)
c
+=
pos
(
*
src
++
);
else
{
i
=
size
;
mark
=
2
;
c
<<=
6
;
goto
end
;
}
c
<<=
6
;
i
++
;
SKIP_SPACE
(
src
,
i
,
size
);
if
(
*
src
!=
'='
)
c
+=
pos
(
*
src
++
);
else
{
i
=
size
;
mark
=
1
;
goto
end
;
}
i
++
;
end:
b
[
0
]
=
(
c
>>
16
)
&
0xff
;
b
[
1
]
=
(
c
>>
8
)
&
0xff
;
b
[
2
]
=
(
c
>>
0
)
&
0xff
;
for
(
j
=
0
;
j
<
3
-
mark
;
j
++
)
*
(
char
*
)
d
++=
b
[
j
];
}
if
(
i
!=
size
)
{
return
-
1
;
}
return
d
-
dst
;
}
#else
/* MAIN */
#define require(b) { \
if (!(b)) { \
printf("Require failed at %s:%d\n", __FILE__, __LINE__); \
abort(); \
} \
}
int
main
(
void
)
{
int
i
;
size_t
j
;
size_t
k
,
l
;
size_t
dst_len
;
for
(
i
=
0
;
i
<
500
;
i
++
)
{
/* Create source data */
const
size_t
src_len
=
rand
()
%
1000
+
1
;
char
*
src
=
(
char
*
)
malloc
(
src_len
);
char
*
s
=
src
;
for
(
j
=
0
;
j
<
src_len
;
j
++
)
{
char
c
=
rand
();
*
s
++=
c
;
}
/* Encode */
char
*
str
=
(
char
*
)
malloc
(
base64_needed_encoded_length
(
src_len
));
require
(
base64_encode
(
src
,
src_len
,
str
)
==
0
);
/* Decode */
char
*
dst
=
(
char
*
)
malloc
(
base64_needed_decoded_length
(
strlen
(
str
)));
dst_len
=
base64_decode
(
str
,
strlen
(
str
),
dst
);
require
(
dst_len
==
src_len
);
if
(
memcmp
(
src
,
dst
,
src_len
)
!=
0
)
{
printf
(
" --------- src --------- --------- dst ---------
\n
"
);
for
(
k
=
0
;
k
<
src_len
;
k
+=
8
)
{
printf
(
"%.4x "
,
(
uint
)
k
);
for
(
l
=
0
;
l
<
8
&&
k
+
l
<
src_len
;
l
++
)
{
unsigned
char
c
=
src
[
k
+
l
];
printf
(
"%.2x "
,
(
unsigned
)
c
);
}
printf
(
" "
);
for
(
l
=
0
;
l
<
8
&&
k
+
l
<
dst_len
;
l
++
)
{
unsigned
char
c
=
dst
[
k
+
l
];
printf
(
"%.2x "
,
(
unsigned
)
c
);
}
printf
(
"
\n
"
);
}
printf
(
"src length: %.8x, dst length: %.8x
\n
"
,
(
uint
)
src_len
,
(
uint
)
dst_len
);
require
(
0
);
}
}
printf
(
"Test succeeded.
\n
"
);
return
0
;
}
#endif
ndb/config/type_ndbapi.mk.am
View file @
0abcffcb
INCLUDES += \
-I$(srcdir) -I$(top_srcdir)/include -I$(top_srcdir)/ndb/include \
-I$(srcdir) -I$(top_srcdir)/include \
-I$(top_srcdir)/mysys \
-I$(top_srcdir)/ndb/include \
-I$(top_srcdir)/ndb/include/kernel \
-I$(top_srcdir)/ndb/include/transporter \
-I$(top_srcdir)/ndb/include/debugger \
...
...
ndb/config/type_util.mk.am
View file @
0abcffcb
INCLUDES += -I$(srcdir) -I$(top_srcdir)/include \
INCLUDES += -I$(srcdir) \
-I$(top_srcdir)/include \
-I$(top_srcdir)/mysys \
-I$(top_srcdir)/ndb/include \
-I$(top_srcdir)/ndb/include/util \
-I$(top_srcdir)/ndb/include/portlib \
-I$(top_srcdir)/ndb/include/logger
LDADD += \
$(top_builddir)/mysys/libmysys.a
ndb/src/common/util/Base64.cpp
deleted
100644 → 0
View file @
cac5b085
/* Copyright (C) 2003 MySQL AB
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
#include <ndb_global.h>
#include <Base64.hpp>
static
char
base64_table
[]
=
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"
"0123456789+/"
;
int
base64_encode
(
const
UtilBuffer
&
src
,
BaseString
&
dst
)
{
return
base64_encode
(
src
.
get_data
(),
src
.
length
(),
dst
);
}
int
base64_encode
(
const
void
*
_s
,
size_t
src_len
,
BaseString
&
dst
)
{
const
unsigned
char
*
s
=
(
const
unsigned
char
*
)
_s
;
size_t
i
=
0
;
size_t
len
=
0
;
while
(
i
<
src_len
)
{
if
(
len
==
76
){
len
=
0
;
dst
.
append
(
'\n'
);
}
unsigned
c
;
c
=
s
[
i
++
];
c
<<=
8
;
if
(
i
<
src_len
)
c
+=
s
[
i
];
c
<<=
8
;
i
++
;
if
(
i
<
src_len
)
c
+=
s
[
i
];
i
++
;
dst
.
append
(
base64_table
[(
c
>>
18
)
&
0x3f
]);
dst
.
append
(
base64_table
[(
c
>>
12
)
&
0x3f
]);
if
(
i
>
(
src_len
+
1
))
dst
.
append
(
'='
);
else
dst
.
append
(
base64_table
[(
c
>>
6
)
&
0x3f
]);
if
(
i
>
src_len
)
dst
.
append
(
'='
);
else
dst
.
append
(
base64_table
[(
c
>>
0
)
&
0x3f
]);
len
+=
4
;
}
return
0
;
}
static
inline
unsigned
pos
(
unsigned
char
c
)
{
return
strchr
(
base64_table
,
c
)
-
base64_table
;
}
int
base64_decode
(
const
BaseString
&
src
,
UtilBuffer
&
dst
)
{
return
base64_decode
(
src
.
c_str
(),
src
.
length
(),
dst
);
}
#define SKIP_SPACE(src, i, size){ \
while(i < size && isspace(* src)){ \
i++; \
src++; \
} \
if(i == size){ \
i = size + 1; \
break; \
} \
}
int
base64_decode
(
const
char
*
src
,
size_t
size
,
UtilBuffer
&
dst
)
{
size_t
i
=
0
;
while
(
i
<
size
){
unsigned
c
=
0
;
int
mark
=
0
;
SKIP_SPACE
(
src
,
i
,
size
);
c
+=
pos
(
*
src
++
);
c
<<=
6
;
i
++
;
SKIP_SPACE
(
src
,
i
,
size
);
c
+=
pos
(
*
src
++
);
c
<<=
6
;
i
++
;
SKIP_SPACE
(
src
,
i
,
size
);
if
(
*
src
!=
'='
)
c
+=
pos
(
*
src
++
);
else
{
i
=
size
;
mark
=
2
;
c
<<=
6
;
goto
end
;
}
c
<<=
6
;
i
++
;
SKIP_SPACE
(
src
,
i
,
size
);
if
(
*
src
!=
'='
)
c
+=
pos
(
*
src
++
);
else
{
i
=
size
;
mark
=
1
;
goto
end
;
}
i
++
;
end:
char
b
[
3
];
b
[
0
]
=
(
c
>>
16
)
&
0xff
;
b
[
1
]
=
(
c
>>
8
)
&
0xff
;
b
[
2
]
=
(
c
>>
0
)
&
0xff
;
dst
.
append
((
void
*
)
b
,
3
-
mark
);
}
if
(
i
!=
size
){
abort
();
return
-
1
;
}
return
0
;
}
#ifdef __TEST__B64
/**
* USER_FLAGS="-D__TEST__B64" make Base64.o && g++ Base64.o BaseString.o
*/
inline
void
require
(
bool
b
){
if
(
!
b
)
abort
();
}
int
main
(
void
){
for
(
int
i
=
0
;
i
<
500
;
i
++
){
const
size_t
len
=
rand
()
%
10000
+
1
;
UtilBuffer
src
;
for
(
size_t
j
=
0
;
j
<
len
;
j
++
){
char
c
=
rand
();
src
.
append
(
&
c
,
1
);
}
require
(
src
.
length
()
==
len
);
BaseString
str
;
require
(
base64_encode
(
src
,
str
)
==
0
);
if
(
str
.
length
()
==
3850
){
printf
(
">%s<
\n
"
,
str
.
c_str
());
}
UtilBuffer
dst
;
require
(
base64_decode
(
str
,
dst
)
==
0
);
require
(
dst
.
length
()
==
src
.
length
());
const
char
*
c_src
=
(
char
*
)
src
.
get_data
();
const
char
*
c_dst
=
(
char
*
)
dst
.
get_data
();
if
(
memcmp
(
src
.
get_data
(),
dst
.
get_data
(),
src
.
length
())
!=
0
){
printf
(
"-- src --
\n
"
);
for
(
int
i2
=
0
;
i2
<
len
;
i2
++
){
unsigned
char
c
=
c_src
[
i2
];
printf
(
"%.2x "
,
(
unsigned
)
c
);
if
((
i2
%
8
)
==
7
)
printf
(
"
\n
"
);
}
printf
(
"
\n
"
);
printf
(
"-- dst --
\n
"
);
for
(
int
i2
=
0
;
i2
<
len
;
i2
++
){
unsigned
char
c
=
c_dst
[
i2
];
printf
(
"%.2x "
,
(
unsigned
)
c
);
if
((
i2
%
8
)
==
7
)
printf
(
"
\n
"
);
}
printf
(
"
\n
"
);
abort
();
}
}
return
0
;
}
#endif
ndb/src/common/util/Makefile.am
View file @
0abcffcb
...
...
@@ -5,7 +5,7 @@ libgeneral_la_SOURCES = \
File.cpp md5_hash.cpp Properties.cpp socket_io.cpp
\
SimpleProperties.cpp Parser.cpp InputStream.cpp
\
SocketServer.cpp SocketClient.cpp SocketAuthenticator.cpp
\
OutputStream.cpp NdbOut.cpp BaseString.cpp
Base64.cpp
\
OutputStream.cpp NdbOut.cpp BaseString.cpp
\
NdbSqlUtil.cpp new.cpp
\
uucode.c random.c version.c
\
strdup.c
\
...
...
ndb/src/common/util/Parser.cpp
View file @
0abcffcb
...
...
@@ -20,7 +20,6 @@
#include "Parser.hpp"
#include <NdbOut.hpp>
#include <Properties.hpp>
#include <Base64.hpp>
#undef DEBUG
#define DEBUG(x) ndbout << x << endl;
...
...
@@ -316,11 +315,7 @@ ParserImpl::parseArg(Context * ctx,
}
case
DummyRow
:
:
Properties
:
{
Properties
*
sp
=
new
Properties
();
BaseString
v
(
value
);
UtilBuffer
b
;
base64_decode
(
v
,
b
);
sp
->
unpack
((
const
Uint32
*
)
b
.
get_data
(),
b
.
length
());
abort
();
break
;
}
default:
...
...
ndb/src/mgmapi/mgmapi.cpp
View file @
0abcffcb
...
...
@@ -34,8 +34,8 @@
#include <Parser.hpp>
#include <OutputStream.hpp>
#include <InputStream.hpp>
#include <Base64.hpp>
#include <base64.h>
#define MGM_CMD(name, fun, desc) \
{ name, \
...
...
@@ -1770,11 +1770,15 @@ ndb_mgm_get_configuration(NdbMgmHandle handle, unsigned int version) {
}
while
(
start
<
len
);
if
(
buf64
==
0
)
break
;
void
*
tmp_data
=
malloc
(
base64_needed_decoded_length
((
size_t
)
(
len
-
1
)));
const
int
res
=
base64_decode
(
buf64
,
len
-
1
,
tmp_data
);
delete
[]
buf64
;
UtilBuffer
tmp
;
const
int
res
=
base64_decode
(
buf64
,
len
-
1
,
tmp
);
delete
[]
buf64
;
if
(
res
!=
0
){
tmp
.
append
((
void
*
)
tmp_data
,
res
);
free
(
tmp_data
);
if
(
res
<
0
)
{
fprintf
(
handle
->
errstream
,
"Failed to decode buffer
\n
"
);
break
;
}
...
...
ndb/src/mgmsrv/Services.cpp
View file @
0abcffcb
...
...
@@ -25,7 +25,6 @@
#include <signaldata/SetLogLevelOrd.hpp>
#include <LogLevel.hpp>
#include <BaseString.hpp>
#include <Base64.hpp>
#include <ConfigValues.hpp>
#include <mgmapi_configuration.hpp>
...
...
@@ -33,6 +32,8 @@
#include "Services.hpp"
#include "../mgmapi/ndb_logevent.hpp"
#include <base64.h>
extern
bool
g_StopServer
;
static
const
unsigned
int
MAX_READ_TIMEOUT
=
1000
;
...
...
@@ -598,17 +599,18 @@ MgmApiSession::getConfig_common(Parser_t::Context &,
cfg
->
pack
(
src
);
NdbMutex_Unlock
(
m_mgmsrv
.
m_configMutex
);
BaseString
str
;
int
res
=
base64_encode
(
src
,
str
);
char
*
tmp_str
=
(
char
*
)
malloc
(
base64_needed_encoded_length
(
src
.
length
()))
;
int
res
=
base64_encode
(
src
.
get_data
(),
src
.
length
(),
tmp_
str
);
m_output
->
println
(
"get config reply"
);
m_output
->
println
(
"result: Ok"
);
m_output
->
println
(
"Content-Length: %d"
,
str
.
length
(
));
m_output
->
println
(
"Content-Length: %d"
,
str
len
(
tmp_str
));
m_output
->
println
(
"Content-Type: ndbconfig/octet-stream"
);
m_output
->
println
(
"Content-Transfer-Encoding: base64"
);
m_output
->
println
(
""
);
m_output
->
println
(
str
.
c_str
()
);
m_output
->
println
(
tmp_str
);
free
(
tmp_str
);
return
;
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment