summaryrefslogtreecommitdiffstats
path: root/g10/encode.c
diff options
context:
space:
mode:
authorWerner Koch <wk@gnupg.org>1999-07-26 09:44:46 +0200
committerWerner Koch <wk@gnupg.org>1999-07-26 09:44:46 +0200
commit4dbfb24dbb3652b3b73d97d3fee3df5c968aa358 (patch)
tree6841adaa29b9aa8803f9b5ea746690f35c1a4a45 /g10/encode.c
parent. (diff)
downloadgnupg2-4dbfb24dbb3652b3b73d97d3fee3df5c968aa358.tar.xz
gnupg2-4dbfb24dbb3652b3b73d97d3fee3df5c968aa358.zip
See ChangeLog: Mon Jul 26 09:34:46 CEST 1999 Werner Koch
Diffstat (limited to 'g10/encode.c')
-rw-r--r--g10/encode.c144
1 files changed, 97 insertions, 47 deletions
diff --git a/g10/encode.c b/g10/encode.c
index 147607b31..5ee999665 100644
--- a/g10/encode.c
+++ b/g10/encode.c
@@ -70,7 +70,7 @@ encode_simple( const char *filename, int mode )
{
IOBUF inp, out;
PACKET pkt;
- PKT_plaintext *pt;
+ PKT_plaintext *pt = NULL;
STRING2KEY *s2k = NULL;
int rc = 0;
u32 filesize;
@@ -144,18 +144,22 @@ encode_simple( const char *filename, int mode )
m_free(enc);
}
- /* setup the inner packet */
- if( filename || opt.set_filename ) {
- char *s = make_basename( opt.set_filename ? opt.set_filename : filename );
- pt = m_alloc( sizeof *pt + strlen(s) - 1 );
- pt->namelen = strlen(s);
- memcpy(pt->name, s, pt->namelen );
- m_free(s);
- }
- else { /* no filename */
- pt = m_alloc( sizeof *pt - 1 );
- pt->namelen = 0;
+ if (!opt.no_literal) {
+ /* setup the inner packet */
+ if( filename || opt.set_filename ) {
+ char *s = make_basename( opt.set_filename ? opt.set_filename
+ : filename );
+ pt = m_alloc( sizeof *pt + strlen(s) - 1 );
+ pt->namelen = strlen(s);
+ memcpy(pt->name, s, pt->namelen );
+ m_free(s);
+ }
+ else { /* no filename */
+ pt = m_alloc( sizeof *pt - 1 );
+ pt->namelen = 0;
+ }
}
+
/* pgp5 has problems to decrypt symmetrically encrypted data from
* GnuPG if the filelength is in the inner packet. It works
* when only partial length headers are use. Until we have
@@ -167,14 +171,19 @@ encode_simple( const char *filename, int mode )
log_info(_("%s: WARNING: empty file\n"), filename );
}
else
- filesize = 0; /* stdin */
- pt->timestamp = make_timestamp();
- pt->mode = opt.textmode? 't' : 'b';
- pt->len = filesize;
- pt->buf = inp;
- pkt.pkttype = PKT_PLAINTEXT;
- pkt.pkt.plaintext = pt;
- cfx.datalen = filesize && !do_compress ? calc_packet_length( &pkt ) : 0;
+ filesize = opt.set_filesize ? opt.set_filesize : 0; /* stdin */
+
+ if (!opt.no_literal) {
+ pt->timestamp = make_timestamp();
+ pt->mode = opt.textmode? 't' : 'b';
+ pt->len = filesize;
+ pt->buf = inp;
+ pkt.pkttype = PKT_PLAINTEXT;
+ pkt.pkt.plaintext = pt;
+ cfx.datalen = filesize && !do_compress ? calc_packet_length( &pkt ) : 0;
+ }
+ else
+ cfx.datalen = filesize && !do_compress ? filesize : 0;
/* register the cipher filter */
if( mode )
@@ -184,13 +193,32 @@ encode_simple( const char *filename, int mode )
iobuf_push_filter( out, compress_filter, &zfx );
/* do the work */
- if( (rc = build_packet( out, &pkt )) )
- log_error("build_packet failed: %s\n", g10_errstr(rc) );
+ if (!opt.no_literal) {
+ if( (rc = build_packet( out, &pkt )) )
+ log_error("build_packet failed: %s\n", g10_errstr(rc) );
+ }
+ else {
+ /* user requested not to create a literal packet,
+ * so we copy the plain data */
+ byte copy_buffer[4096];
+ int bytes_copied;
+ while ((bytes_copied = iobuf_read(inp, copy_buffer, 4096)) != -1)
+ if (iobuf_write(out, copy_buffer, bytes_copied) == -1) {
+ rc = G10ERR_WRITE_FILE;
+ log_error("copying input to output failed: %s\n", g10_errstr(rc) );
+ break;
+ }
+ memset(copy_buffer, 0, 4096); /* burn buffer */
+ }
/* finish the stuff */
iobuf_close(inp);
- iobuf_close(out); /* fixme: check returncode */
- pt->buf = NULL;
+ if (rc)
+ iobuf_cancel(out);
+ else
+ iobuf_close(out); /* fixme: check returncode */
+ if (pt)
+ pt->buf = NULL;
free_packet(&pkt);
m_free(cfx.dek);
m_free(s2k);
@@ -270,35 +298,43 @@ encode_crypt( const char *filename, STRLIST remusr )
if( rc )
goto leave;
- /* setup the inner packet */
- if( filename || opt.set_filename ) {
- char *s = make_basename( opt.set_filename ? opt.set_filename : filename );
- pt = m_alloc( sizeof *pt + strlen(s) - 1 );
- pt->namelen = strlen(s);
- memcpy(pt->name, s, pt->namelen );
- m_free(s);
- }
- else { /* no filename */
- pt = m_alloc( sizeof *pt - 1 );
- pt->namelen = 0;
- }
+ if (!opt.no_literal)
+ /* setup the inner packet */
+ if( filename || opt.set_filename ) {
+ char *s = make_basename( opt.set_filename ? opt.set_filename : filename );
+ pt = m_alloc( sizeof *pt + strlen(s) - 1 );
+ pt->namelen = strlen(s);
+ memcpy(pt->name, s, pt->namelen );
+ m_free(s);
+ }
+ else { /* no filename */
+ pt = m_alloc( sizeof *pt - 1 );
+ pt->namelen = 0;
+ }
+
if( filename && !opt.textmode ) {
if( !(filesize = iobuf_get_filelength(inp)) )
log_info(_("%s: WARNING: empty file\n"), filename );
}
else
- filesize = 0; /* stdin */
- pt->timestamp = make_timestamp();
- pt->mode = opt.textmode ? 't' : 'b';
- pt->len = filesize;
- pt->new_ctb = !pt->len && !opt.rfc1991;
- pt->buf = inp;
- pkt.pkttype = PKT_PLAINTEXT;
- pkt.pkt.plaintext = pt;
- cfx.datalen = filesize && !do_compress? calc_packet_length( &pkt ) : 0;
+ filesize = opt.set_filesize ? opt.set_filesize : 0; /* stdin */
+
+ if (!opt.no_literal) {
+ pt->timestamp = make_timestamp();
+ pt->mode = opt.textmode ? 't' : 'b';
+ pt->len = filesize;
+ pt->new_ctb = !pt->len && !opt.rfc1991;
+ pt->buf = inp;
+ pkt.pkttype = PKT_PLAINTEXT;
+ pkt.pkt.plaintext = pt;
+ cfx.datalen = filesize && !do_compress? calc_packet_length( &pkt ) : 0;
+ }
+ else
+ cfx.datalen = filesize && !do_compress ? filesize : 0;
/* register the cipher filter */
iobuf_push_filter( out, cipher_filter, &cfx );
+
/* register the compress filter */
if( do_compress ) {
int compr_algo = select_algo_from_prefs( pk_list, PREFTYPE_COMPR );
@@ -312,8 +348,22 @@ encode_crypt( const char *filename, STRLIST remusr )
}
/* do the work */
- if( (rc = build_packet( out, &pkt )) )
- log_error("build_packet failed: %s\n", g10_errstr(rc) );
+ if (!opt.no_literal) {
+ if( (rc = build_packet( out, &pkt )) )
+ log_error("build_packet failed: %s\n", g10_errstr(rc) );
+ }
+ else {
+ /* user requested not to create a literal packet, so we copy the plain data */
+ byte copy_buffer[4096];
+ int bytes_copied;
+ while ((bytes_copied = iobuf_read(inp, copy_buffer, 4096)) != -1)
+ if (iobuf_write(out, copy_buffer, bytes_copied) == -1) {
+ rc = G10ERR_WRITE_FILE;
+ log_error("copying input to output failed: %s\n", g10_errstr(rc) );
+ break;
+ }
+ memset(copy_buffer, 0, 4096); /* burn buffer */
+ }
/* finish the stuff */
leave: