libclamav/blob.h
e3aaff8e
 /*
e1cbc270
  *  Copyright (C) 2013-2019 Cisco Systems, Inc. and/or its affiliates. All rights reserved.
  *  Copyright (C) 2007-2013 Sourcefire, Inc.
2023340a
  *
  *  Authors: Nigel Horne
e3aaff8e
  *
  *  This program is free software; you can redistribute it and/or modify
2023340a
  *  it under the terms of the GNU General Public License version 2 as
  *  published by the Free Software Foundation.
e3aaff8e
  *
  *  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
48b7b4a7
  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
  *  MA 02110-1301, USA.
e3aaff8e
  */
 
0e5a0129
 #ifndef __BLOB_H
 #define __BLOB_H
 
 /*
  * Resizable chunk of memory
  */
e3aaff8e
 typedef struct blob {
288057e9
     char *name;          /* filename */
     unsigned char *data; /* the stuff itself */
     off_t len;           /* number of bytes of data so far */
     off_t size;          /* number of bytes allocated to data so far */
     int isClosed;
 #ifdef CL_DEBUG
     object_type magic; /* verify that this is a blob */
e3aaff8e
 #endif
 } blob;
 
288057e9
 blob *blobCreate(void);
 void blobDestroy(blob *b);
 void blobArrayDestroy(blob *b[], int n);
 void *blobToMem(blob *b);
 void blobSetFilename(blob *b, const char *dir, const char *filename);
 int blobAddData(blob *b, const unsigned char *data, size_t len);
2a4b5c6e
 unsigned char *blobGetData(const blob *b);
288057e9
 size_t blobGetDataSize(const blob *b);
 void blobClose(blob *b);
 int blobcmp(const blob *b1, const blob *b2);
 int blobGrow(blob *b, size_t len);
0e5a0129
 
 /*
ea49b0fc
  * Like a blob, but associated with a file stored in the temporary directory
0e5a0129
  */
288057e9
 typedef struct fileblob {
     FILE *fp;
     int fd;
     blob b;         /*
ea49b0fc
 			 * b.name is the name of the attachment as stored in the
 			 * email, not the full path name of the temporary file
 			 */
288057e9
     char *fullname; /* full pathname of the file */
     cli_ctx *ctx;   /* When set we can scan the blob, otherwise NULL */
     unsigned long bytes_scanned;
     unsigned int isNotEmpty : 1;
     unsigned int isInfected : 1;
0e5a0129
 } fileblob;
 
288057e9
 fileblob *fileblobCreate(void);
 int fileblobScanAndDestroy(fileblob *fb);
 void fileblobDestructiveDestroy(fileblob *fb);
 void fileblobDestroy(fileblob *fb);
 void fileblobSetFilename(fileblob *fb, const char *dir, const char *filename);
 void fileblobPartialSet(fileblob *fb, const char *fullname, const char *arg);
 const char *fileblobGetFilename(const fileblob *fb);
 void fileblobSetCTX(fileblob *fb, cli_ctx *ctx);
 int fileblobAddData(fileblob *fb, const unsigned char *data, size_t len);
 int fileblobScan(const fileblob *fb);
 int fileblobInfected(const fileblob *fb);
 void sanitiseName(char *name);
0e5a0129
 
 #endif /*_BLOB_H*/