LinuxQuestions.org
Review your favorite Linux distribution.
Go Back   LinuxQuestions.org > Forums > Non-*NIX Forums > Programming
User Name
Password
Programming This forum is for all programming questions.
The question does not have to be directly related to Linux and any language is fair game.

Notices


Reply
  Search this Thread
Old 03-09-2009, 11:06 AM   #1
pstevens57
LQ Newbie
 
Registered: Mar 2009
Posts: 2

Rep: Reputation: 0
error: invalid conversion from `void*' to `char*'


New to C/C++ programming. I am compiling courier-0.61.1 on Solaris 9 x86 box using g++. Since there is no setenv for Solaris I found code to
use mysetenv and putenv as an alternative. My problem is when I run make I get the above error message. The file where I inserted the code is webmlmdcmlm.C. See attached.


/*
** $Id: webmlmdcmlm.C,v 1.5 2008/05/18 00:20:00 mrsam Exp $
**
** Copyright 2007 Double Precision, Inc.
** See COPYING for distribution information.
*/
#include "config.h"
#include "webmlmd.H"
#include "webmlmdcmlm.H"
#include <sstream>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#if HAVE_UNISTD_H
#include <unistd.h>
#endif
#include <signal.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#if HAVE_FCNTL_H
#include <fcntl.h>
#endif
#include "bindir.h"
#include "rfc822/rfc822.h"

#if HAVE_SETENV
#else
static void mysetenv (const char *name, const char *value, int overwrite)
{
int length = strlen(name) + strlen(value) + 2;
char *buffer = malloc(length);
if (buffer == 0)
{
perror("malloc");
exit(1);
}
if (!overwrite && getenv(name)) return;
snprintf (buffer, length, "%s=%s", name, value);
putenv(buffer);
free(buffer);
}
#endif

using namespace webmlmd;

cmlm::filep::filep() : fp(NULL)
{
}

cmlm::filep::~filep()
{
close();
}

void cmlm::filep::close()
{
if (fp)
fclose(fp);
fp=NULL;
}

cmlm::cmlm() : pid(-1)
{
}

cmlm::~cmlm()
{
}

bool cmlm::start(std::string extension,
std::string sender,
std::string command,
const std::vector<std::string> &args)

{
int pipefd[2];

stdout_filep.close();
if ((stdout_filep.fp=tmpfile()) == NULL)
return false;

if (pipe(pipefd) < 0)
{
return false;
}

pid=fork();

if (pid < 0)
{
close(pipefd[0]);
close(pipefd[1]);
return false;
}

if (pid == 0)
{
if (dup2(pipefd[0], 0) < 0)
{
exit(1);
}

if (dup2(fileno(stdout_filep.fp), 1) < 0 || dup2(1, 2) < 0)
{
exit(1);
}
stdout_filep.close();
fcntl(1, F_SETFD, 0);

close(pipefd[0]);
close(pipefd[1]);


#if HAVE_SETENV
setenv("DEFAULT", extension.c_str(), 1);
setenv("SENDER", sender.c_str(), 1);
#else
mysetenv("DEFAULT", extension.c_str(), 1);
mysetenv("SENDER", sender.c_str(), 1);
#endif

std::vector< std::vector<char> > argv_buf;

{
std::vector<char> v;

v.insert(v.end(), command.begin(), command.end() );
v.push_back(0);

argv_buf.push_back(v);
}

// Second arg to couriermlm is list directory, always "."

{
std::vector<char> v;

v.push_back('.');
v.push_back(0);

argv_buf.push_back(v);
}

std::vector<std::string>::const_iterator ab=args.begin(),
ae=args.end();

while (ab != ae)
{
std::vector<char> v;

v.insert(v.end(), ab->begin(), ab->end());
v.push_back(0);

argv_buf.push_back(v);
++ab;
}

std::vector<const char *> argv;

argv.push_back(BINDIR "/couriermlm");

std::vector< std::vector<char> >::iterator vb=argv_buf.begin(),
ve=argv_buf.end();

while (vb != ve)
{
argv.push_back( & (*vb)[0] );
++vb;
}

argv.push_back(NULL);

execv(argv[0], (char **)&argv[0]);
perror(argv[0]);
exit(1);
}

close(pipefd[0]);

signal(SIGPIPE, SIG_IGN);
stdin_filep.close();
stdin_filep.fp=fdopen(pipefd[1], "w");
return true;
}

