ln: fix buffer checks, remove stdio, shrink
authorAlan Cox <alan@linux.intel.com>
Wed, 20 May 2015 22:29:54 +0000 (23:29 +0100)
committerAlan Cox <alan@linux.intel.com>
Wed, 20 May 2015 22:29:54 +0000 (23:29 +0100)
Lots more memory saved

Applications/util/ln.c

index 01b2b16..3a5cbdb 100644 (file)
 
 #define PATHLEN 512
 
+static void writes(int fd, const char *s)
+{
+    write(fd, s, strlen(s));
+}
 
 /*
  * Return TRUE if name is a directory.
@@ -45,17 +49,16 @@ char *buildname(char *dirname, char *filename)
     char *cp;
     static char buf[PATHLEN];
 
-    if ((dirname == NULL) || (*dirname == '\0'))
+    if (dirname == NULL || *dirname == '\0')
        return filename;
 
     cp = strrchr(filename, '/');
     if (cp)
        filename = cp + 1;
 
-    /* FIXME: overflow check */
-    strcpy(buf, dirname);
-    strcat(buf, "/");
-    strcat(buf, filename);
+    strlcpy(buf, dirname, PATHLEN);
+    strlcat(buf, "/", PATHLEN);
+    strlcat(buf, filename, PATHLEN);
 
     return buf;
 }
@@ -72,7 +75,8 @@ int main(int argc, char *argv[])
 #if defined(S_ISLNK) && 0      /* FIXME */
        if (strcmp(argv[1], "-s") == 0) {
            if (argc != 4) {
-               fprintf(stderr, "%s: wrong number of arguments for symbolic link\n", argv[0]);
+               writes(2, argv[0]);
+               writes(2, ": wrong number of arguments for symbolic link\n");
                return 1;
            }
 
@@ -84,7 +88,10 @@ int main(int argc, char *argv[])
 
        }
 #endif
-       fprintf(stderr, "%s: unknown option %s\n", argv[0], argv[1]);
+       writes(2, argv[0]);
+       writes(2, ": unknown option ");
+       writes(2, argv[1]);
+       write(2, "\n", 1);
        return 1;
     }
 
@@ -94,7 +101,8 @@ int main(int argc, char *argv[])
     dirflag = isadir(lastarg);
 
     if ((argc > 3) && !dirflag) {
-        fprintf(stderr, "%s: not a directory\n", lastarg);
+        writes(2, lastarg);
+        writes(2, ": not a directory\n");
        return 1;
     }