<div>Hi. </div><div> </div><div>When I adding --preserve=context option into cp --preserve, found some abnormal behavior.</div><div>So, try to share with you and want to find right way or modification.</div><div> </div><div>Internally, --preserve uses comma_scan() function on parsing attributes.</div><div>But I guess it can't cover the string without last comma.</div><div>like, "cp --preserve=timestamps,mode" or "cp --preserve=timestamps"</div><div> </div><div> </div><div>This will display "bad --preserve=mode" or "bad --preserve=timestamps"</div><div> </div><div>Furthur, I can't understand well the logic parsing first letter of attributes.</div><div>if I execute "cp --preserve=mota", it also goes error.</div><div> </div><div> </div><div> </div><div> </div><div>340   if (CFG_CP_PRESERVE && TT.c.preserve) {<br>341     char *pre = xstrdup(TT.c.preserve), *s;<br>342 <br>343     if (comma_scan(pre, "all", 1)) TT.pflags = ~0;<br>344     else {                                                                                      // <-- I just added this for test. and if all string is catched, I think we do not need to dig more.<br>345       for (i=0; i<ARRAY_LEN(preserve); i++)<br>346         if (comma_scan(pre, preserve[i], 1)) TT.pflags |= 1<<i;<br>347       if (*pre) {                                                                           <br>348 <br>349         // Try to interpret as letters, commas won't set anything this doesn't.<br>350         for (s = TT.c.preserve; *s; s++) {                                        // <-- if have *pre ( in short this means remained string without seperating comma), try to compare character on by on from original input (TT.c.preserve)</div><div>                                                                                                          // I guess, this code allow the combination of first letter format (like mota) and full name format(like mode,timestamps), right ? </div><div>                                                                                                          // For example, "cp --preserve=timestamps,m". this uses both of full name format and first letter format. I just wonder Rob's intention.</div><div>                                                                                                          // Which usage is correct and can be supported?<br>351           printf("*s :%s\n", s);<br>352           for (i=0; i<ARRAY_LEN(preserve); i++)<br>353             if (*s == *preserve[i]) TT.pflags |= 1<<i;<br>354           if (i == ARRAY_LEN(preserve)) {<br>355             if (*s == 'a') TT.pflags = ~0;<br>356             else break;                                                                      // this compare one character with each "m/o/t/a". *s it just only the first letter of user input. if failed to comparing with 'a', breaked. Is it right?</div><div>                                                                                                           // How can arrive next character if have a string example "mot". this has no 'a'. just will be compared by m only then breaked.<br>7           }<br>358         }<br>359 <br>360         if (*s) error_exit("bad --preserve=%s", pre);<br>361       }<br>362     }<br>363     free(pre);<br>364   }</div>