On Wed, Nov 28, 2007 at 01:21:42PM +0300, Dmitriy Khanzhin wrote: > Alexey Tourbin пишет: > > On Wed, Nov 28, 2007 at 12:57:38PM +0300, Dmitriy Khanzhin wrote: > > Вы что сделать-то хотите? Чтобы gcc не выдавал warning? > > Я хочу понять, как оно работает, и сделать, чтобы не было warning'а и > что-бы работало. Вы не рубите. Почитайте книжку называется "Си" авторы Керниган и Ритчи. > > Короче лучше используйте snprintf, там ошибиться сложнее что к чему. > > > > Но snprintf это интерпретатор, теряется ЭФФЕККТИВНОСТЬ КОДА!! > > > Патч с применением snprintf я показывал вчера > http://lists.altlinux.org/pipermail/devel/attachments/20071127/72869196/attachment.ksh > --- ppp-2.4.4/pppd/plugins/radius/clientid.c.orig 2007-09-29 16:38:20 +0400 > +++ ppp-2.4.4/pppd/plugins/radius/clientid.c 2007-11-27 09:08:24 +0300 > @@ -104,18 +104,29 @@ > UINT4 rc_map2id(char *name) > { > struct map2id_s *p; > - char ttyname[PATH_MAX]; > + char *ttyname; > + int ttyname_len=0; > + char prefix_dev[6]; > > - *ttyname = '\0'; > - if (*name != '/') > - strcpy(ttyname, "/dev/"); > - > - strncat(ttyname, name, sizeof(ttyname)); > + *prefix_dev = ""; > + ttyname_len = strlen(name)+1; > + > + if (*name != '/') { > + *prefix_dev = "/dev/"; Не беритесь, не беритесь, не беритесь за то чего Вы не понимаете. > + ttyname_len = ttyname_len+strlen(prefix_dev); > + } > + > + ttyname = calloc(ttyname_len, sizeof(char)); > + snprintf(ttyname, ttyname_len, "%s%s", prefix_dev, name); > > for(p = map2id_list; p; p = p->next) > - if (!strcmp(ttyname, p->name)) return p->id; > + if (!strcmp(ttyname, p->name)) { > + free(ttyname); > + return p->id; > + } > > warn("rc_map2id: can't find tty %s in map database", ttyname); > > + free(ttyname); > return 0; > }