AIX calling WINSOCK during e-mail - normal?


 
Thread Tools Search this Thread
Top Forums Programming AIX calling WINSOCK during e-mail - normal?
# 36  
Old 01-24-2011
Try putting fprintf(stderr, "debug statements\n"); inside that function so you can tell at what points its still running.
This User Gave Thanks to Corona688 For This Post:
# 37  
Old 01-24-2011
Ok so here's what happens.

It goes here:
Code:
int get_smtp_line( void )
{
   char ch = '.';
   char in_data [MAXOUTLINE];
   char * index;
   int retval = 0;

   index = in_data;

   cout << "Before while...\n";
   while (ch != '\n')
   {
      if ( (retval = gensock_getchar (SMTPSock, 0, &ch) ) ) // <- see below
      {
          cout << "In if...\n";
         gensock_error ("gensock_getchar", retval);
         return -1;
      }
      else
      {
         cout << "In else...\n";
         cout << "index:  " << *index << endl ;
         *index = ch;
         index++;
      }
   }


   cout << "returning\n";
   return atoi(in_data);
}

then to here:
Code:
int gensock_getchar (int st, int wait, char * ch)
{
   int retval = 0;
   connection *conn;

   conn = (connection *)st;

   if ((retval = conn->cc_getchar(wait, ch)))  // <- see below
      return (retval);
   else
      return (0);
}

Then to here:

Code:
int
connection::cc_getchar(int wait, char * ch)
{
   int retval;

   if (in_index >= in_buffer_total)
   {
      if ((retval = get_buffer(wait)))  // <- see below
         return (retval);
   }
   *ch = in_buffer[in_index++];
   return (0);
}

Then to here:

Code:
int
connection::get_buffer(int wait)
{
   int retval;
   int bytes_read = 0;
   unsigned long ready_to_read = 0;

   // Use select to see if data is waiting...

   FD_ZERO (&fds);    // <-- CRASHES HERE
   FD_SET (the_socket, &fds);

   // if wait is set, we are polling, return immediately
   if (wait)
   {
      timeout.tv_sec = 0;
   }
   else
   {
      timeout.tv_sec = 0;
   }
#ifdef HA
   if ((retval = select (0, &fds, NULL, NULL, &timeout))
         == SOCKET_ERROR)
   {
      //printf ( "connection::get_buffer() unexpected error from select\n");
   }

   // if we don't want to wait


   if (!retval && wait)
   {
      return (WAIT_A_BIT);
   }
#endif
   // we have data waiting...
   bytes_read = recv (the_socket,
                      in_buffer,
                      SOCKET_BUFFER_SIZE,
                      0);

   // just in case.

   if (bytes_read == 0)
   {
      // connection terminated (semi-) gracefully by the other side
      return (ERR_NOT_CONNECTED);
   }

   if (bytes_read == SOCKET_ERROR)
   {
      //printf ("connection::get_buffer() unexpected error\n");

   }

   // reset buffer indices.


   in_buffer_total = bytes_read;
   in_index = 0;
   return (0);

}

At which point it crashes. Still determining if it's the first iteration or not.

---------- Post updated at 05:00 PM ---------- Previous update was at 04:57 PM ----------

edited*

---------- Post updated at 05:02 PM ---------- Previous update was at 05:00 PM ----------

Edited again to show crash spot in last method.

---------- Post updated at 05:05 PM ---------- Previous update was at 05:02 PM ----------

Hey wait a sec... should I be initializing a new connection that many times? Or just one connection somewhere? I bet that has something to do with it.
# 38  
Old 01-24-2011
That is a very bizzare place for it to crash... for it to crash there, just doing FD_ZERO, means the object itself may have ended up an invalid pointer somehow.

Yes, you shouldn't be making a new object every time you write...
This User Gave Thanks to Corona688 For This Post:
# 39  
Old 01-25-2011
Ok I've ran into a bit of a snag. I'm trying to do something similar to this:

Code:
typedef void * socktag

int gensock_connect (char * hostname,
                     char * service,
                     socktag * pst)
{

   int retval;

   connection * conn = new connection;

   if ((retval = conn->get_connected (hostname, service)))
   {
      gensock_close(0);
      *pst = 0;
      return (0);
   }
   *pst = conn;

   return (retval);
}

But *pst never gets assigned the address of conn - it stays 0. But it does hit that line.
# 40  
Old 01-25-2011
[edit] third time's the charm. Gah. What is the value of pst? What does it point to?
This User Gave Thanks to Corona688 For This Post:
# 41  
Old 01-25-2011
pst is 0 when it enters. Maybe this will provide more insight into what I'm trying to do:
Code:
int gensock_getchar (int st, int wait, char * ch)
{
   int retval = 0;
   connection *conn;

   conn = (connection *)st;

   if ((retval = conn->cc_getchar(wait, ch)))
      return (retval);
   else
      return (0);
}

