亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
亚洲风情在线资源站| 午夜精品在线看| 欧美亚洲另类激情小说| 卡一卡二国产精品| 久久久综合网站| 91免费观看视频| 久久成人av少妇免费| 中文字幕va一区二区三区| 在线观看免费成人| 激情综合色播激情啊| 亚洲欧美综合色| 欧美一区二区三区不卡| 成人精品免费视频| 日韩精品一级二级| 国产日韩精品一区二区三区| 91福利国产精品| 国产成人在线免费观看| 午夜精品在线视频一区| 国产精品激情偷乱一区二区∴| 欧美伊人久久久久久久久影院| 五月婷婷欧美视频| 亚洲精品在线观看视频| 在线观看国产91| 成人美女视频在线观看18| 日本成人在线电影网| 一区二区三区四区在线免费观看| 精品盗摄一区二区三区| 在线电影国产精品| 91丨porny丨中文| 国产美女精品一区二区三区| 亚洲一区二区在线免费观看视频 | 欧美日韩一卡二卡三卡 | 亚洲日本中文字幕区| 日韩欧美国产三级| 欧美午夜电影一区| 91免费版在线| 99久久精品国产麻豆演员表| 国产精品自在在线| 婷婷夜色潮精品综合在线| 一区二区三区美女| 中文字幕日本乱码精品影院| 久久久精品国产免大香伊 | 国产一区在线不卡| 日本不卡免费在线视频| 偷拍日韩校园综合在线| 亚洲激情综合网| 亚洲色图欧美在线| ...av二区三区久久精品| 国产欧美视频一区二区三区| 久久青草国产手机看片福利盒子 | 欧美精品日韩一区| 欧美日韩一区二区在线观看视频| 97精品电影院| 99久久国产免费看| 色呦呦国产精品| 一本色道久久综合亚洲aⅴ蜜桃 | 国产精品传媒入口麻豆| 国产精品久久午夜夜伦鲁鲁| 国产精品久久午夜| 亚洲色图另类专区| 一卡二卡三卡日韩欧美| 夜夜爽夜夜爽精品视频| 亚洲欧洲一区二区在线播放| 亚洲欧洲成人av每日更新| 中文字幕在线不卡一区 | 亚洲欧美日韩在线不卡| 亚洲视频网在线直播| 久久久久亚洲综合| 国产日产欧产精品推荐色| 欧美国产日韩一二三区| 亚洲欧美一区二区视频| 樱花影视一区二区| 亚洲主播在线观看| 日韩电影在线观看一区| 毛片一区二区三区| 国内成+人亚洲+欧美+综合在线| 精品一区免费av| 成人丝袜高跟foot| 99久久免费国产| 在线观看亚洲成人| 欧美一级一区二区| 久久久精品日韩欧美| 中文字幕日韩av资源站| 亚洲mv大片欧洲mv大片精品| 蜜桃一区二区三区在线观看| 国产一二三精品| 国产91丝袜在线观看| 91丨九色丨蝌蚪富婆spa| 欧美三级中文字幕在线观看| 日韩西西人体444www| 国产午夜精品一区二区三区嫩草| 亚洲少妇最新在线视频| 爽爽淫人综合网网站 | 美女精品自拍一二三四| 成人性生交大片| 精品1区2区3区| 精品福利一二区| 亚洲欧美另类久久久精品| 一区二区三区四区在线| 麻豆成人免费电影| av网站免费线看精品| 这里是久久伊人| 国产精品视频一二三| 日韩精品乱码免费| 国产91精品精华液一区二区三区| 欧美亚洲综合一区| 精品黑人一区二区三区久久| 国产精品女人毛片| 肉肉av福利一精品导航| 丁香另类激情小说| 欧美一区二区三区在线观看视频| 国产精品丝袜久久久久久app| 丝袜亚洲另类欧美| 99久久婷婷国产综合精品电影 | 国产69精品一区二区亚洲孕妇| 欧美日韩亚洲综合一区| 中文字幕+乱码+中文字幕一区| 亚洲成a人片综合在线| 国产成人在线色| 日韩一区二区三区av| 亚洲日本va在线观看| 国产一区二区三区不卡在线观看| 日本二三区不卡| 欧美国产一区二区| 激情小说欧美图片| 4438x成人网最大色成网站| 中文字幕国产一区二区| 美女网站一区二区| 欧美午夜宅男影院| 国产精品国产成人国产三级| 精品中文字幕一区二区| 欧美日韩免费电影| 亚洲免费观看高清在线观看| 成人免费av资源| 国产亚洲美州欧州综合国| 视频一区二区三区在线| 色综合天天在线| 国产精品免费看片| 国产裸体歌舞团一区二区| 日韩午夜在线观看| 日本在线观看不卡视频| 在线电影一区二区三区| 婷婷激情综合网| 欧美久久免费观看| 亚洲国产aⅴ天堂久久| 在线一区二区三区四区五区 | 亚洲成人一区二区| 欧美在线999| 亚洲电影欧美电影有声小说| 欧洲精品视频在线观看| 亚洲午夜日本在线观看| 色狠狠综合天天综合综合| 国产情人综合久久777777| 国产老女人精品毛片久久| 2021中文字幕一区亚洲| 久久66热偷产精品| 久久美女高清视频| 99久久精品情趣| 亚洲国产日日夜夜| 日韩久久久精品| 成人av在线一区二区| 亚洲成人在线免费| 欧美电视剧在线看免费| 国产精品一区二区视频| 亚洲欧美日本韩国| 88在线观看91蜜桃国自产| 国产在线播放一区| 亚洲男人天堂av网| 91.com在线观看| 国产成人av网站| 亚洲一区日韩精品中文字幕| 日韩欧美黄色影院| 成人aaaa免费全部观看| 亚洲高清视频的网址| 久久综合五月天婷婷伊人| 91蝌蚪porny九色| 男女视频一区二区| 国产精品国产三级国产三级人妇| 一本久久a久久精品亚洲| 美脚の诱脚舐め脚责91| 国产精品视频观看| 欧美一区二区在线视频| 不卡影院免费观看| 蜜桃精品在线观看| 综合欧美亚洲日本| 欧美v日韩v国产v| 色av一区二区| 国产成人aaaa| 日本午夜一本久久久综合| 国产精品不卡在线观看| 在线成人av网站| 99免费精品在线| 久久不见久久见中文字幕免费| 亚洲欧美成人一区二区三区| 精品国产乱码久久久久久1区2区 | 国产成人av电影在线播放| 久久精品在这里| 99riav久久精品riav| 欧美丰满美乳xxx高潮www| 久久久影院官网|