/* * Secure X Message Passing Library v2 examples. * * (c) Originally written by somebody else ... * (c) Alexander Vdolainen 2013-2015 * * libsxmp is free software: you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * libsxmp is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see ."; * * This is a simple helpers to make code more clean; * */ #include #include #define __USE_GNU #include #include #include #include #include #include #include #include #include #include #include #include #include int openlistener_socket(int port) { int sd; struct sockaddr_in addr; sd = socket(PF_INET, SOCK_STREAM, 0); memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(port); addr.sin_addr.s_addr = INADDR_ANY; if(bind(sd, (struct sockaddr*)&addr, sizeof(addr)) != 0) { perror("can't bind port"); abort(); } if(listen(sd, 10) != 0) { perror("Can't configure listening port"); abort(); } return sd; } char *nodehostname(void) { char *hm = malloc(HOST_NAME_MAX); if(!gethostname(hm, HOST_NAME_MAX)) return hm; else { if(hm) free(hm); return NULL; } } static inline int __removechar(char *b, size_t chrs) { char *c = b + chrs; size_t blen = strlen(c) + sizeof(char); memcpy(b, c, blen); return chrs; } int normalize_path(char *path) { char *obuf = path; int cutlen; /* first remove useless / if found */ while((obuf = strchr(obuf, '/'))) { obuf++; while(*obuf == '/') __removechar(obuf, 1); } obuf = path; /* much cleaner now */ while(*obuf != '\0') { if(*obuf == '.' && *(obuf - 1) == '/') { if(!strcmp(obuf, "./")) __removechar(obuf, 2); else if(!strcmp(obuf, "../")) { cutlen = strlen(path) - strlen(obuf); if(cutlen < 4) return -1; else cutlen = 4; obuf -= 2; while(*obuf != '/') { obuf--; cutlen++; } __removechar(obuf, cutlen); } } obuf++; } return 0; }