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 Key:
 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 Note:
 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: }