亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? tftp_server_linux.c

?? linux下的tftp源代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:

*
* Copyright (c) 1983 Regents of the University of California.
* All rights reserved.
*
* Redistribution and use in source and binary forms are permitted
* provided that the above copyright notice and this paragraph are
* duplicated in all such forms and that any documentation,
* advertising materials, and other materials related to such
* distribution and use acknowledge that the software was developed
* by the University of California, Berkeley.  The name of the
* University may not be used to endorse or promote products derived
* from this software without specific prior written permission.
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/

#ifndef lint
char copyright[] =
"@(#) Copyright (c) 1983 Regents of the University of California.\n\
All rights reserved.\n";
#endif /* not lint */

#ifndef lint
static char sccsid[] = "@(#)tftpd.c    5.8 (Berkeley) 6/18/88";
#endif /* not lint */

/*
* Trivial file transfer protocol server.
*
* This version includes many modifications by Jim Guyton <guyton@rand-unix>
*
* Further modifications by Markus Gutschke <gutschk@math.uni-muenster.de>
*  - RFC1782 option parsing
*  - RFC1783 extended blocksize
*  - "-c" option for changing the root directory
*  - "-d" option for debugging output
*/

#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <sys/wait.h>
#include <sys/stat.h>

#include <netinet/in.h>

#include <arpa/tftp.h>

#include <alloca.h>
#include <string.h>
#include <signal.h>
#include <stdio.h>
#include <errno.h>
#include <ctype.h>
#include <netdb.h>
#include <setjmp.h>
#include <syslog.h>

#define    TIMEOUT        5

#ifndef    OACK
#define    OACK    06
#endif

#ifndef EOPTNEG
#define    EOPTNEG    8
#endif

extern    int errno;
struct    sockaddr_in sin = { AF_INET };
int    peer;
int    rexmtval = TIMEOUT;
int    maxtimeout = 5*TIMEOUT;

#define    PKTSIZE    (1432+4) /* SEGSIZE+4 */
int    segsize = SEGSIZE;
char    buf[PKTSIZE];
char    ackbuf[PKTSIZE];
struct    sockaddr_in from;
int    fromlen;

char    *rootdir = NULL;
int    debug = 0;

struct filters {
    struct filters *next;
    char           *fname;
} *filters = NULL;
int     isfilter = 0;

main(argc, argv)
    char *argv[];
{
    register struct tftphdr *tp;
    register int n;
    int on = 1;
    extern int optind;
    extern char *optarg;

    openlog(argv[0], LOG_PID, LOG_DAEMON);

    while ((n = getopt(argc, argv, "c:dr:")) >= 0) {
        switch (n) {
        case 'c':
            if (rootdir)
                goto usage;
            rootdir = optarg;
            break;
        case 'd':
            debug++;
            break;
        case 'r': {
            struct filters *fp = (void *)
                             malloc(sizeof(struct filters) +
                            strlen(optarg) + 1);
            fp->next  = filters;
            fp->fname = (char *)(fp + 1);
            strcpy(fp->fname, optarg);
            filters   = fp;
            break; }
        default:
        usage:
            syslog(LOG_ERR, "Usage: %s [-c chroot] "
                   "[-r readfilter] [-d]\n",
                   argv[0]);
            exit(1);
        }
    }
    if (argc-optind != 0)
        goto usage;

    ioctl(0, FIONBIO, &on);
/*    if (ioctl(0, FIONBIO, &on) < 0) {
        syslog(LOG_ERR, "ioctl(FIONBIO): %m\n");
        exit(1);
    }
*/
    fromlen = sizeof (from);
    n = recvfrom(0, buf, segsize+4, 0,
        (struct sockaddr *)&from, &fromlen);
    if (n < 0) {
        syslog(LOG_ERR, "recvfrom: %m\n");
        exit(1);
    }
    /*
     * Now that we have read the message out of the UDP
     * socket, we fork and exit.  Thus, inetd will go back
     * to listening to the tftp port, and the next request
     * to come in will start up a new instance of tftpd.
     *
     * We do this so that inetd can run tftpd in "wait" mode.
     * The problem with tftpd running in "nowait" mode is that
     * inetd may get one or more successful "selects" on the
     * tftp port before we do our receive, so more than one
     * instance of tftpd may be started up.  Worse, if tftpd
     * break before doing the above "recvfrom", inetd would
     * spawn endless instances, clogging the system.
     */
    {
        int pid;
        int i, j;

        for (i = 1; i < 20; i++) {
            pid = fork();
            if (pid < 0) {
                sleep(i);
                /*
                 * flush out to most recently sent request.
                 *
                 * This may drop some request, but those
                 * will be resent by the clients when
                 * they timeout.  The positive effect of
                 * this flush is to (try to) prevent more
                 * than one tftpd being started up to service
                 * a single request from a single client.
                 */
                j = sizeof from;
                i = recvfrom(0, buf, segsize+4, 0,
                    (struct sockaddr *)&from, &j);
                if (i > 0) {
                    n = i;
                    fromlen = j;
                }
            } else {
                break;
            }
        }
        if (pid < 0) {
            syslog(LOG_ERR, "fork: %m\n");
            exit(1);
        } else if (pid != 0) {
            exit(0);
        }
    }
    from.sin_family = AF_INET;
    alarm(0);
    close(0);
    close(1);
    peer = socket(AF_INET, SOCK_DGRAM, 0);
    if (peer < 0) {
        syslog(LOG_ERR, "socket: %m\n");
        exit(1);
    }
    if (bind(peer, (struct sockaddr *)&sin, sizeof (sin)) < 0) {
        syslog(LOG_ERR, "bind: %m\n");
        exit(1);
    }
    if (connect(peer, (struct sockaddr *)&from, sizeof(from)) < 0) {
        syslog(LOG_ERR, "connect: %m\n");
        exit(1);
    }
    tp = (struct tftphdr *)buf;
    tp->th_opcode = ntohs(tp->th_opcode);
    if (tp->th_opcode == RRQ || tp->th_opcode == WRQ)
        tftp(tp, n);
    exit(1);
}

