|  | // Copyright 2019 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include <stdlib.h> | 
|  | #include <iostream> | 
|  | #include <string> | 
|  |  | 
|  | namespace { | 
|  |  | 
|  | // Returns the current user username. | 
|  | std::string Username() { | 
|  | const char* username = getenv("USER"); | 
|  | return username ? std::string(username) : std::string(); | 
|  | } | 
|  |  | 
|  | // Writes |string| to |stream| while escaping all C escape sequences. | 
|  | void EscapeString(std::ostream* stream, const std::string& string) { | 
|  | for (char c : string) { | 
|  | switch (c) { | 
|  | case 0: | 
|  | *stream << "\\0"; | 
|  | break; | 
|  | case '\a': | 
|  | *stream << "\\a"; | 
|  | break; | 
|  | case '\b': | 
|  | *stream << "\\b"; | 
|  | break; | 
|  | case '\e': | 
|  | *stream << "\\e"; | 
|  | break; | 
|  | case '\f': | 
|  | *stream << "\\f"; | 
|  | break; | 
|  | case '\n': | 
|  | *stream << "\\n"; | 
|  | break; | 
|  | case '\r': | 
|  | *stream << "\\r"; | 
|  | break; | 
|  | case '\t': | 
|  | *stream << "\\t"; | 
|  | break; | 
|  | case '\v': | 
|  | *stream << "\\v"; | 
|  | break; | 
|  | case '\\': | 
|  | *stream << "\\\\"; | 
|  | break; | 
|  | case '\"': | 
|  | *stream << "\\\""; | 
|  | break; | 
|  | default: | 
|  | *stream << c; | 
|  | break; | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | }  // namespace | 
|  |  | 
|  | int main(int argc, char** argv) { | 
|  | std::string username = Username(); | 
|  |  | 
|  | std::cout << "{\"username\": \""; | 
|  | EscapeString(&std::cout, username); | 
|  | std::cout << "\"}" << std::endl; | 
|  |  | 
|  | return 0; | 
|  | } |