So that gets called after the call to gensock_connect, above.

Edit: Oh, I should mention: st = pst
Edit2: I didn't answer both of your questions. pst points to some memory address - *pst is 0

Last edited by ctote; 01-25-2011 at 04:08 PM..
# 42  
Old 01-25-2011
On many platforms, sizeof(void *) > sizeof(int). These will chop that pointer in half and cram the remnants into your function through the mail slot when you pass as int.

This won't crash immediately but will cause mysterious problems and crashes later when you try and use it, since the class pointer will be wrong -- if the garbled pointer happens to point to valid memory, it'll probably be apparent garbage, and if it's not not valid memory, it'll crash the first time you read or write a member variable. Which I think may be what's actually happening. It'd explain the bizarre crash you had inside FD_ZERO.

Instead of int, the ptrdiff_t should be guaranteed safe. It requires <stddef.h>. 'long int' might work but will probably do weird things when you try and port it again.

Last edited by Corona688; 01-25-2011 at 04:37 PM..
This User Gave Thanks to Corona688 For This Post:
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. AIX

Unable to set ACLs on sulog - need to grant read permission to a normal user on AIX 6.1

Hi, I need to grant read permission to a normal user on sulog file on AIX 6.1. As root I did acledit sulog and aclget shows "extended permissions" as "enabled" and normal user "splunk" has read permissions. When I try to access sulog as splunk user it won't allow and aclget for splunk user... (6 Replies)
Discussion started by: prvnrk
6 Replies

2. Shell Programming and Scripting

AIX : Need to convert UNIX Timestamp to normal timestamp

Hello , I am working on AIX. I have to convert Unix timestamp to normal timestamp. Below is the file. The Unix timestamp will always be preceded by EFFECTIVE_TIME as first field as shown and there could be multiple EFFECTIVE_TIME in the file : 3.txt Contents of... (6 Replies)
Discussion started by: rahul2662
6 Replies

3. Shell Programming and Scripting

Send mail from AIX 7.1

Hi, My OS version is AIX 7.1. I am trying to send an email with a file to my mail address. sendmail or uuencode does not work. Can someone give me the correct format ? I use: uuencode <file name> | mail -s "subject" emailaddress Thanks Use code tags, thanks. (3 Replies)
Discussion started by: Nagesh_1985
3 Replies

4. Shell Programming and Scripting

AIX mail notification

plzzz help me, I want to send emails for exchange group members when the used file-system % gets more than 90%, this notification must include df -g, netstat -i,and errpt with the hostname thx in advance (0 Replies)
Discussion started by: majd_ece
0 Replies

5. Shell Programming and Scripting

Calling SQL script from ksh job and send mail on some error.

Hi, I am trying to call sql script from ksh job with parameters.The parameters passed from ksh job will be used in SELECT query in sql file to SPOOL the data in extract file.My questions are: 1) How to call a sql script from ksh job with parameters? 2) How to use the parameter in sql file to... (1 Reply)
Discussion started by: anil029
1 Replies

6. UNIX for Advanced & Expert Users

Oracle (11gr2) calling unix commands (aix)

I have an Oracle database running on AIX, and I have a procedure that is calling OS commands from an oracle (and it's not working anymore)... so, there was an Java stored proc in Oracle CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED COMMON."Host" as import java.io.*; public class Host {... (1 Reply)
Discussion started by: bongo
1 Replies

7. UNIX for Dummies Questions & Answers

Forwarding Mail in AIX 5.3

Hello everyone, I am trying to create a forwarding scenario, and I do not seem to get it right! I created a .forward file in the directory where my personal mailbox resides. In the file is the full address to deliver email to ... yet the emails do not seem to get forwarded. Is there something... (3 Replies)
Discussion started by: gio001
3 Replies

8. AIX

Normal User Unable to Login Through AIX CDE

When we as normal user try to login, the session startup terminates and we are presented with the login screen.The root user is able to login without any problem.I can log in to the Aix server as normal user through telnet & using xmanager but not directly through server terminal .The Aix version... (1 Reply)
Discussion started by: ranadeep
1 Replies

9. AIX

To find RAM Size in AIX as normal user?

Hi, Am jus trying to find the Total RAM Size of a AIX m/c (in MB)..svmon works perfectly for a superuser...But i want to achive this as a normal user...Please help me out with correct command.. Best Regards, Muthukumaran.M (3 Replies)
Discussion started by: muthukumaran13
3 Replies

10. AIX

Calling All Aix Experts

I am new to the world of AIX. I want to get certified in AIX and learn it but fast. with in 3 months Could you give me some advise of a good site that with teach you or a bootcamp that is reasonable. I am really in need I am in atlanta (0 Replies)
Discussion started by: Courtney3216
0 Replies
Login or Register to Ask a Question