int    validate_access();
int    sendfile(), recvfile();

struct formats {
    char    *f_mode;
    int    (*f_validate)();
    int    (*f_send)();
    int    (*f_recv)();
    int    f_convert;
} formats[] = {
    { "netascii",    validate_access,    sendfile,    recvfile, 1 },
    { "octet",    validate_access,    sendfile,    recvfile, 0 },
#ifdef notdef
    { "mail",    validate_user,        sendmail,    recvmail, 1 },
#endif
    { 0 }
};

int    set_blksize();

struct options {
    char    *o_opt;
    int    (*o_fnc)();
} options[] = {
    { "blksize",    set_blksize },
    { 0 }
};

/*
* Set a non-standard block size (c.f. RFC1783)
*/

set_blksize(val, ret)
    char *val;
    char **ret;
{
    static char b_ret[5];
    int sz = atoi(val);

    if (sz < 8) {
        if (debug)
            syslog(LOG_ERR, "Requested packetsize %d < 8\n", sz);
        return(0);
    } else if (sz > PKTSIZE-4) {
        if (debug)
            syslog(LOG_INFO, "Requested packetsize %d > %d\n",
                   sz, PKTSIZE-4);
        sz = PKTSIZE-4;
    } else if (debug)
        syslog(LOG_INFO, "Adjusted packetsize to %d octets\n", sz);
   
    segsize = sz;
    sprintf(*ret = b_ret, "%d", sz);
    return(1);
}

/*
* Parse RFC1782 style options
*/

do_opt(opt, val, ap)
    char *opt;
    char *val;
    char **ap;
{
    struct options *po;
    char *ret;

    for (po = options; po->o_opt; po++)
        if (strcasecmp(po->o_opt, opt) == 0) {
            if (po->o_fnc(val, &ret)) {
                if (*ap + strlen(opt) + strlen(ret) + 2 >=
                    ackbuf + sizeof(ackbuf)) {
                    if (debug)
                        syslog(LOG_ERR,
                               "Ackbuf overflow\n");
                    nak(ENOSPACE);
                    exit(1);
                }
                *ap = strrchr(strcpy(strrchr(strcpy(*ap, opt),
                                 '\000')+1, val),
                          '\000')+1;
            } else {
                nak(EOPTNEG);
                exit(1);
            }
            break;
        }
    if (debug && !po->o_opt)
        syslog(LOG_WARNING, "Unhandled option: %d = %d\n", opt, val);
    return;
}