bool cmlm::wait()
{
int waitstat;
pid_t p;

stdin_filep.close();

while ((p= ::wait(&waitstat)) != pid)
{
if (p == -1)
{
if (errno == EINTR)
continue;
fseek(stdout_filep.fp, 0L, SEEK_END);
fseek(stdout_filep.fp, 0L, SEEK_SET);
return false;
}
}

fseek(stdout_filep.fp, 0L, SEEK_END);
fseek(stdout_filep.fp, 0L, SEEK_SET);

return waitstat == 0;
}

void cmlm::mk_received_header()
{
char buf[100];
const char *ip=getenv("REMOTE_ADDR");

rfc822_mkdate_buf(time(NULL), buf);

fprintf(stdin_filep.fp, "Received: from ([%s]) via http; %s\n",
ip ? ip:"(unknown)", buf);
}

std::string cmlm::format_error_message()
{
std::string errmsg;

if (!stdout_filep.fp)
errmsg=strerror(errno);
else
{
char buf[BUFSIZ];

std:stringstream o;

while (fgets(buf, sizeof(buf), stdout_filep.fp) != NULL)
o << webmlmd::html_escape(std::string(buf));
errmsg=o.str();
}

if (errmsg == "")
{
errmsg="An error has occured while processing this command\n"
"No further information is available\n";
}

return "<blockquote class='error'><pre>" + errmsg + "</pre></blockquote>";
}
 
Old 03-09-2009, 11:29 AM   #2
johnsfine
LQ Guru
 
Registered: Dec 2007
Distribution: Centos
Posts: 5,286

Rep: Reputation: 1190Reputation: 1190Reputation: 1190Reputation: 1190Reputation: 1190Reputation: 1190Reputation: 1190Reputation: 1190Reputation: 1190
Try changing
Code:
char *buffer = malloc(length);
to
Code:
char *buffer = (char*)malloc(length);
Next time you ask for help (or this time if the above suggestion doesn't fix it) try to post an easier to read question.

1) Use code tags around the code to make it more readable.

2) Do something to identify the line for which you got the error message. The compiler gave you a line number. You should take the time to find that line in a text editor so you can tell us in a meaningful way which line it is in the code you quote.

3) Try to quote less code for a simple error like this. That's always a tricky judgment call. People often quote too little code. But in this case, the function containing the error should have been enough.
 
Old 03-10-2009, 02:57 PM   #3
pstevens57
LQ Newbie
 
Registered: Mar 2009
Posts: 2

Original Poster
Rep: Reputation: 0
Thanks so much for you help. Sorry for not pointing out file error and line code.
 
  


Reply


Thread Tools Search this Thread
Search this Thread:

Advanced Search

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off



Similar Threads
Thread Thread Starter Forum Replies Last Post
Problems with "error: invalid conversion from `const char*' to `char*' " dave.f.one Linux - Newbie 11 02-11-2015 08:17 AM
getting error: invalid conversion from ‘const char*’ to ‘int’ while compling paulie1 Programming 14 02-25-2009 03:50 PM
C++ atoi error: invalid conversion from `int' to `const char*' bakana Programming 2 02-24-2009 04:29 AM
error: invalid conversion from `void*' to `char**', where should I start to look for RHLinuxGUY Programming 4 05-20-2006 09:53 PM
If I get invalid conversion from `const char*' to `char' what should I be lookin for? RHLinuxGUY Programming 5 03-12-2006 11:35 PM

LinuxQuestions.org > Forums > Non-*NIX Forums > Programming

All times are GMT -5. The time now is 07:50 AM.

Main Menu
Advertisement
My LQ
Write for LQ
LinuxQuestions.org is looking for people interested in writing Editorials, Articles, Reviews, and more. If you'd like to contribute content, let us know.
Main Menu
Syndicate
RSS1  Latest Threads
RSS1  LQ News
Twitter: @linuxquestions
Facebook: linuxquestions Google+: linuxquestions
Open Source Consulting | Domain Registration