#include #include #include #include #include #include #include #include extern int errno; /* Erori ale apelurilor sistem */ #define PORT_CONSTATARE 2222 #define PORT_INTERVENTIE 3333 #define MAX 255 /* Lungimi maxime la siruri */ #define ERR(S,N) {fprintf(stderr,"%d ",N);perror(S);exit(N);} #define MES(S,N) {fprintf(stderr,"\n %s %d\n",S,N);} int Send (s, t, n) int s; /* Emite pe socketul s, de la adresa t, un numar de */ char *t;/* n caractere. Emisia se face pe portiuni daca */ int n; /* apelul sistem send nu poate trimite totul odata */ { int c; for (; n > 0;) { c = send (s, t, n, 0); if (c < 0) return (-1); n -= c; t += c; } /* for */ return (0); } /* Send */ int Recv (s, t, n) int s; /* Receptioneaza de pe socketul s, de la adresa t, */ char *t;/* un numar de n caractere. Receptia se face pe */ int n; /* portiuni daca receive nu primeste totul odata */ { int c; for (; n > 0;) { c = recv (s, t, n, 0); if (c <= 0) return (-1); n -= c; t += c; } /* for */ return (0); } /* Recv */ union M { short I[4]; /* Minimum 4 intregi */ char S[1]; /* Minimum 1 string */ }; typedef union M Mesaj; Mesaj * Alloc (LT) /* Intoarce un pointer la o zona */ int LT; /* de LT octeti */ { Mesaj *p; if (LT < 4 * sizeof (short)) { MES ("Alloc", 1); return (NULL); } p = (Mesaj *) malloc (LT); if (p == NULL) { MES ("Alloc", 2); return (NULL); } memset (p, 0, LT); *((short *) p) = htons ((short) LT); return (p); } int Delete (m) /* Sterge mesajul m creat prin Alloc */ Mesaj *m; { if (!Valid (m)) { MES ("Delete", 3); return (0); } free ((char *) m); return (1); } int Valid (m)/* Verifica corectitudinea structurii mesajului m */ Mesaj *m; { int LT, NI, NS, i, k; char *p; LT = ValoareI (m, 0); NI = ValoareI (m, 1); NS = ValoareI (m, 2); if ((LT < 4 * sizeof (short)) || (NI < 1) || (NS < 1)) { MES ("Valid", 4); return (0); } for (i = 0; i < NI; i++) if (ValoareI (m, i) < 0) { MES ("Valid", 5); return (0); } if (*((char *) m + LT - 1) != 0) { MES ("Valid", 6); return (0); } /* Ultima pozitie 0 */ k = 0; for (i = (NI + 3) * sizeof (short), k = 0, p = (char *) m; i < LT; i++) if (*(p + i) == 0) k++; if (k != NS) { MES ("Valid", 7); return (0); } } int AtribuireI (m, i, v)/* Pune valoarea v la intregul i din m */ Mesaj *m; int i, v; { short NI; NI = ValoareI (m, 1); if ((v < 0) || (i < 0) || (i >= 3 + NI)) { MES ("AtribuieI", 8); return (0); } (m->I[i]) = htons ((short) v); return (1); } int ValoareI (m, i) /* Intoarce valoarea intregului i din m */ Mesaj *m; int i; { short NI; NI = ntohs (m->I[1]); if ((i < 0) || (i >= 3 + NI)) { MES ("ValoareI", 9); return (-1); } return ntohs (m->I[i]); } int AtribuireS (m, i, s)/* Pune stringul s pe pozitia i din m */ Mesaj *m; char *s; int i; { int NI, NS, k; char *p; NI = ValoareI (m, 1); NS = ValoareI (m, 2); if (s == NULL) { MES ("AtribuieS", 10); return (0); } if ((i < 0) || (i >= NS)) { MES ("ValoareI", 11); return (0); } p = (char *) m + (NI + 3) * sizeof (short); for (k = 0; k < i; k++) p += strlen (p) + 1; strcpy (p, s); } char * ValoareS (m, i) /* Intoarce pointer la stringul i din m */ Mesaj *m; int i; { short NI, NS, k; char *p; NI = ValoareI (m, 1); NS = ValoareI (m, 2); if ((i < 0) || (i >= NS)) { MES ("ValoareS", 12); return (NULL); } p = (char *) m + (NI + 3) * sizeof (short); for (k = 0; k < i; k++) p += strlen (p) + 1; return (p); } /* Programul 3.18 Fisierul header watchaccess.h */