/*
* Handle initial connection protocol.
*/
tftp(tp, size)
    struct tftphdr *tp;
    int size;
{
    register char *cp;
    int argn = 0, ecode;
    register struct formats *pf;
    char *filename, *mode;
    char *val, *opt;
    char *ap = ackbuf+2;
    int  isopts;

    ((struct tftphdr *)ackbuf)->th_opcode = ntohs(OACK);
    filename = cp = tp->th_stuff;
again:
    while (cp < buf + size) {
        if (*cp == '\0')
            break;
        cp++;
    }
    if (*cp != '\0') {
        if (debug)
            syslog(LOG_WARNING, "Received illegal request\n");
        nak(EBADOP);
        exit(1);
    }
    if (!argn++) {
        mode = ++cp;
        goto again;
    } else {
        if (debug && argn == 3)
            syslog(LOG_INFO, "Found RFC1782 style options\n");
        *(argn & 1 ? &val : &opt) = ++cp;
        if (argn & 1)
            do_opt(opt, val, &ap);
        if (cp < buf + size && *cp != '\000')
            goto again;
    }
   
    for (cp = mode; *cp; cp++)
        if (isupper(*cp))
            *cp = tolower(*cp);
    for (pf = formats; pf->f_mode; pf++)
        if (strcmp(pf->f_mode, mode) == 0)
            break;
    if (pf->f_mode == 0) {
        if (debug)
            syslog(LOG_WARNING, "Unknown data format: %s\n", mode);
        nak(EBADOP);
        exit(1);
    }

    if (rootdir) {
        cp = alloca(strlen(rootdir) + strlen(filename) + 1);
        if (cp == NULL) {
            nak(100+ENOMEM);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色88888久久久久久影院按摩| 香蕉久久夜色精品国产使用方法| 在线成人免费视频| 色噜噜狠狠成人网p站| 91免费观看视频在线| 成人av网站大全| 色网综合在线观看| 欧美色涩在线第一页| 欧美日韩国产另类不卡| 91精选在线观看| 精品毛片乱码1区2区3区| 久久综合久色欧美综合狠狠| 久久久久青草大香线综合精品| 久久精品视频网| 亚洲三级在线免费观看| 亚洲一区免费视频| 蜜臀va亚洲va欧美va天堂| 美女视频一区二区三区| 国产91富婆露脸刺激对白| 91在线精品一区二区| 欧美日本国产视频| wwwwww.欧美系列| 成人免费一区二区三区在线观看| 一区二区三区影院| 免费观看日韩av| 成人一区二区三区| 欧美性大战xxxxx久久久| 日韩欧美国产一区二区三区| 国产精品素人视频| 午夜精品久久久久久久久久久| 免费成人在线网站| 白白色 亚洲乱淫| 91精品国产综合久久香蕉的特点 | 精品国产免费视频| 国产精品久久久久影院色老大| 亚洲一区电影777| 国产一区二区久久| 91美女在线看| 久久这里都是精品| 舔着乳尖日韩一区| 成人动漫在线一区| 日韩精品一区二区三区四区视频| 中文字幕一区二区三区视频| 久久99精品国产| 欧洲精品在线观看| 中文字幕精品一区二区精品绿巨人| 亚洲免费大片在线观看| 国产一区二区三区久久悠悠色av| 91久久香蕉国产日韩欧美9色| 久久一留热品黄| 日本亚洲欧美天堂免费| 日本韩国欧美三级| 欧美国产激情二区三区| 久久成人精品无人区| 欧美日韩一区 二区 三区 久久精品| 欧美国产日韩亚洲一区| 久久99国产精品免费| 欧美精品亚洲一区二区在线播放| ㊣最新国产の精品bt伙计久久| 国内精品嫩模私拍在线| 日韩一区二区三区电影在线观看| 一区二区三区高清| 99综合电影在线视频| 2020国产精品久久精品美国| 日韩制服丝袜av| 欧美日韩免费一区二区三区 | 亚洲精品乱码久久久久久黑人| 狠狠久久亚洲欧美| 日韩写真欧美这视频| 日韩vs国产vs欧美| 欧美一区二区三区啪啪| 日韩中文字幕av电影| 555www色欧美视频| 日本系列欧美系列| 日韩一区二区在线看片| 美女精品自拍一二三四| 日韩亚洲欧美在线观看| 久久99精品久久久久久| 久久青草国产手机看片福利盒子 | 99热这里都是精品| 综合激情网...| 色婷婷久久综合| 亚洲午夜羞羞片| 欧美日韩久久一区二区| 日韩成人av影视| 26uuu精品一区二区三区四区在线 26uuu精品一区二区在线观看 | 亚瑟在线精品视频| 欧美美女一区二区三区| 日韩和欧美一区二区三区| 日韩欧美一区在线| 日本韩国欧美三级| 午夜精品福利视频网站| 欧美日韩美女一区二区| 国内精品伊人久久久久av一坑| 久久久亚洲国产美女国产盗摄| 东方aⅴ免费观看久久av| 国产精品网站在线| 欧美色精品在线视频| 免费看日韩a级影片| 国产精品三级av在线播放| 91免费视频观看| 日本va欧美va欧美va精品| 久久人人爽爽爽人久久久| 99久久国产综合精品女不卡 | 日韩一级成人av| 国产成人av电影在线观看| 国产精品久久久久久久岛一牛影视| 在线影视一区二区三区| 久久国内精品视频| 亚洲人成精品久久久久| 欧美成人伊人久久综合网| 成人小视频免费在线观看| 亚洲成人av电影| 国产三级一区二区| 欧美福利电影网| 成人激情av网| 久久精品国产精品亚洲精品| 亚洲欧美日韩成人高清在线一区| 3d成人动漫网站| 色婷婷久久一区二区三区麻豆| 久久精品国产成人一区二区三区| 亚洲欧美另类久久久精品2019| 日韩免费视频一区二区| 欧美一a一片一级一片| 高潮精品一区videoshd| 日本不卡一二三区黄网| 亚洲女爱视频在线| 欧美激情一区二区三区| 欧美大片免费久久精品三p| 欧美性一级生活| 色婷婷亚洲综合| av电影在线观看不卡| 国产一区二区在线看| 蜜臀久久99精品久久久久宅男| 亚洲精品一卡二卡| 国产精品久久久久影院| 久久夜色精品国产噜噜av| 日韩视频免费直播| 制服.丝袜.亚洲.另类.中文| 欧美视频中文字幕| 91美女精品福利| 99r国产精品| 9l国产精品久久久久麻豆| 成人在线视频一区二区| 国产精品18久久久| 黑人巨大精品欧美一区| 国产在线精品国自产拍免费| 久久99精品网久久| 久久国产尿小便嘘嘘尿| 久久精品国产77777蜜臀| 狠狠色丁香久久婷婷综合_中| 麻豆91精品视频| 美女免费视频一区二区| 久久99久久久久| 精品一区二区三区影院在线午夜 | 日韩黄色免费电影| 婷婷开心激情综合| 午夜激情综合网| 蜜乳av一区二区| 国产一区二区三区不卡在线观看| 国产一区二区在线电影| 国产福利精品一区二区| 成人免费视频app| 色拍拍在线精品视频8848| 欧洲日韩一区二区三区| 欧美日韩电影在线| 日韩欧美成人一区二区| 久久精品水蜜桃av综合天堂| 国产精品久久三区| 亚洲一区二区三区四区的| 视频一区中文字幕| 国产在线视频精品一区| 成人一级视频在线观看| 欧美性淫爽ww久久久久无| 日韩欧美久久久| 国产精品乱码一区二三区小蝌蚪| 亚洲免费观看在线视频| 丝袜脚交一区二区| 国产乱理伦片在线观看夜一区 | 伊人色综合久久天天| 日韩成人一级大片| 国产99久久久国产精品| 欧美亚洲动漫精品| 久久亚洲精精品中文字幕早川悠里| 中文字幕av在线一区二区三区| 亚洲精品视频在线观看网站| 美国精品在线观看| 97se亚洲国产综合自在线观| 欧美精品乱码久久久久久按摩 | 7777精品伊人久久久大香线蕉完整版 | 亚洲成人先锋电影| 国产一区二区在线免费观看| 色丁香久综合在线久综合在线观看| 91精品国产综合久久国产大片| 欧美激情一区二区三区全黄| 日韩不卡一区二区| 色婷婷久久99综合精品jk白丝| 日韩免费看网站| 亚洲午夜一区二区| eeuss鲁一区二区三区|