Actual source code: textbelt.c


  2: #include <petscwebclient.h>

  4: /*@C
  5:      PetscTextBelt - Sends an SMS to an American/Canadian phone number

  7:    Not collective, only the first process in MPI_Comm does anything

  9:    Input Parameters:
 10: +  comm - the MPI communicator
 11: .  number - the 10 digit telephone number
 12: -  message - the message

 14:    Output Parameter:
 15: .   flg - PETSC_TRUE if the text was sent

 17:    Options Database:
 18: .   -textbelt <phonenumber[,message]> - sends a message to this number when the program ends

 20:    Level: intermediate

 22:    Notes:
 23:     TextBelt is run for testing purposes only, please do not use this feature often

 25:    As of November 2016 this service does not seem to be actually transmitting the SMS, which is unfortunate since it is such a great service. Consider
 26:    registering and using PetscTellMyCell() instead. Or email us with other alternatives we might add or make a pull request.

 28:    Developer Notes:
 29:     I do not know how to make the buff[] long enough to receive the "success" string but short enough that the code does not hang
 30:        waiting for part of the message to arrive that does not exist, hence the success flg may be improperly set to false even
 31:        though the message was delivered.

 33: .seealso: PetscTellMyCell(), PetscOpenSocket(), PetscHTTPRequest()
 34: @*/
 35: PetscErrorCode PetscTextBelt(MPI_Comm comm,const char number[],const char message[],PetscBool *flg)
 36: {
 37:   size_t         nlen,mlen,blen;
 38:   PetscMPIInt    rank;

 40:   PetscStrlen(number,&nlen);
 42:   PetscStrlen(message,&mlen);
 44:   MPI_Comm_rank(comm,&rank);
 45:   if (rank == 0) {
 46:     int       sock;
 47:     char      buff[474],*body;
 48:     PetscInt  i;

 50:     PetscMalloc1(mlen+nlen+100,&body);
 51:     PetscStrcpy(body,"number=");
 52:     PetscStrcat(body,number);
 53:     PetscStrcat(body,"&");
 54:     PetscStrcat(body,"message=");
 55:     PetscStrcat(body,message);
 56:     PetscStrlen(body,&blen);
 57:     for (i=0; i<(int)blen; i++) {
 58:       if (body[i] == ' ') body[i] = '+';
 59:     }
 60:     PetscOpenSocket("textbelt.com",80,&sock);
 61:     PetscHTTPRequest("POST","textbelt.com/text",NULL,"application/x-www-form-urlencoded",body,sock,buff,sizeof(buff));
 62:     close(sock);
 63:     PetscFree(body);
 64:     if (flg) {
 65:       char *found;
 66:       PetscStrstr(buff,"\"success\":tr",&found);
 67:       *flg = found ? PETSC_TRUE : PETSC_FALSE;
 68:     }
 69:   }
 70:   return 0;
 71: }