595{
596 int status, sock, i,
n, header_length, content_length, index;
597 char host_name[256], boundary[80], str[80], encrypted_passwd[256], *p;
598 const char* old_encoding;
600 struct hostent *phe;
601#ifdef HAVE_SSL
602 SSL *ssl_con = NULL;
603#endif
604
605
606 gethostname(host_name, sizeof(host_name));
607
608 phe = gethostbyname(host_name);
609 if (phe == NULL) {
610 perror("Cannot retrieve host name");
611 return -1;
612 }
613 phe = gethostbyaddr(phe->h_addr, sizeof(int), AF_INET);
614 if (phe == NULL) {
615 perror("Cannot retrieve host name");
616 return -1;
617 }
618
619
620 if (strchr(host_name, '.') == NULL)
621 strcpy(host_name, phe->h_name);
622
623 if (edit || download) {
624 if (edit)
625 status =
retrieve_elog(host, port, subdir, ssl, experiment, uname, upwd, edit,
626 old_attrib_name, old_attrib,
old_text);
627 else
628 status =
retrieve_elog(host, port, subdir, ssl, experiment, uname, upwd, download,
629 old_attrib_name, old_attrib,
old_text);
630
631 if (status != 1)
632 return status;
633
634
635 for (index = 0; index < n_attr; index++) {
636 for (i = 0; i <
MAX_N_ATTR && old_attrib_name[i][0]; i++)
638 break;
639
640 if (old_attrib_name[i][0])
642 }
643
644
645 for (i = 0; i <
MAX_N_ATTR && old_attrib_name[i][0]; i++) {
648 }
649
650 n_attr = i;
651
654 }
655
656 if (download) {
658 printf(
"%s", strstr(
response,
"$@MID@$:"));
659 else
661 return 1;
662 }
663
664 if (reply) {
665 status =
666 retrieve_elog(host, port, subdir, ssl, experiment, uname, upwd, reply,
667 old_attrib_name, old_attrib,
old_text);
668
669 if (status != 1)
670 return status;
671
672
673 for (index = 0; index < n_attr; index++) {
674 for (i = 0; i <
MAX_N_ATTR && old_attrib_name[i][0]; i++)
676 break;
677
678 if (old_attrib_name[i][0])
680 }
681
682
683 for (i = 0; i <
MAX_N_ATTR && old_attrib_name[i][0]; i++) {
685 attrib_name[i][0] = 0;
686 attrib[i][0] = 0;
687 } else {
690 }
691 }
692
693 n_attr = i;
694
695
696 old_encoding = "plain";
697
698 for (i = 0; i < n_attr; i++)
700 break;
701
702 if (i < n_attr)
703 old_encoding = attrib[i];
704
705 if (quote_on_reply) {
707
708
711
712 do {
713 if (strchr(p, '\n')) {
714 *strchr(p, '\n') = 0;
715
716 if (old_encoding[0] == 'H') {
720 } else {
724 }
725
726 p += strlen(p) + 1;
727 if (*p == '\n')
728 p++;
729 } else {
730 if (old_encoding[0] == 'H') {
734 } else {
738 }
739
740 break;
741 }
742
743 } while (1);
744
746 }
747 }
748
750 if (sock < 0)
751 return sock;
752
753#ifdef HAVE_SSL
754 if (ssl)
755 if (ssl_connect(sock, &ssl_con) < 0) {
756 printf("elogd server does not run SSL protocol\n");
757 return -1;
758 }
759#endif
760
761 content_length = 100000;
763 if (afilename[i][0])
765 content = (
char *)malloc(content_length);
767 printf("Not enough memory\n");
768 return -1;
769 }
770
771
772 srand((unsigned) time(NULL));
773 sprintf(boundary, "---------------------------%04X%04X%04X", rand(), rand(), rand());
775 strcat(
content,
"\r\nContent-Disposition: form-data; name=\"cmd\"\r\n\r\nSubmit\r\n");
776
777 if (uname[0])
779 "%s\r\nContent-Disposition: form-data; name=\"unm\"\r\n\r\n%s\r\n", boundary, uname);
780
781 if (upwd[0]) {
782 do_crypt(upwd, encrypted_passwd,
sizeof(encrypted_passwd));
784 "%s\r\nContent-Disposition: form-data; name=\"upwd\"\r\n\r\n%s\r\n", boundary,
785 encrypted_passwd);
786 }
787
788 if (experiment[0])
790 "%s\r\nContent-Disposition: form-data; name=\"exp\"\r\n\r\n%s\r\n", boundary, experiment);
791
792 if (reply)
794 "%s\r\nContent-Disposition: form-data; name=\"reply_to\"\r\n\r\n%d\r\n", boundary, reply);
795
796 if (edit) {
798 "%s\r\nContent-Disposition: form-data; name=\"edit_id\"\r\n\r\n%d\r\n", boundary, edit);
800 "%s\r\nContent-Disposition: form-data; name=\"skiplock\"\r\n\r\n1\r\n", boundary);
801 }
802
803 if (suppress)
805 "%s\r\nContent-Disposition: form-data; name=\"suppress\"\r\n\r\n1\r\n", boundary);
806
807 if (encoding == 0)
809 "%s\r\nContent-Disposition: form-data; name=\"encoding\"\r\n\r\nELCode\r\n", boundary);
810 else if (encoding == 1)
812 "%s\r\nContent-Disposition: form-data; name=\"encoding\"\r\n\r\nplain\r\n", boundary);
813 else if (encoding == 2)
815 "%s\r\nContent-Disposition: form-data; name=\"encoding\"\r\n\r\nHTML\r\n", boundary);
816
817 for (i = 0; i < n_attr; i++) {
818 strcpy(str, attrib_name[i]);
819 if (str[0]) {
822 "%s\r\nContent-Disposition: form-data; name=\"%s\"\r\n\r\n%s\r\n", boundary, str, attrib[i]);
823 }
824 }
825
828 "%s\r\nContent-Disposition: form-data; name=\"Text\"\r\n\r\n%s\r\n%s\r\n",
829 boundary,
text, boundary);
830
831 content_length = strlen(
content);
833
835 if (afilename[i][0]) {
836 sprintf(p,
837 "Content-Disposition: form-data; name=\"attfile%d\"; filename=\"%s\"\r\n\r\n",
838 i + 1, afilename[i]);
839
840 content_length += strlen(p);
841 p += strlen(p);
844 strcpy(p, boundary);
845 strcat(p, "\r\n");
846
848 p += strlen(p);
849 }
850
851
853 if (subdir[0])
855 if (experiment[0]) {
856 strcpy(str, experiment);
859 }
860 strcat(
request,
" HTTP/1.0\r\n");
861
862 sprintf(
request + strlen(
request),
"Content-Type: multipart/form-data; boundary=%s\r\n", boundary);
863 if (port != 80)
864 sprintf(str, "%s:%d", host, port);
865 else
866 sprintf(str, "%s", host);
869 sprintf(
request + strlen(
request),
"Content-Length: %d\r\n", content_length);
870
872
873 header_length = strlen(
request);
874
875
876
877
878
879
880
881
882
883
884
885#ifdef HAVE_SSL
886 if (ssl)
887 SSL_write(ssl_con,
request, header_length);
888 else
889#endif
890 send(sock,
request, header_length, 0);
892 printf("Request sent to host:\n");
894 }
895
896
897#ifdef HAVE_SSL
898 if (ssl)
899 SSL_write(ssl_con,
content, content_length);
900 else
901#endif
902 send(sock,
content, content_length, 0);
904 printf("Content sent to host:\n");
906 }
907
908
910#ifdef HAVE_SSL
911 if (ssl)
913 else
914#endif
916 if (i < 0) {
917 perror("Cannot receive response");
918 return -1;
919 }
920
921
923 while (i > 0) {
924#ifdef HAVE_SSL
925 if (ssl)
927 else
928#endif
930 if (i > 0)
932 }
934
935#ifdef HAVE_SSL
936 if (ssl) {
937 SSL_shutdown(ssl_con);
938 SSL_free(ssl_con);
939 }
940#endif
941
943
945 printf("Response received:\n");
947 }
948
949
950 if (strstr(
response,
"302 Found")) {
951 if (strstr(
response,
"Location:")) {
953 printf("Error: elogd server has moved to another location\n");
955 printf("Error: Invalid user name or password\n");
956 else {
957 strncpy(str, strstr(
response,
"Location:") + 10,
sizeof(str));
958 if (strchr(str, '?'))
959 *strchr(str, '?') = 0;
960 if (strchr(str, '\n'))
961 *strchr(str, '\n') = 0;
962 if (strchr(str, '\r'))
963 *strchr(str, '\r') = 0;
964
965 if (strrchr(str, '/'))
966 printf("Message successfully transmitted, ID=%s\n", strrchr(str, '/') + 1);
967 else
968 printf("Message successfully transmitted, ID=%s\n", str);
969 }
970 } else
971 printf("Message successfully transmitted\n");
972 }
else if (strstr(
response,
"Logbook Selection"))
973 printf("Error: No logbook specified\n");
974 else if (strstr(
response,
"enter password"))
975 printf("Error: Missing or invalid password\n");
976 else if (strstr(
response,
"Error: Attribute")) {
977 if (strstr(
response,
"not existing")) {
978 strncpy(str, strstr(
response,
"Error: Attribute") + 27,
sizeof(str));
979 if (strchr(str, '<'))
980 *strchr(str, '<') = 0;
981 printf("Error: Non existing attribute option \"%s\"\n", str);
982 } else {
983 strncpy(str, strstr(
response,
"Error: Attribute") + 20,
sizeof(str));
984 if (strchr(str, '<'))
985 *strchr(str, '<') = 0;
986 printf("Error: Missing required attribute \"%s\"\n", str);
987 }
988 }
989 else if (strstr(
response,
"form name=form1"))
990 printf("Error: Missing or invalid user name/password\n");
991 else
992 printf("Error transmitting message\n");
993
994 return 1;
995}
static const size_t buffer_size
INT retrieve_elog(char *host, int port, char *subdir, int ssl, char *experiment, char *uname, char *upwd, int message_id, char attrib_name[MAX_N_ATTR][NAME_LENGTH], char attrib[MAX_N_ATTR][NAME_LENGTH], char *text)
int equal_ustring(const char *str1, const char *str2)
size_t strlcat(char *dst, const char *src, size_t size)