Annotation of libaitio/src/aitio.c, revision 1.1

1.1     ! misho       1: /*************************************************************************
        !             2: * (C) 2010 AITNET ltd - Sofia/Bulgaria - <misho@aitbg.com>
        !             3: *  by Michael Pounov <misho@openbsd-bg.org>
        !             4: *
        !             5: * $Author: misho $
        !             6: * $Id: aitpwd.c,v 1.1.1.1 2010/02/16 13:18:32 misho Exp $
        !             7: *
        !             8: *************************************************************************/
        !             9: #include "global.h"
        !            10: 
        !            11: 
        !            12: #pragma GCC visibility push(hidden)
        !            13: 
        !            14: int io_Errno;
        !            15: char io_Error[STRSIZ];
        !            16: 
        !            17: #pragma GCC visibility pop
        !            18: 
        !            19: 
        !            20: // io_GetErrno() Get error code of last operation
        !            21: inline int io_GetErrno()
        !            22: {
        !            23:        return io_Errno;
        !            24: }
        !            25: 
        !            26: // io_GetError() Get error text of last operation
        !            27: inline const char *io_GetError()
        !            28: {
        !            29:        return io_Error;
        !            30: }
        !            31: 
        !            32: // io_SetErr() Set error to variables for internal use!!!
        !            33: inline void io_SetErr(int eno, char *estr, ...)
        !            34: {
        !            35:        va_list lst;
        !            36: 
        !            37:        io_Errno = eno;
        !            38:        memset(io_Error, 0, STRSIZ);
        !            39:        va_start(lst, estr);
        !            40:        vsnprintf(io_Error, STRSIZ, estr, lst);
        !            41:        va_end(lst);
        !            42: }
        !            43: 
        !            44: 
        !            45: /*
        !            46:  * ioPromptRead() Read data from input h[0] with prompt to output h[1]
        !            47:  * @h = file handles h[0] = input, h[1] = output, if NULL use stdin, stdout
        !            48:  * @csPrompt = Prompt before input, may be NULL
        !            49:  * @psData = Readed data
        !            50:  * @dataLen = Length of data
        !            51:  * return: 0 EOF; -1 error:: can`t read; >0 count of readed chars
        !            52: */
        !            53: int ioPromptRead(int *h, const char *csPrompt, char * __restrict psData, int dataLen)
        !            54: {
        !            55:        int ok = 0;
        !            56:        FILE *inp, *out;
        !            57:        char szLine[BUFSIZ], *pos;
        !            58: 
        !            59:        if (!psData || !dataLen)
        !            60:                return -1;
        !            61: 
        !            62:        inp = fdopen(!h ? 0 : h[0], "r");
        !            63:        if (!inp) {
        !            64:                LOGERR;
        !            65:                return -1;
        !            66:        }
        !            67:        out = fdopen(!h ? 1 : h[1], "w");
        !            68:        if (!out) {
        !            69:                LOGERR;
        !            70:                return -1;
        !            71:        }
        !            72: 
        !            73:        while (!ok) {
        !            74:                if (csPrompt) {
        !            75:                        fprintf(out, "%s", csPrompt);
        !            76:                        fflush(out);
        !            77:                }
        !            78: 
        !            79:                memset(szLine, 0, BUFSIZ);
        !            80:                if (!fgets(szLine, BUFSIZ, inp)) {
        !            81:                        clearerr(inp);
        !            82:                        fpurge(out);
        !            83:                        fflush(out);
        !            84:                        return 0;
        !            85:                }
        !            86: 
        !            87:                if ((pos = strchr(szLine, '\n')))
        !            88:                        *pos = 0;
        !            89: 
        !            90:                strlcpy(psData, szLine, dataLen);
        !            91:                ok = 1;
        !            92:        }
        !            93: 
        !            94:        return pos - szLine;
        !            95: }
        !            96: 
        !            97: /*
        !            98:  * ioPromptPassword() Read password from input h[0] with prompt to output h[1]
        !            99:  * @h = file handles h[0] = input, h[1] = output, if NULL use stdin, stdout
        !           100:  * @csPrompt = Prompt before input, may be NULL
        !           101:  * @psPass = Readed password
        !           102:  * @passLen = Length of password
        !           103:  * @confirm = Confirm password, 0 - get password, !=0 Ask for confirmation
        !           104:  * return: 0 EOF; -1 error:: can`t read; >0 count of readed chars
        !           105: */
        !           106: int ioPromptPassword(int *h, const char *csPrompt, char * __restrict psPass, int passLen, int confirm)
        !           107: {
        !           108:        int ret, ok = 0;
        !           109:        FILE *inp, *out;
        !           110:        char szLine[2][STRSIZ];
        !           111:        struct sgttyb tty_state;
        !           112: 
        !           113:        if (!psPass || !passLen)
        !           114:                return -1;
        !           115: 
        !           116:        inp = fdopen(!h ? 0 : h[0], "r");
        !           117:        if (!inp) {
        !           118:                LOGERR;
        !           119:                return -1;
        !           120:        }
        !           121:        out = fdopen(!h ? 1 : h[1], "w");
        !           122:        if (!out) {
        !           123:                LOGERR;
        !           124:                return -1;
        !           125:        }
        !           126: 
        !           127:        if (ioctl(fileno(inp), TIOCGETP, &tty_state) == -1) {
        !           128:                LOGERR;
        !           129:                return -1;
        !           130:        } else {
        !           131:                tty_state.sg_flags &= ~ECHO;
        !           132:                if (ioctl(fileno(inp), TIOCSETP, &tty_state) == -1) {
        !           133:                        LOGERR;
        !           134:                        return -1;
        !           135:                }
        !           136:        }
        !           137: 
        !           138:        while (!ok) {
        !           139:                switch ((ret = ioPromptRead(h, (!csPrompt || !*csPrompt) ? "Password:" : csPrompt, 
        !           140:                                                szLine[0], STRSIZ))) {
        !           141:                        case -1:
        !           142:                                LOGERR;
        !           143:                                ok = -1;
        !           144:                        case 0:
        !           145:                                goto next;
        !           146:                }
        !           147:                if (confirm) {
        !           148:                        fprintf(out, "\n");
        !           149:                        fflush(out);
        !           150: 
        !           151:                        switch (ioPromptRead(h, "Password confirm:", szLine[1], STRSIZ)) {
        !           152:                                case -1:
        !           153:                                        LOGERR;
        !           154:                                        ok = -1;
        !           155:                                        goto next;
        !           156:                                case 0:
        !           157:                                default:
        !           158:                                        if (strcmp(szLine[0], szLine[1])) {
        !           159:                                                fprintf(out, "\n\07\07Mismatch - Try again!\n");
        !           160:                                                fflush(out);
        !           161:                                                continue;
        !           162:                                        }
        !           163:                        }
        !           164:                }
        !           165: 
        !           166:                strlcpy(psPass, szLine[0], passLen);
        !           167:                ok = ret;
        !           168:                fprintf(out, "\n");
        !           169:                fflush(out);
        !           170:        }
        !           171: 
        !           172: next:
        !           173:        tty_state.sg_flags |= ECHO;
        !           174:        if (ioctl(fileno(inp), TIOCSETP, &tty_state) == -1) {
        !           175:                LOGERR;
        !           176:                return -1;
        !           177:        }
        !           178: 
        !           179:        return ok;
        !           180: }
        !           181: 
        !           182: /*
        !           183:  * ioRegexVerify() Function for verify data match in regex expression
        !           184:  * @csRegex = Regulare expression pattern
        !           185:  * @csData = Data for check and verify
        !           186:  * @startPos = Return start positions
        !           187:  * @endPos = Return end positions
        !           188:  * return: NULL not match or error; !=NULL begin of matched data
        !           189: */
        !           190: const char *ioRegexVerify(const char *csRegex, const char *csData, int *startPos, int *endPos)
        !           191: {
        !           192:        regex_t re;
        !           193:        regmatch_t match;
        !           194:        char szErr[STRSIZ];
        !           195:        int ret, flg;
        !           196:        const char *pos;
        !           197: 
        !           198:        if (!csRegex || !csData)
        !           199:                return NULL;
        !           200: 
        !           201:        if ((ret = regcomp(&re, csRegex, REG_EXTENDED))) {
        !           202:                regerror(ret, &re, szErr, STRSIZ);
        !           203:                io_SetErr(ret, "Error:: %s\n", szErr);
        !           204:                regfree(&re);
        !           205:                return NULL;
        !           206:        }
        !           207: 
        !           208:        for (ret = flg = 0, pos = csData; !(ret = regexec(&re, pos, 1, &match, flg)); 
        !           209:                        pos += match.rm_eo, flg = REG_NOTBOL) {
        !           210:                if (startPos)
        !           211:                        *startPos = match.rm_so;
        !           212:                if (endPos)
        !           213:                        *endPos = match.rm_eo;
        !           214: 
        !           215:                pos += match.rm_so;
        !           216:                break;
        !           217:        }
        !           218: 
        !           219:        if (ret) {
        !           220:                regerror(ret, &re, szErr, STRSIZ);
        !           221:                io_SetErr(ret, "Error:: %s\n", szErr);
        !           222:                pos = NULL;
        !           223:        }
        !           224: 
        !           225:        regfree(&re);
        !           226:        return pos;
        !           227: }
        !           228: 
        !           229: /*
        !           230:  * ioRegexGet() Function for get data match in regex expression
        !           231:  * @csRegex = Regulare expression pattern
        !           232:  * @csData = Data from get
        !           233:  * @psString = Returned string if match
        !           234:  * @strLen = Length of string
        !           235:  * return: 0 not match; >0 count of returned chars
        !           236: */
        !           237: int ioRegexGet(const char *csRegex, const char *csData, char * __restrict psString, int strLen)
        !           238: {
        !           239:        int sp, ep, len;
        !           240:        const char *str;
        !           241: 
        !           242:        if (!csRegex || !csData)
        !           243:                return -1;
        !           244: 
        !           245:        str = ioRegexVerify(csRegex, csData, &sp, &ep);
        !           246:        if (!str)
        !           247:                return 0;
        !           248: 
        !           249:        len = ep - sp;
        !           250:        if (psString && strLen) {
        !           251:                memset(psString, 0, strLen);
        !           252:                strncpy(psString, str, strLen <= len ? strLen - 1 : len);
        !           253:        }
        !           254: 
        !           255:        return len;
        !           256: }
        !           257: 
        !           258: /*
        !           259:  * ioRegexReplace() Function for replace data match in regex expression with newdata
        !           260:  * @csRegex = Regulare expression pattern
        !           261:  * @csData = Source data
        !           262:  * @csNew = Data for replace
        !           263:  * return: NULL not match or error; !=NULL allocated new string, must be free after use!
        !           264: */
        !           265: char *ioRegexReplace(const char *csRegex, const char *csData, const char *csNew)
        !           266: {
        !           267:        int sp, ep, len;
        !           268:        char *str = NULL;
        !           269: 
        !           270:        if (!csRegex || !csData)
        !           271:                return NULL;
        !           272: 
        !           273:        if (!ioRegexVerify(csRegex, csData, &sp, &ep))
        !           274:                return NULL;
        !           275: 
        !           276:        // ___ before match
        !           277:        len = sp + 1;
        !           278:        str = malloc(len);
        !           279:        if (!str) {
        !           280:                LOGERR;
        !           281:                return NULL;
        !           282:        } else
        !           283:                strlcpy(str, csData, len);
        !           284:        // * replace match *
        !           285:        if (csNew) {
        !           286:                len += strlen(csNew);
        !           287:                str = realloc(str, len);
        !           288:                if (!str) {
        !           289:                        LOGERR;
        !           290:                        return NULL;
        !           291:                } else
        !           292:                        strlcat(str, csNew, len);
        !           293:        }
        !           294:        // after match ___
        !           295:        len += strlen(csData) - ep;
        !           296:        str = realloc(str, len);
        !           297:        if (!str) {
        !           298:                LOGERR;
        !           299:                return NULL;
        !           300:        } else
        !           301:                strlcat(str, csData + ep, len);
        !           302: 
        !           303:        return str;
        !           304: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>